Java在word中指定位置插入图片。

Java使用(Poi-tl) 在word(docx)中指定位置插入图片

  • [Poi-tl 简介](#Poi-tl 简介)
  • [Maven 依赖配置](#Maven 依赖配置)
  • [Poi-tl 实现原理与步骤](#Poi-tl 实现原理与步骤)

Poi-tl 简介

Poi-tl 是基于 Apache POI 的 Java 开源文档处理库,专注于高效操作 Word 文档(.docx 格式)。它通过模板引擎机制简化复杂文档生成流程,相比原生 POI 具备更简洁的 API、更强的灵活性和更优的性能表现,广泛应用于报表生成、合同模板填充、文档批量处理等企业级场景。

Maven 依赖配置

java 复制代码
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.0</version>
</dependency>

Poi-tl 实现原理与步骤

1. 模板标签规范

在 Word 模板中需使用特定格式的占位符标识图片插入位置,标准格式为:{{@标签名称}}。

示例标签格式:

java 复制代码
{{@Head}}  <!-- 审核人签名位置 -->
{{@Approver}}  <!-- 批准人签名位置 -->

2.完整实现代码

java 复制代码
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.Map;

/**
 * Word文档图片插入工具类
 * 功能:通过Poi-tl在Word模板指定位置插入图片
 */
public class WordImageInserter {

    /**
     * 主方法:执行Word图片插入操作
     */
    public static void main(String[] args) {
        Path templatePath = Path.of("D:\\template.docx");        // 源文档模板路径
        Path outputPath= Path.of("D:\\template_temp.docx"); // 新文件路径
        Path inspectorImagePath = Path.of("D:\\signatures\\inspector.png"); // 审核人签名图片
        Path approverImagePath = Path.of("D:\\signatures\\approver.png");   // 批准人签名图片

        try {
            // 绑定模板占位符与图片渲染对象
            Map<String, Object> dataModel = new HashMap<>();
            dataModel.put("Head", createPicture(inspectorImagePath, 100, 50));     // 替换{{@Head}}标签
            dataModel.put("Approver", createPicture(approverImagePath, 100, 50)); // 替换{{@Approver}}标签

            // 执行文档渲染与图片插入
            try (InputStream templateStream = Files.newInputStream(templatePath);
                 OutputStream tempOutputStream = Files.newOutputStream(tempOutputPath)) {

                // 编译模板并渲染数据
                XWPFTemplate template = XWPFTemplate.compile(templateStream).render(dataModel);
                
                // 输出到临时文件(避免直接修改原文件导致损坏)
                template.write(tempOutputStream);
                template.close();
            }

            // 原子性替换原文件(保证操作完整性)
            Files.move(tempOutputPath, templatePath, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("图片插入操作完成,文档已更新");

        } catch (IOException e) {
            System.err.println("文档处理异常:" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 构建图片渲染对象(支持尺寸自定义)
     * @param imagePath 图片文件路径
     * @param width 图片宽度(像素)
     * @param height 图片高度(像素)
     * @return 图片渲染对象(可直接用于模板渲染)
     * @throws IOException 图片读取失败时抛出
     */
    private static Object createPicture(Path imagePath, int width, int height) throws IOException {
        // 使用NIO流加载图片,自动识别图片类型(此处显式指定为PNG)
        return Pictures.ofStream(Files.newInputStream(imagePath), PictureType.PNG)
                .size(width, height)  // 自定义图片尺寸
                .create();           // 生成图片渲染实体
    }
}

3.效果展示

相关推荐
猫猫的小茶馆14 分钟前
【STM32】FreeRTOS 任务的删除(三)
java·linux·stm32·单片机·嵌入式硬件·mcu·51单片机
天天摸鱼的java工程师19 分钟前
🔧 MySQL 索引的设计原则有哪些?【原理 + 业务场景实战】
java·后端·面试
空影学Java36 分钟前
Day44 Java数组08 冒泡排序
java
追风少年浪子彦1 小时前
mybatis-plus实体类主键生成策略
java·数据库·spring·mybatis·mybatis-plus
创码小奇客1 小时前
Talos 使用全攻略:从基础到高阶,常见问题一网打尽
java·后端·架构
jackzhuoa2 小时前
java小白闯关记第一天(两个数相加)
java·算法·蓝桥杯·期末
Rover.x2 小时前
内存泄漏问题排查
java·linux·服务器·缓存
midsummer_woo2 小时前
基于spring boot的纺织品企业财务管理系统(源码+论文)
java·spring boot·后端
zc-code3 小时前
Spring Boot + @RefreshScope:动态刷新配置的终极指南
java·spring boot·后端
何中应3 小时前
EasyExcel使用(二:写出)
java·后端·maven·excel