我正在使用5.4.4版,并且com.itextpdf.text.pdf.PdfReader出现问题。
当我阅读PDF时
PdfReader reader = new PdfReader(„Test.pdf");
它是扫描纸,我可以使用Adobe Reader打开它-发生以下错误:
com.lowagie.text.exceptions.InvalidPdfException:重建失败:字典键的endstream不是名称。在文件指针3913220处;原始消息:Dictionary key endstream不是名称。在文件指针3913220
在com.lowagie.text.pdf.PdfReader.readPdf(PdfReader.java:668)
在com.lowagie.text.pdf.PdfReader。(PdfReader.java:189)
在com.lowagie.text.pdf.PdfReader。(PdfReader.java:264)
在com.lowagie.text.pdf.PdfReader。(PdfReader.java:247)
我查看代码,因为itext 5.4.4引发了异常。在旧版本中,将忽略此异常。
来自第1319行的itext 5.4.3中的readDocObj()方法的代码:
catch (Exception e) {
obj = null; // Exception ignored !!!!!!!!
}
来自第1319行的itext 5.4.4中的readDocObj()方法的代码:
catch (IOException e) {
if (debugmode) {
e.printStackTrace();
obj = null;
}
else
throw e; // Exception thrown !!!!!!
}
在1346行的最新itext版本5.5.1中:
catch (IOException e) {
if (debugmode) {
if (LOGGER.isLogging(Level.ERROR))
LOGGER.error(e.getMessage(), e);
obj = null;
}
else
throw e; // Exception thrown !!!!!!
}
最佳答案
您的原始PDF包含一个错误,并且忽略该错误会导致非常奇怪的结果(丢失对象,完全拧紧的PDF)。因此,我们应该抛出一个错误,通知您文件有问题。您的PDF可能包含其流词典不正确的PDF流。
认为该文件在Adobe Reader中可以很好地打开是一个糟糕的论点:这并不意味着您的PDF遵循ISO-32000-1。 Adobe Reader会尽最大努力打开甚至损坏的文件。如果使用Adobe Acrobat打开它并使用Preflight,您会注意到Acrobat也抱怨该错误。
由于很难用这种错误调试文件,因此我们引入了debugmode
常量。默认情况下,此常量为false
,但在iText RUPS中设置为true
。将此常量设置为true
允许我们读取文件并忽略错误,以便我们可以在RUPS中检查文件。
如果您不关心输入PDF的质量,可以将debugmode
设置为true,但是我不建议您这样做。我建议修复原始PDF。
备注:我赞成评论。您声称正在使用iText 5版本时,您显然没有告诉我们完整的事实,但是您却收到错误消息,提及我的名字(我是com.lowagie
软件包中的Lowagie)。