我使用的是5.4.4版,我遇到了com.itextpdf.text.pdf.PdfReader的问题。
当我用
阅读PDF时PdfReader reader = new PdfReader(„Test.pdf");
com.lowagie.text.exceptions.InvalidPdfException:重建失败:字典键endstream不是名称。在文件指针3913220;原始消息:字典键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行的第5.4.3节中方法readDocObj()的代码:
catch (Exception e) {
obj = null; // Exception ignored !!!!!!!!
}
第1319行的第5.4.4节中方法readDocObj()的代码:
catch (IOException e) {
if (debugmode) {
e.printStackTrace();
obj = null;
}
else
throw e; // Exception thrown !!!!!!
}
在第1346行的最新版本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 !!!!!!
}
答案 0 :(得分:1)
您的原始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)。