我有一个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类在实例化时创建一个新线程。所以我回到了我开始的地方,仍然卡住了。
答案 0 :(得分:0)
这一行在您的应用程序中的作用是什么:
document = pdfSizes.getPdfLetter();
如果没有代码和解释,似乎该行将document
变量的引用设置为您从pdfSizes.getPdfLetter()
收到的变量,该变量在运行之间重复使用,因此您不再拥有new Document()
陈述的参考。
我倾向于认为pdfSizes.getPdfLetter()
方法有问题。