当前位置: 首页 > 知识库问答 >
问题:

分割/合并时,间接对象与一些PDF错误

彭华皓
2023-03-14

我需要拆分或合并一些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生成pdf,例外情况是“pdf间接对象属于其他pdf文档。将对象复制到当前pdf文档。”

在我的例子中,我只拆分和合并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文件有点机密。

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

共有1个答案

狄凯
2023-03-14

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

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

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

所讨论的page属性是CropBox,在示例文档中,它碰巧从页面树的根继承,并且具有间接值。

因此,你可以

>

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

    copyPdfPage.put(PdfName.CropBox, cropBox);
    

    通过

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

    PdfPage中。copyInheritedProperties(PdfPage、PdfDocument)

  •  类似资料:
    • This action splits and joins tag definition, e.g. converts from <tag/> to <tag></tag> and vice versa. Very useful for XML/XSL developers. 这个功能分割合并标签,例如将<tag/> 转换为 <tag></tag> ,或逆操作。对于 XML/XSL 开发很有用。 <

    • 本文向大家介绍python实现文件的分割与合并,包括了python实现文件的分割与合并的使用技巧和注意事项,需要的朋友参考一下 使用Python来进行文件的分割与合并是非常简单的。 python代码如下: splitFile--将文件分割成大小为chunksize的块; mergeFile--将众多文件块合并成原来的文件; 程序注释部分是使用类的对象的方法。 以上就是本文的全部内容,希望对大家的学

    • 本文向大家介绍python实现大文件分割与合并,包括了python实现大文件分割与合并的使用技巧和注意事项,需要的朋友参考一下 很多时候我们会面临大文件无法加载到内存,或者要传输大文件的问题。这时候就需要考虑将大文件分割为小文件进行处理了。 下面是一种用python分割与合并分件的实现。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

    • 我有两个可观测值,一个返回1个元素,另一个返回多个元素。我的目标是在不阻塞的情况下将它们合并在一起,以构建如下对象: 我试过压缩、合并和合并,但似乎都不是解决方案。

    • 这就是我想做的: > 使用pdfbox制作2个不同的pdf文件 使用pdfmerger将这两个文件合并在一起 如果要将#1保存到服务器端本地硬盘并加载#2的文件,我知道如何执行此操作。但我想做的是使用“直接从内存”。我已经搜索了这个pdfboxes中的所有方法,但仍然找不到它。 这是我从本地文件获取的代码 谢谢你。

    • 用于剪切、分割以及裁切对象的方法 Illustrator 提供了以下几种剪切、分割和裁切对象的方法: 分割下方对象命令就像是一把切刀或剪刀,它使用选定的对象切穿其他对象,而丢弃原来所选的对象。要使用此命令,请选择 “对象 ”>“路径 ”>“分割下方对象 ”。 在所选锚点处剪切路径按钮 在锚点处剪切路径,一个锚点将变为两个锚点,其中一个锚点位于另一个锚点的正上方。要访 问此按钮,请使用直接选择工具选