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

使用iText7复制PDF后添加段落出现翻转问题的解决方法

问题解决:复制PDF后新增段落方向异常修复

问题原因

复制源PDF页面到新文档后,新文档的页面默认变换/旋转属性会继承源PDF的设置,直接用Document.add()添加段落时,内容会跟随这个变换显示,最终导致段落翻转。

解决方案

下面提供两种简便的修复方案,根据你的使用场景选择:

方案1:新增独立页面添加段落(推荐)

如果是要在源PDF内容之后追加段落,直接新建一个空白页面即可——新页面默认使用正常坐标系,不会受源页面的变换影响:

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import java.io.IOException;

public void copyPdfToPdf(String text, String inputPdf, String outputPdf) throws IOException {
    // 初始化源PDF文档
    PdfDocument pdfDocInput = new PdfDocument(new PdfReader(inputPdf));
    // 初始化目标PDF文档
    PdfDocument pdfDocOutput = new PdfDocument(new PdfWriter(outputPdf));
    Document docOutput = new Document(pdfDocOutput);
    
    // 复制源PDF所有页面到目标文档
    pdfDocInput.copyPagesTo(1, pdfDocInput.getNumberOfPages(), pdfDocOutput);
    
    // 新建空白页面(默认使用正常坐标系)
    pdfDocOutput.addNewPage();
    // 添加段落到新页面
    Paragraph p = new Paragraph().add(text);
    docOutput.add(p);
    
    // 关闭文档资源
    docOutput.close();
    pdfDocInput.close();
}

方案2:重置当前页面变换矩阵

如果需要在源PDF的同一页面上添加内容,需要先清除页面的原有变换矩阵,让新内容使用默认的坐标系:

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import java.io.IOException;

public void copyPdfToPdf(String text, String inputPdf, String outputPdf) throws IOException {
    PdfDocument pdfDocInput = new PdfDocument(new PdfReader(inputPdf));
    PdfDocument pdfDocOutput = new PdfDocument(new PdfWriter(outputPdf));
    
    // 复制源页面到目标文档
    pdfDocInput.copyPagesTo(1, pdfDocInput.getNumberOfPages(), pdfDocOutput);
    // 获取目标文档的最后一页(刚复制的源页面)
    PdfPage lastPage = pdfDocOutput.getLastPage();
    
    // 创建画布并重置变换矩阵,恢复默认坐标系:原点在左下角,x轴向右,y轴向上
    PdfCanvas canvas = new PdfCanvas(lastPage);
    canvas.resetMatrix();
    
    // 使用Canvas添加段落,不受原有页面变换影响
    Canvas layoutCanvas = new Canvas(canvas, lastPage.getPageSize());
    Paragraph p = new Paragraph().add(text);
    layoutCanvas.add(p);
    
    // 关闭资源
    layoutCanvas.close();
    pdfDocOutput.close();
    pdfDocInput.close();
}

额外优化说明

原代码中Document docInput = new Document(pdfDocInput);是多余的,不需要为源PDF创建Document对象,直接操作PdfDocument即可完成页面复制。

内容的提问来源于stack exchange,提问作者Milos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:12:47