使用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
相关产品推荐
相关产品推荐

