java - 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。这个错误是什么意思,我该如何修复它或解决它?
解决方案
我发现合并实际上正在工作并合并文件,但无论如何都会抛出异常。我想通知开发人员或用户它正在修复?如果您仔细阅读异常,它会说“将重建交叉引用表”。所以 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();
}
推荐阅读
- oauth-2.0 - OAuth 2 授权代码流的 OpenAPI/Swagger 规范
- java - 返回数组的更好方法是什么?
- javascript - 带有淡入黑色过渡的图像轮播
- python - Python:搜索同一类的对象列表以确定 object.attribute 等于列表中任何对象的某个值
- 3d - 围绕其坐标旋转对象
- python - VS Code中的python烧瓶不会在断点处停止
- c - 字符 C 函数,对其行为的误解
- polymer - babel 将 ES6 转译为 ES5 时方法未定义
- python - 用掩码元素取 numpy ndarray 的平均值
- python - Numpy数组和矩阵乘法