iText-PdfReader:重建失败:字典键endstream不是名称

时间:2014-05-27 12:27:02

标签: java itext

我使用的是5.4.4版,我遇到了com.itextpdf.text.pdf.PdfReader的问题。

当我用

阅读PDF时
PdfReader reader = new PdfReader(„Test.pdf");
  • 这是一张扫描的纸张,我可以用Adobe Reader打开它 - 发生以下错误:

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 !!!!!!  
    }  

1 个答案:

答案 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)。