iText7 读取交叉引用时出错 table。 table 将重建。此外部参照小节中的文件位置 {0} 交叉引用条目
iText7 Error while reading cross reference table. table will be rebuilt. file position {0} cross reference entry in this xref subsection
我有一个简单的函数,它使用 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。此错误是什么意思,我该如何修复或解决它?
我发现合并实际上正在工作并合并文件,但无论如何都会抛出异常。我想通知开发人员或用户它正在修复?
如果您仔细阅读异常,它会说“交叉引用 table 将被重建。”所以 iText 正在做某种自动修复。
此异常触发了不同的 try catch 块,因此 pdf 从未被关闭。
奇怪的是,我在 iText 7 文档中找不到任何关于此的文档。
无论如何,一个简单的 try catch 围绕合并函数解决了我的问题。
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();
}
我有一个简单的函数,它使用 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。此错误是什么意思,我该如何修复或解决它?
我发现合并实际上正在工作并合并文件,但无论如何都会抛出异常。我想通知开发人员或用户它正在修复? 如果您仔细阅读异常,它会说“交叉引用 table 将被重建。”所以 iText 正在做某种自动修复。
此异常触发了不同的 try catch 块,因此 pdf 从未被关闭。
奇怪的是,我在 iText 7 文档中找不到任何关于此的文档。
无论如何,一个简单的 try catch 围绕合并函数解决了我的问题。
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();
}