当一行太大而不适合第一页时,如何在 C# 的 Itext7 中禁用行拆分(不是表!)?

Fra*_*r23 1 .net c# itext7

如果 Itext7-Table 中的行是页面上的最后一行并且不适合第一页,如何禁用行拆分?

我唯一发现的是 Itext5 的一个示例,其中方法setSplitLate()设置为falsehttp://what-when-how.com/itext-5/dealing-with-large-tables-itext-5/(清单 4.19 HeaderFooter2.5)爪哇)

有人有解决方案吗?

Ula*_*huk 5

一般来说,建议您实现自己的自定义 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您在这里所看到的,如果单元格无法适合页面,CustomCellRenderer 将确保布局结果为 NOTHING(当前区域上不能放置任何内容)而不是 PARTIAL(单元格可以拆分)。

在您的问题中,您提到了 HeaderFooter2 示例。这是移植到 iText7 的相同示例: https: //github.com/itext/i7js-book/blob/develop/src/test/java/com/itextpdf/samples/book/part1/chapter04/Listing_04_19_HeaderFooter2.java

这就是您如何使用 CustomCellRenderer 更新它:

        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);
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我通过方法在单元格上设置了渲染器setNextRenderer。(请注意,只有“正文”单元格应该使用自定义渲染器进行处理,因为我们假设页眉和页脚不会拆分)。

现在让我们看看结果。这就是之前 split 的处理方式: 在此输入图像描述

这就是现在的处理方式: 在此输入图像描述

我在答案中使用的代码是 Java 代码,但由于 iText 的 api 在 C# 中与 Java 中相同,因此移植它应该没有问题。