2

iText7 を使用して、複数のセクションを持つドキュメントを作成しています。一部のセクションは通常どおりフォーマットされますが、一部は列にフォーマットされます。ColumnDocumentRenderer オブジェクトを使用して適切に列にフォーマットすることはできますが、そうすると、ドキュメント全体が列を使用するように設定されます。その場で使用するレンダラーを iText に交換させる方法はありますか?

その場でレンダラーを交換しようとすると、null ポインター例外が発生します (com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:482))。

PdfDocument pdf = new PdfDocument(new PdfWriter(targetFile));
Document document = new Document(pdf);
DocumentRenderer defRender = new DocumentRenderer(document);
document.setRenderer(defRender);
ColumnDocumentRenderer dictRender = getColumnRender();

while (<CONDITION>) {
    document.setRenderer(dictRender);
    document.add(new Paragraph("THIS IS NORMAL TEXT"));
    document.add(new Paragraph("THIS IS NORMAL TEXT"));
    document.add(new Paragraph("THIS IS NORMAL TEXT"));
    <...> 
    document.setRenderer(defRender);
    document.add(new Paragraph("THIS IS COLUMN TEXT"));
    document.add(new Paragraph("THIS IS COLUMN TEXT"));
    document.add(new Paragraph("THIS IS COLUMN TEXT"));
    <...>
}

レンダラーを dictRender に設定した後、最初の document.add() ステートメントが com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:482) でヌル ポインター エラーをスローします。

複数の異なる PDF ファイルを作成する必要はありませんが、それが私がしなければならないことになるのではないかと考えています。ここで助けてくれてありがとう。

4

1 に答える 1

4

メモリを節約するために、デフォルトで可能な限りすぐにページ コンテンツがフラッシュされるため、例外が発生します。

コンテンツがすぐにフラッシュされるのを避けるために、DocumentRendererおよびColumnDocumentRendererコンストラクターのパラメーターがあります。

したがって、たとえば、DocumentRenderer即時フラッシュをオフにして を作成するには、次のように作成する必要があります。

DocumentRenderer defRender = new DocumentRenderer(document, false);

に非常によく似ていColumnDocumentRendererます。

次に、自動フラッシュをオフにしてレンダラーを自分で変更したため、コードの最後で の直前にdocument.close();、レンダラーを手動でフラッシュする必要があります。

defRender.flush();
dictRender.flush();

コンテンツが表示されるようになりましたが、コンテンツが重なっているために結果が見苦しく見える場合があります。2 つのレンダラーは独立したインスタンスであり、currentArea互いに独立した状態を維持しているため、これは開発者が解決する必要があります。これを適切に処理するには、作業を終了したばかりの以前のレンダラーで、currentArea切り替え先のレンダラーを更新する必要があります。currentAreaこれは、標準で提供されているレンダラーを拡張するかrenderer.getCurrentArea()bBox.

于 2016-08-11T07:48:30.310 に答える