我正在使用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)。

10-07 13:03