
本文详解如何利用 openpdf 的 `pdfstamper` 与页面覆层(over content)机制,将印章图像精确、动态地叠加在 pdf 文本上方,支持绝对定位与分页适配,满足合同签署等场景需求。
在 OpenPDF(iText 2.x 的开源分支)中,Image 类原生仅支持有限的布局模式(如 UNDERLYING、TEXTWRAP 等),所有这些模式均作用于文档流内,无法实现“图像浮于文字之上”的视觉效果——这正是合同盖章、水印添加、签名标注等典型业务的核心需求。关键在于:必须跳出 Document.add() 的流式布局逻辑,转而使用底层绘图上下文进行绝对坐标覆盖绘制。
✅ 正确实现路径:使用 PdfStamper + getOverContent()
PdfStamper 是 OpenPDF 提供的 PDF 编辑核心类,专用于修改已有 PDF。其 getOverContent(int pageNumber) 方法可获取指定页的顶层绘图层(Over Content),所有在此层绘制的内容(图像、文字、形状)均会显示在原始页面内容之上,天然满足“印章覆盖文本”的需求。
以下是完整、可运行的示例代码:
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import java.io.FileOutputStream;
import java.io.IOException;
public class SealOverlayExample {
public static void main(String[] args) throws IOException, DocumentException {
String src = "contract.pdf"; // 原始合同PDF
String dest = "contract_sealed.pdf";
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
// 假设在第1页右下角添加印章(单位:用户坐标系,原点在左下角)
int pageNum = 1;
PdfContentByte over = stamper.getOverContent(pageNum);
// 加载印章图片(支持 JPG/PNG)
Image seal = Image.getInstance("seal.png");
seal.scaleAbsolute(120f, 120f); // 可缩放
// 设置绝对位置:x=页面宽度-150, y=页面高度-150(距右下角留白30pt)
float pageWidth = reader.getPageSize(pageNum).getWidth();
float pageHeight = reader.getPageSize(pageNum).getHeight();
seal.setAbsolutePosition(pageWidth - 150f, pageHeight - 150f);
// 将图像绘制到覆层
over.addImage(seal);
// 关闭资源
stamper.close();
reader.close();
System.out.println("印章已成功叠加至PDF!");
}
}⚠️ 关键注意事项
- 坐标系理解:OpenPDF 使用 PDF 用户坐标系——原点在页面左下角,Y 轴向上为正。务必用 reader.getPageSize(pageNum) 获取真实页面尺寸,避免硬编码导致跨A4/Letter等格式错位。
- 动态定位策略:若需根据文本内容(如“甲方签字处”)精确定位印章,需先通过 PdfReader 解析文本位置(较复杂),或更推荐:在生成原始 PDF 时预留带唯一标识符的占位符(如 [[SEAL_HERE]]),再用 PdfStamper 搜索该文本并计算其坐标。
- 分页处理:getOverContent(pageNum) 明确指定页码,可循环遍历 reader.getNumberOfPages() 实现多页批量盖章。
- 图像格式兼容性:确保 PNG 图像含透明通道(Alpha),且 OpenPDF 版本 ≥ 1.3.30(旧版对透明 PNG 支持不佳);JPG 需为 RGB 模式。
- 性能提示:PdfStamper 会重写整个 PDF,大文件建议启用 stamper.setFullCompression(); 并关闭不必要的功能(如 stamper.setFormFlattening(true))。
✅ 总结
OpenPDF 中实现“图像浮于文本之上”,本质是放弃流式布局,拥抱底层覆层绘图。PdfStamper.getOverContent() 是唯一可靠、标准、且完全支持绝对定位的方案。它不依赖 Image 类的布局常量,而是直接操作 PDF 绘图指令,因此兼具精度、灵活性与生产稳定性。对于合同签署、电子签章、动态水印等场景,此方法是经过验证的最佳实践。










