2

結果セットからPDFを生成するためにiTextを使用しているJavaデスクトップアプリケーションがあります。初めてPDFを生成するときは、正常に機能します。問題は、2番目のものを生成しようとしたときに発生します。ドキュメントが閉じられたことを示すDocumentExceptionをスローします。私はこの問題を抱えている人々の他の例を見つけようとしましたが、私はほとんど思いつきませんでした。それは私が非常に単純な間違いを犯したと私に信じさせ、それを見つけることができません。

以下のコードは、レポートクラスを呼び出すイベントハンドラーのスニペットです。

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

そして、これがレポートクラス自体のコードです。このコードを2回実行すると、エラーが発生します。

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();
        }
    }
}

編集:誰かの提案で、私は2番目のスレッドからRptPotReportを呼び出しようとしましたが、それは何も変わりませんでした。さらに詳しく調べると、iTextのDocumentクラスは、インスタンス化されるときに新しいスレッドを作成します。だから私は始めたところに戻ったが、まだ立ち往生している。

4

1 に答える 1

0

この行は、アプリケーションで正確に何をしますか?

document = pdfSizes.getPdfLetter();

documentコードがなく、説明があると、この行は変数の参照をから受け取ったものに設定しているように見えます。これは実行の間に再利用されるため、ステートメントpdfSizes.getPdfLetter()の参照はなくなります。new Document()

pdfSizes.getPdfLetter()メソッドにバグがあると思う傾向があります。

于 2012-05-25T16:23:52.463 に答える