使用PDFBox 2.X在PDF所有页面指定位置叠加PDF
实现固定尺寸PDF左上角叠加到目标PDF所有页面(非位图方式)
我来帮你搞定这个左上角叠加的需求,而且完全不用把叠加PDF转成位图,完美保留原PDF的矢量属性(文字可选中、缩放不失真)。核心思路是直接把叠加PDF的页面作为矢量形式的PdfFormXObject插入目标页面,再根据目标页面的动态尺寸计算左上角对齐的坐标(PDF坐标系以页面左下角为原点,x向右、y向上)。
具体实现步骤(基于iText 7)
- 加载目标PDF和叠加PDF的文档对象
- 提取叠加PDF的第一页(尺寸固定,取单页即可)并转为
PdfFormXObject(矢量容器,避免位图转换) - 遍历目标PDF的每一页,获取当前页面的实际尺寸
- 计算左上角对齐坐标:叠加PDF的左下角坐标为
(0, 目标页面高度 - 叠加PDF高度),确保叠加PDF的左上角和目标页面左上角完全重合 - 通过
PdfCanvas将叠加的XObject绘制到目标页面的对应位置
完整调试代码示例
import com.itextpdf.kernel.pdf.*; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import java.io.File; import java.io.IOException; public class PdfOverlayUtil { public static void main(String[] args) { String targetPdfPath = "target.pdf"; String overlayPdfPath = "overlay.pdf"; String outputPdfPath = "output_with_overlay.pdf"; try (PdfDocument targetDoc = new PdfDocument(new PdfReader(targetPdfPath), new PdfWriter(outputPdfPath)); PdfDocument overlayDoc = new PdfDocument(new PdfReader(overlayPdfPath))) { // 获取叠加PDF的第一页,转为可复用的矢量Form XObject PdfPage overlayPage = overlayDoc.getFirstPage(); PdfFormXObject overlayXObject = overlayPage.copyAsFormXObject(targetDoc); float overlayWidth = overlayXObject.getBBox().getWidth(); float overlayHeight = overlayXObject.getBBox().getHeight(); // 遍历目标PDF的每一页,逐个添加叠加层 for (int i = 1; i <= targetDoc.getNumberOfPages(); i++) { PdfPage targetPage = targetDoc.getPage(i); PdfCanvas canvas = new PdfCanvas(targetPage); // 获取目标页面的实际显示尺寸(兼容各种自定义尺寸) Rectangle targetMediaBox = targetPage.getMediaBox(); float targetPageHeight = targetMediaBox.getHeight(); // 计算左上角对齐的坐标:左边缘对齐x=0,上边缘对齐需让叠加页底部y坐标等于目标页高度减叠加页高度 float x = 0; float y = targetPageHeight - overlayHeight; // 保存画布状态,避免影响原页面内容 canvas.saveState(); // 将叠加层绘制到指定位置(缩放因子1,保持原尺寸) canvas.addXObject(overlayXObject, x, y); // 恢复画布状态 canvas.restoreState(); } System.out.println("叠加完成,输出文件:" + outputPdfPath); } catch (IOException e) { e.printStackTrace(); } } }
关键细节说明
- 矢量复用的优势:用
PdfFormXObject直接复制叠加页面的矢量内容,完全避免转位图导致的画质损失和文件体积增大,原PDF的文字、图形依然保持可编辑属性(如果原文档允许的话)。 - 适配动态页面尺寸:遍历每一页时都重新获取当前页的
MediaBox,不管目标页面是A4、A3还是自定义尺寸,都能准确计算出左上角对齐的位置。 - 画布状态管理:调用
saveState()和restoreState()是为了避免叠加操作影响原页面的原有内容和属性。
内容的提问来源于stack exchange,提问作者OutsideCoder
相关产品推荐
相关产品推荐

