Java使用(Poi-tl) 在word(docx)中指定位置插入图片
Poi-tl 简介
Poi-tl 是基于 Apache POI 的 Java 开源文档处理库,专注于高效操作 Word 文档(.docx 格式)。它通过模板引擎机制简化复杂文档生成流程,相比原生 POI 具备更简洁的 API、更强的灵活性和更优的性能表现,广泛应用于报表生成、合同模板填充、文档批量处理等企业级场景。
Maven 依赖配置
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
</dependency>
Poi-tl 实现原理与步骤
1. 模板标签规范
在 Word 模板中需使用特定格式的占位符标识图片插入位置,标准格式为:{{@标签名称}}。
示例标签格式:
{{@Head}} <!-- 审核人签名位置 -->
{{@Approver}} <!-- 批准人签名位置 -->
2.完整实现代码
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(); // 生成图片渲染实体
}
}