1つの行が最初のページに収まるほど大きい場合、C#のItext7で(テーブルではなく)行の分割を無効にするにはどうすればよいですか?

FranzHuber23

行がページの最後の行であり、最初のページに収まらない場合、Itext7-Tableの行の分割を無効にするにはどうすればよいですか?

私が見つけた唯一のものは、メソッドsetSplitLate()が次のように設定されているItext5の例ですfalsehttp//what-when-how.com/itext-5/dealing-with-large-tables-itext-5/(リスト4.19HeaderFooter2。 java)

誰かがこれに対する解決策を持っていますか?

ウラジミール・アシプチュク

一般に、独自のカスタムTableRendererを実装し、独自にレイアウトを処理することをお勧めします。ただし、TableRendererのレイアウトアルゴリズムは実際には非常に難しいため、代わりに次のCellRendererを使用することをお勧めします。

    class CustomCellRenderer extends CellRenderer {
    public CustomCellRenderer(Cell modelElement) {
        super(modelElement);
    }

    @Override
    public LayoutResult layout(LayoutContext layoutContext) {
        LayoutResult result = super.layout(layoutContext);
        if (LayoutResult.FULL != result.getStatus()) {
            result.setStatus(LayoutResult.NOTHING);
            result.setSplitRenderer(null);
            result.setOverflowRenderer(this);
        }
        return result;
    }

    @Override
    public IRenderer getNextRenderer() {
        return new CustomCellRenderer((Cell)getModelElement());
    }
}

ここに表示されているように、セルがページに収まらない場合、CustomCellRendererは、レイアウト結果がPARTIAL(セルを分割できる)ではなく、NOTHING(現在の領域に何も配置できない)になるようにします。

あなたの質問では、HeaderFooter2サンプルについて言及しました。これは、iText7に移植されたものと同じサンプルです:https//github.com/itext/i7js-book/blob/develop/src/test/java/com/itextpdf/samples/book/part1/chapter04/Listing_04_19_HeaderFooter2.java

これが、CustomCellRendrerを使用して更新する方法です。

        for (Screening screening : screenings) {
        movie = screening.getMovie();
        cell = new Cell().add(new Paragraph(screening.getLocation()));
        cell.setNextRenderer(new CustomCellRenderer(cell));
        table.addCell(cell);
        cell = new Cell().add(new Paragraph(String.format("%1$tH:%1$tM", screening.getTime())));
        cell.setNextRenderer(new CustomCellRenderer(cell));
        table.addCell(cell);
        cell = new Cell().add(new Paragraph(String.format("%d '", movie.getDuration())));
        cell.setNextRenderer(new CustomCellRenderer(cell));
        table.addCell(cell);
        cell = new Cell().add(new Paragraph(movie.getMovieTitle()));
        cell.setNextRenderer(new CustomCellRenderer(cell));
        table.addCell(cell);
        cell = new Cell().add(new Paragraph(String.valueOf(movie.getYear())));
        cell.setNextRenderer(new CustomCellRenderer(cell));
        table.addCell(cell);
        cell = new Cell();
        cell.setNextRenderer(new CustomCellRenderer(cell));
        cell.add(PojoToElementFactory.getDirectorList(movie));
        table.addCell(cell);
        cell = new Cell();
        cell.setNextRenderer(new CustomCellRenderer(cell));
        cell.add(PojoToElementFactory.getCountryList(movie));
        table.addCell(cell);
    }

ご覧のとおり、setNextRendererメソッドを使用してセルにレンダラーを設定しました(ヘッダーとフッターは分割されないと想定しているため、カスタムレンダラーで処理する必要があるのは「body」セルのみであることに注意してください)。

それでは、結果を見てみましょう。これは、分割が以前に処理された方法です。ここに画像の説明を入力してください

そして、それが今処理されている方法です: ここに画像の説明を入力してください

回答で使用したコードはJavaですが、iTextのAPIはC#でもJavaと同じであるため、移植しても問題はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ