首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何禁用拆分行(而不是表!)在C#的Itext7中,当一行太大而不能放在第一页时?

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

Stack Overflow用户
提问于 2019-01-23 22:20:55
回答 1查看 619关注 0票数 0

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

我找到的惟一的东西是Itext5的一个示例,其中方法setSplitLate()被设置为falsehttp://what-when-how.com/itext-5/dealing-with-large-tables-itext-5/ (清单4.19HeaderFooter2.java)

有人有解决这个问题的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-24 04:01:34

通常,应该建议您实现自己的自定义TableRenderer,并自行处理布局。然而,由于TableRenderer的布局算法确实非常困难,我建议您使用下一个CellRenderer:

代码语言:javascript
复制
    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将确保布局结果为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

这就是你可以使用你的CustomCellRendrer更新它的方式:

代码语言:javascript
复制
        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方法在单元格上设置了渲染器。(请注意,您的自定义渲染器应该只处理“正文”单元格,因为我们假设页眉和页脚不会拆分)。

现在让我们看一下结果。这就是以前处理split的方式:

这就是它现在的处理方式:

我在答案中使用的代码是用Java语言编写的,但是由于iText的api在C#中与在Java语言中是相同的,所以移植它应该不会有问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54329329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档