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.效果展示

相关推荐
凡人叶枫6 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯6 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
NE_STOP6 小时前
Raft算法处理细节
java
努力攻坚操作系统6 小时前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
慧一居士6 小时前
对比两个文件内容是否完全一致,java实现示例
java
再写一行代码就下班7 小时前
Cursor配置Java环境、创建Spring Boot项目的步骤
java·开发语言·spring boot
摇滚侠7 小时前
Java 零基础全套教程,类的加载过程与类加载器的理解,笔记 189
java·后端·intellij-idea
kong@react7 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
未若君雅裁7 小时前
JVM 运行时数据区:程序计数器、堆、虚拟机栈与栈帧
java·jvm
凡人叶枫8 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++