业务背景
在本项目中,用户通过微信小程序进行在线签字。用户的签字图片需要自动合成到合同的指定签字位置上,并保存为PDF格式。
Apache PDFBox 简介
Apache PDFBox 是一个用于处理PDF文档的开源Java库。它提供了丰富的API来创建新的PDF文档、修改现有文档,以及从PDF中提取内容。PDFBox 的主要功能包括:
- 创建和修改PDF文档
- 提取文本和图像
- 处理表单和注释
- 合并和拆分PDF文档
Maven依赖
在项目的pom.xml文件中,添加以下Maven依赖来使用Apache PDFBox:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
核心代码示例
下面的示例代码展示了如何将图像插入到PDF文档的指定位置:
public static void insertImageIntoPdf(File sourcePdf, File targetPdf, int pageIndex,
Point2D.Float position, String imagePath,
Float desiredWidth, Float desiredHeight) throws IOException {
try (PDDocument document = PDDocument.load(sourcePdf)) { // 加载原始PDF文档
// 获取指定索引的页面,pageIndex从0开始计数
PDPage page = document.getPage(pageIndex);
// 从调整后的图片中创建PDF支持的图像对象
PDImageXObject image = LosslessFactory.createFromImage(document, ImageIO.read(new File(imagePath)));
// 获取图片原始尺寸
float originalWidth = image.getWidth();
float originalHeight = image.getHeight();
// 计算图片的新尺寸,如果指定了desiredWidth或desiredHeight则进行调整,同时保持原始比例
float scaleX = (desiredWidth != null) ? desiredWidth / originalWidth : 1f;
float scaleY = (desiredHeight != null) ? desiredHeight / originalHeight : 1f;
// 如果只设置了宽度或高度,则自动调整另一个维度以保持比例
if (desiredWidth == null && desiredHeight != null) {
scaleX = scaleY;
} else if (desiredWidth != null && desiredHeight == null) {
scaleY = scaleX;
}
// 计算调整后的宽度和高度
float newWidth = originalWidth * scaleX;
float newHeight = originalHeight * scaleY;
// 创建内容流,用于在页面上绘制图像
try (PDPageContentStream contentStream = new PDPageContentStream(document, page,
PDPageContentStream.AppendMode.APPEND, true)) {
// 在指定位置绘制调整大小后的图片
contentStream.drawImage(image, position.x, position.y, newWidth, newHeight);
}
// 保存所有修改到目标PDF文件
document.save(targetPdf);
} catch (IOException e) {
throw e;
}
}
调用说明
使用以下示例代码调用insertImageIntoPdf方法:
// 参数:原始PDF文件、目标PDF文件、页码、图片位置、图片路径、宽度、高度
insertImageIntoPdf(originalPdf, tempPdf, 10, new Point2D.Float(350, 480), "D:/face/test.png", 100f, 70f);
测试结果
下图展示了生成的PDF文档,图像已成功插入到指定位置: