代码之家  ›  专栏  ›  技术社区  ›  FranzHuber23

如何禁用行拆分(而不是表拆分!)在IText7中,C当一行要大到适合第一页时?

  •  0
  • FranzHuber23  · 技术社区  · 6 年前

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

    我唯一发现的是一个IText5的例子,其中 setSplitLate() 设置为 false : http://what-when-how.com/itext-5/dealing-with-large-tables-itext-5/ (清单4.19 HealthPotoTr.2.java)

    有人能解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Uladzimir Asipchuk    6 年前

    一般来说,应该建议您实现自己的自定义表渲染器并自己处理布局。但是,由于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将确保布局结果为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更新它的方法:

            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”单元格才应使用自定义渲染器进行处理,因为我们假定页眉和页脚不会拆分)。

    现在让我们看看结果。 这就是以前处理分割的方式: enter image description here

    这就是它现在的处理方式: enter image description here

    我在答案中使用的代码是Java,但是由于在C语言中,与Java一样,它的API是相同的,所以您不应该有任何问题。