首页 > 解决方案 > iText7 读取交叉引用表时出错。表将被重建。此外部参照小节中的文件位置 {0} 交叉引用条目

问题描述

我有一个简单的函数,它使用 iText7 将 ArrayList 中的 pdf 合并在一起

            File pdfMerged = new File("merged.pdf");
            PdfDocument pdf = new PdfDocument(new PdfWriter(pdfMerged));
            PdfMerger merger = new PdfMerger(pdf);


            for (InputStream in : files) {
            //Add pages from the each document
                PdfDocument sourcePdf = new PdfDocument(new PdfReader(in));
                merger.merge(sourcePdf, 1, sourcePdf.getNumberOfPages());
                
                sourcePdf.close();
            }

            pdf.close();
}

虽然这在大多数情况下都有效,但不幸的是,一个 pdf 给出了以下错误。


2020-08-28 18:05:59,935  ERROR [kernel.pdf.PdfReader] [http-nio-8080-exec-9] Error occurred while reading cross reference table. Cross reference table will be rebuilt.
com.itextpdf.io.IOException: Error at file pointer 1,051,972.
at com.itextpdf.io.source.PdfTokenizer.throwError(PdfTokenizer.java:639)
at com.itextpdf.kernel.pdf.PdfReader.readXrefSection(PdfReader.java:839)
at com.itextpdf.kernel.pdf.PdfReader.readXref(PdfReader.java:777)
at com.itextpdf.kernel.pdf.PdfReader.readPdf(PdfReader.java:532)
at com.itextpdf.kernel.pdf.PdfDocument.open(PdfDocument.java:1638)
at com.itextpdf.kernel.pdf.PdfDocument.<init>(PdfDocument.java:231)
...
...
...
Caused by: com.itextpdf.io.IOException: file position {0} cross reference entry in this xref subsection.

导致问题的合并中使用的 pdf 在其他程序中打开得很好。只有 itext7 抱怨。

我无法分享有问题的 pdf,但我可以说它使用的是 PDF 1.6 版。

这会导致结果为空 pdf。这个错误是什么意思,我该如何修复它或解决它?

标签: javapdfitextitext7

解决方案


我发现合并实际上正在工作并合并文件,但无论如何都会抛出异常。我想通知开发人员或用户它正在修复?如果您仔细阅读异常,它会说“将重建交叉引用表”。所以 iText 正在做某种自动修复。

此异常触发了不同的 try catch 块,因此 pdf 从未被关闭。

奇怪的是,我在 iText 7 文档中找不到任何关于此的文档。

无论如何,在我的情况下,围绕合并功能的一个简单的尝试解决了这个问题。

    for (InputStream in : files) {
    //Add pages from the each document
        PdfDocument sourcePdf = new PdfDocument(new PdfReader(in));

        try{
            merger.merge(sourcePdf, 1, sourcePdf.getNumberOfPages());
        } catch (Exception e) {
          //log an error and continue
        }
        sourcePdf.close();
    }

推荐阅读