首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分/合并时带有某些PDF的间接对象的错误

拆分/合并时带有某些PDF的间接对象的错误
EN

Stack Overflow用户
提问于 2018-05-22 14:50:50
回答 1查看 1.4K关注 0票数 1

我需要分裂或合并一些pdf,我有一些罕见的pdf,创建以下例外。

代码语言:javascript
复制
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的内容,所以我不知道为什么会发生这种异常。(据我所知,异常来自于某些字体的复制问题)。

我的代码如下:

代码语言:javascript
复制
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是有点机密的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 11:34:27

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

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

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

所讨论的页面属性是CropBox,在您的示例文档中,该属性恰好是从页面树的根继承的,并且具有一个间接值。

因此,你可以

  • 等待7.1.3发布,或
  • 使用7.1.3快照,或
  • 将修正移至您的iText版本。在这种情况下,您只需替换 copyPdfPage.put(PdfName.CropBox,cropBox); 通过 copyPdfPage.put(PdfName.CropBox,cropBox.copyTo(pdfDocument)); 在PdfPage.copyInheritedProperties(PdfPage, PdfDocument)中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50470662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档