行がページの最後の行であり、最初のページに収まらない場合、Itext7-Tableの行の分割を無効にするにはどうすればよいですか?
私が見つけた唯一のものは、メソッドsetSplitLate()
が次のように設定されているItext5の例ですfalse
:http://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]
コメントを追加