PdfReader实例的创建抛出异常并使程序崩溃



在阅读不同的pdf文档时,我遇到了一个问题,很难找到它的原因。我刚刚运行了下面两个pdf的源代码,它们的属性如下所示,我已经得到了页码。然而,每当我读到标有* (PDF 2)的第三个时,我的程序就会崩溃,我无法捕获抛出的null异常。我想知道为什么程序会崩溃,为什么我不能捕获抛出的异常。此外,我该如何解决这个问题?

更新:

文本版本:itext 5.5.1文件被购买,并且索赔人限制我与第三人或在网站上分享

文档属性
 Abbreviation: A: ALLOWED   NA: NOT ALLOWED    NS: NO SECURİTY  AV: ALL VERSION
                                    PDF 1   PDF 2                 PDF 3
                                             *
printing                            | A     A                       A
document assembly                   | NA    NA                      NA
content copying                     | A     A                       A
content copying for accessibility   | A     A                       A
page extraction                     | NA    NA                      NA
commenting                          | A     NA                      A
filling of form fields              | A     NA                      A
signing                             | NA    NA                      NA
creation of template pages          | A     NA                      A
security mode                       | NS    PASSWORD SECURITY       NS
can be opened by                    | AV    ACROBAT 7.0 AND LATER   AV
tagged pdf                          | YES   NO                      NO
                                            ^
                                            ^
                Note of PDF 2: All contents of document are encrypted and search engine cannot access the document's metadata 

的代码
    PdfReader pdfReader = null;
    try {
        RandomAccessFile rAF = new RandomAccessFile(this.openFilePath, "r");
        RandomAccessSourceFactory sF = new RandomAccessSourceFactory();
        RandomAccessFileOrArray rA = new RandomAccessFileOrArray( sF.createSource(rAF));
        System.out.println("[DEBUG] - 4");
        System.out.flush();
        pdfReader = new PdfReader(rA, null);
        System.out.println("[DEBUG] - 5");
        System.out.flush();
        this.totalPage = pdfReader.getNumberOfPages();
        System.out.println("[DEBUG] - 6");
        System.out.flush();
    } catch (Exception e) {
        // Technical Exception
        System.out.println("[DEBUG] - 7");
        System.out.flush();
        e.printStackTrace();
    } finally {
        System.out.println("[DEBUG] - In finally clause");
        System.out.flush(); 
line 179        pdfReader.close();
        System.out.println("[DEBUG] - Near Out of finally clause");
        System.out.flush();
    }
    System.out.printf("[DEBUG] - pdfReadern");
    System.out.flush();

抛出异常
[DEBUG] - 4
[DEBUG] - In finally clause
Exception in thread "main" java.lang.NullPointerException
    at extractTotalPageNo(ControlCenter.java:179)
    at control(ControlCenter.java:99)
    at Manage.main(Management.java:22)

我已经按照@Henry的建议运行了这个程序。

之后,我意识到系统实际上导致了一个错误,因为我忘记将BouncyCastle jar添加到我的CLASSPATH。包中。当程序尝试读取加密文档时,我假设它调用iText的PdfReader构造函数中的加密功能。

此外,由于iText依赖于BouncyCastle, java编译器抱怨没有找到调用加密函数的类。

总之,解决方案是将BouncyCastle jar添加到CLASSPATH中。

从输出来看,这一行似乎有问题

pdfReader = new PdfReader(rA, null);

pdfreader从未被设置为非null的值。

当您尝试在第179行访问它时,这会导致NPE,因此隐藏了根本原因,似乎是Throwable而不是Exception,因为它没有被捕获。

你可以让close成为条件语句:

if (pdfreader != null) {
    pdfReader.close();
}

我的两分钱:在我们的案例中,是授权问题导致SAP-PI在尝试读取PDF文件时崩溃。这意味着如果授权导致构造函数崩溃而不发出异常,则该类没有正确构建。