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

相关推荐
Halo_tjn3 分钟前
Java Set集合相关知识点
java·开发语言·算法
Linsk8 分钟前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
许彰午22 分钟前
我手写了一个 Java 内存数据库(二):B+ 树的插入与分裂
java·开发语言·面试
zhouwy11323 分钟前
Java 快速入门笔记:从基础语法到 Spring Boot 实战
java
极创信息1 小时前
信创产品认证怎么做?信创产品测试认证的主要流程
java·大数据·数据库·金融·软件工程
SamDeepThinking1 小时前
并发量就算只有2,该上锁还得上呀
java·后端·架构
Sam_Deep_Thinking1 小时前
如何让订单系统和营销系统解耦
java·架构·系统架构
lzhdim2 小时前
SQL 入门 12:SQL 视图:创建、修改与可更新视图
java·大数据·服务器·数据库·sql
FQNmxDG4S3 小时前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
傻瓜搬砖人3 小时前
Spring集成Web环境
java·spring·maven