分割/合并

时间:2018-05-22 14:50:51

标签: java pdf itext7

我需要拆分或合并一些pdf,我有一些罕见的pdf,它们会产生以下异常。

com.itextpdf.kernel.PdfException: Pdf indirect object belongs to other PDF document. Copy object to current pdf document.at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:216)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:206)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:112)
at com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java:393)
at com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:301)
at com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1743)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:183)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:152)
at com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:94)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:505)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:462)
at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:847)
at testPDF.PDF.splitByPage(PDF.java:564)
at testPDF.Main.main(Main.java:153)

经过一番搜索,我发现这篇文章有类似的问题:

Itext7 generate pdf with Exception "Pdf indirect object belongs to other PDF document. Copy object to current pdf document."

在我的情况下,我只拆分并合并了pdf,我没有触及pdf的内容,所以我不知道为什么会发生这种异常。 (根据我的理解,异常来自复制某些字体的问题)。

我的代码如下:

public static void splitByPage(File pdfToSplit, int nbPageByPDF){
    try {
        // Open the document in reading mode
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfToSplit));

        List<PdfDocument> splitDocuments = new PdfSplitter(pdfDoc) {
            int partNumber = 1;

            @Override
            protected PdfWriter getNextPdfWriter(PageRange documentPageRange) {
                try {
                    return new PdfWriter(pdfToSplit.getAbsolutePath()
                                                   .substring(0,
                                                              pdfToSplit.getAbsolutePath()
                                                                        .lastIndexOf(".")
                                                              ) 
                                            + "splitPage_part" 
                                            + String.valueOf(partNumber++) 
                                            + ".pdf");
                } catch (FileNotFoundException e) {
                    throw new RuntimeException();
                }
            }
        }.splitByPageCount(nbPageByPDF);

        // Close all the part created
        for (PdfDocument doc : splitDocuments) {
            doc.close(); // exception throws at the first closing
        }

        // Close the initial pdf to split
        pdfDoc.close();

    }

此代码的灵感来自此示例:https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-splitting-pdf-file

对于合并,当我尝试关闭新的pdf时会发生同样的错误,其中我附加了导致异常的pdf。 (但我可以这样做。我可以将另一个pdf(没有这个问题)附加到带有问题的pdf上。)

我认为我需要找到将字体直接从初始pdf复制到我创建的每个pdf的方法,但我无法找到方法。

如果需要,我可以私下向您发送错误发生的pdf,仅限于私人,因为这个pdf有点保密。

提前感谢您的任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

此问题已在当前的7.1.3-SNAPSHOT开发版本状态中得到修复。更确切地说,它在修复DEVSIX-1913(修复继承页面条目的复制)过程中修复了提交251606e55768a47cb68eb8c58f2f5fe36324d85b,日期为2018-04-23 13:46:25。

原因是PdfPage.copyInheritedProperties(PdfPage, PdfDocument)对于某些属性,值已按原样添加到目标文档中。

这对于直接对象是可以的;与大多数PDF中一样,这些属性的值是直接对象,这在很长一段时间内都没有被注意到。

有问题的页面属性是 CropBox ,它在您的示例文档中恰好从页面树的根目录继承并具有间接值。

因此,您可以

  • 等待7.1.3版本,或
  • 使用7.1.3-SNAPSHOT或
  • 将修复程序向后移植到您的iText版本。在这种情况下,您只需要替换

    copyPdfPage.put(PdfName.CropBox, cropBox);
    

    通过

    copyPdfPage.put(PdfName.CropBox, cropBox.copyTo(pdfDocument));
    

    PdfPage.copyInheritedProperties(PdfPage, PdfDocument)