You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:24:23