2016-06-11 10 views
1

itext 7とそのColumnDocumentRendererを使用してドキュメントを作成しました。私は最後の列にいくつかのテキストを強制したいと思います。 "最後の列"とは、例えば、ColumnDocumentRendererで定義された1つのページに3列あり、1列のテキストしかない場合でも、強制的な値を含む列3が必要な場合です。だから私は(私は、私が入っている列番号を知って、列の中断を強制するためのメカニズムが必要になると思う(ソリューションを前提に、他の人が評価した)と思います。 StackOverflowはこれを質問の形で望んでいるので、(a)これらのメカニズムは何ですか? (b)代替アプローチは何か?itext 7を使用して列番号を決定する方法

質問How to skip text insertion point to the next column using iText?は明らかに同様の質問をしますが、明らかに以前のリリースのitextを使用しています。鉱山には私が見つけることができるColumnTextがありません。

ご協力いただきありがとうございます。

+0

私自身のレンダラーを作成します。 [documentation](http://developers.itextpdf.com/content/itext-7-building-blocks/chapter-2-working-rootelement)で行われているように、列を追跡します。具体的には、 'updateCurrentArea()'メソッドを呼び出し、 'currentAreaNumber'を公開します。 3番目の列に入るコンテンツを追加する前にその番号を確認し、必要に応じて多くの 'AreaBreak'オブジェクトを追加します。注:何らかの理由で、 'currentAreaNumber'変数は' private'です。私はそれを「保護する」ように誘惑される。 –

+0

私はドキュメントへのリンクを非常に感謝します。私はitextサイトを通してさまざまなリンクをたどったが、itext7に固有の文書は見つけられなかった。再度、感謝します。 – OldAndTired

+0

完全に作業しました – OldAndTired

答えて

1

私は昨日、自分の携帯電話から答えましたが、今私は、コンピュータへのアクセス権を持っていることを、私はこのようなColumnDocumentRendererを変更:

public class ColumnDocumentRenderer extends DocumentRenderer { 

    protected Rectangle[] columns; 
    protected int nextAreaNumber; 

    public ColumnDocumentRenderer(Document document, Rectangle[] columns) { 
     super(document); 
     this.columns = columns; 
    } 

    public ColumnDocumentRenderer(Document document, boolean immediateFlush, Rectangle[] columns) { 
     super(document, immediateFlush); 
     this.columns = columns; 
    } 

    @Override 
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) { 
     if (overflowResult != null && overflowResult.getAreaBreak() != null && overflowResult.getAreaBreak().getType() != AreaBreakType.NEXT_AREA) { 
      nextAreaNumber = 0; 
     } 
     if (nextAreaNumber % columns.length == 0) { 
      super.updateCurrentArea(overflowResult); 
     } 
     return (currentArea = new LayoutArea(currentPageNumber, columns[nextAreaNumber++ % columns.length].clone())); 
    } 

    public int getNextAreaNumber() { 
     return nextAreaNumber; 
    } 
} 

変更はiTextは7.0.1になりますが、あなたはこれを使用することができますあなた自身のレンダラーのコード

あなたは次のように、このレンダラを使用することができ

public void createPdf(String dest) throws IOException { 
    OutputStream fos = new FileOutputStream(dest); 
    PdfWriter writer = new PdfWriter(fos); 
    PdfDocument pdf = new PdfDocument(writer); 
    Document document = new Document(pdf); 

    float offSet = 36; 
    float gutter = 23; 
    float columnWidth = (PageSize.A4.getWidth() - offSet * 2)/3 - gutter * 2; 
    float columnHeight = PageSize.A4.getHeight() - offSet * 2; 
    Rectangle[] columns = { 
     new Rectangle(offSet, offSet, columnWidth, columnHeight), 
     new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight), 
     new Rectangle(offSet + 2 * (columnWidth + gutter), offSet, columnWidth, columnHeight)}; 
    ColumnDocumentRenderer renderer = new ColumnDocumentRenderer(document, columns); 
    document.setRenderer(renderer); 

    for (int i = 0; i < 50; i++) { 
     document.add(new Paragraph("Hello World")); 
    } 
    while (renderer.getNextAreaNumber() % 3 != 0) 
     document.add(new AreaBreak()); 
    document.add(new Paragraph("Third column")); 
    document.add(new AreaBreak()); 
    for (int i = 0; i < 80; i++) { 
     document.add(new Paragraph("Hello World")); 
    } 
    while (renderer.getNextAreaNumber() % 3 != 0) 
     document.add(new AreaBreak()); 
    document.add(new Paragraph("Third column")); 
    document.add(new AreaBreak()); 
    for (int i = 0; i < 10; i++) { 
     document.add(new Paragraph("Hello World")); 
    } 
    while (renderer.getNextAreaNumber() % 3 != 0) 
     document.add(new AreaBreak()); 
    document.add(new Paragraph("Third column")); 
    document.close(); 

} 

最初の列はインデックス0を有し、次の領域番号は1であり、2番目の列は、インデックス1を有しており、次の領域の数は2であるのでに。

これは、このようなページの3番目の列を確認して3番目の列に移動できることを意味します。

while (renderer.getNextAreaNumber() % 3 != 0) 
    document.add(new AreaBreak()); 
+0

新しい「ColumnDocumentRenderer」メソッドを実装の詳細から切り離し、* current *エリア番号を返し、 'getAreaNumber'という名前を付けた方がいいでしょうか?ほとんどの場合、通常、ユーザーは自分がどの列に入っていて、次の列ではないかを知りたいと思うでしょう。 (はい、それを推論するのは簡単ですが、現在の列を取得する方法は、次の列を取得するよりも直感的です) – mkl

+0

私はこれについて考えましたが、私は同じ考えを持っていましたしかし、私は 'nextAreaNumber'に行くことを決めたいくつかの議論を見つけました。私はすでにこれらの議論を忘れていましたが、改ページの効果に関連していたことを覚えています。 –

関連する問題