0

iText ライブラリのいくつかの例を調べました。私が見た典型的な例では、ドキュメントの作成について混乱しています:

Document document = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter.getInstance(document, new FileOutputStream(PATH));
document.open();
//document.addSomeContent();
document.close();

ドキュメントが最初からファイル/出力ストリームにバインドされているのはなぜですか? ドキュメントを作成し、それが完成したら保存して、file/output_stream に送信することは可能ですか?

ソースを調べたところ、 getInstance() は次のとおりです。

public static PdfWriter getInstance(final Document document, final OutputStream os)
throws DocumentException {
    PdfDocument pdf = new PdfDocument();
    document.addDocListener(pdf);
    PdfWriter writer = new PdfWriter(pdf, os);
    pdf.addWriter(writer);
    return writer;
}

繋がり:

Document  < --- > PdfDocument 
                      Λ
                      |
                      |
                      V
                 PdfWriter   < ---- > OutputStream

Document の作成直後に PdfWriter と OutputStream でバインドされます。次のようなことが考えられます。

Document document = new Document(PageSize.A4, 50, 50, 50, 50);
// document.addSomeContent();
document.save(someOutputStreamObject);

ファイルと永続性を取り除き、ドキュメントの論理構造の作成に集中したいと考えています。後で、Document オブジェクトを他のモジュールに渡したいと思います。このモジュールは、ドキュメントをファイルに保存したり、http 応答などとして送信したりします。

4

1 に答える 1

3

ドキュメントが最初からファイル/出力ストリームにバインドされているのはなぜですか?

最初からそこにデータを書き込めるからです。

一般に、PDF ドキュメント全体をメモリ内に構築するのではなく、最後にすべてをストリームにフラッシュするだけです。特にサーバー側のソリューションの場合、そのようなドキュメントを同時に多数作成する状況を考慮する必要があります。1 つまたは数個のドキュメントに対して十分なメモリがあったとしても、同時に数百または数千のドキュメントを完全にメモリに保持すると、リソースが大幅に消費されます。

ファイルの作成中にさらにファイルを提供することで、他の問題も防ぐことができます。ブルーノはコメントで次のように述べています。

ドキュメントが終了する前に、セッションがタイムアウトすることがありました。そこで、ビルダー パターンを使用して iText を作成し、OutputStream にバイトを継続的に供給して、サーバー/ブラウザーのタイムアウトを防ぎます。

したがって、できるだけ早くそれを書きたいと思うでしょう。これには、出力ストリームが最初から存在する必要があります。

他のモジュール。ドキュメントをファイルに保存したり、http 応答などとして送信したりします。

リソースの制限に悩まされていないように見えるので、データを にストリーミングしてからByteArrayOutputStream、結果のバイト配列またはそれに基づく入力ストリームまたはデータ ソースを転送できます。

ただし、リソースが問題になる場合は、モジュール化のために、パイプ処理された入力ストリームと出力ストリームでパイプライン処理を使用することを検討してください。

于 2013-10-24T19:38:58.310 に答える