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

相关推荐
晨曦中的暮雨8 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
文丑颜不良啊10 小时前
LeetCode876~900题目解析
java·leetcode
aloha_78910 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观11 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅11 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff12 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
FinelyYang13 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能
hhhjhl13 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
用户31268748772014 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java