2

我有一个 Java 桌面应用程序,它使用 iText 从结果集中生成 PDF。第一次生成 PDF 时,它工作正常。当您尝试生成第二个时,问题就来了。它抛出一个 DocumentException ,说明文档已关闭。我试图找到其他人遇到这个问题的例子,但我想出的很少,这让我相信我犯了一个非常简单的错误,我找不到它。

下面的代码是调用报告类的事件处理程序的片段:

RptPotReport report = new RptPotReport();
try {
    report.rptPot();
} catch (DocumentException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

这是报告类本身的代码。通过此代码第二次运行时发生错误:

public class RptPotReport {

    public static void main(String[] args) throws IOException, DocumentException, SQLException {
        new RptPotReport().rptPot();
    }

    String fileOutput = "Potting Report.pdf";

    public void rptPot() throws DocumentException, IOException {
        File f = new File("Potting Report.pdf");
        if (f.exists()) {
            f.delete();
        }

        Document document = new Document();
        document = pdfSizes.getPdfLetter();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileOutput));
        document.open();

        Phrase title = new Phrase();
        title.add(new Chunk("Potting Report"));

        document.add(title); // ******* DocumentException here: "The document has been closed. You can't add any Elements."
        document.close();

        try {
            File pdfFile = new File(fileOutput);
            if (pdfFile.exists()) {
                if (Desktop.isDesktopSupported()) {
                    Desktop.getDesktop().open(pdfFile);
                } else {
                    System.out.println("Awt Desktop is not supported!");
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

编辑:根据某人的建议,我尝试从第二个线程调用 RptPotReport,但这并没有改变任何东西。进一步研究,iText 的 Document 类在实例化时会创建一个新线程。所以我回到了我开始的地方,仍然卡住了。

4

1 回答 1

0

这条线在您的应用程序中究竟做了什么:

document = pdfSizes.getPdfLetter();

如果没有代码和您的解释,该行似乎将变量的引用设置为document您从中收到的变量的引用,该变量pdfSizes.getPdfLetter()在运行之间被重用,因此您不再拥有该new Document()语句的引用。

我倾向于认为该pdfSizes.getPdfLetter()方法是错误的。

于 2012-05-25T16:23:52.463 回答