itext - 什么是易于打印“第一个权利,然后向下”

问题描述 投票:0回答:1

我想打印一个包含更多行和列的PdfPTable,而不是PDF的一页。

我想打印“第一个权利,然后向下”,这类似于行主要顺序。打印第一页 - 完整的行,但是这些行的所有列。然后打印下一页 - 完整的行,再打印这些行的所有列。

据我所知,iText可以处理包含更多行而不是页面上的行的PdfPTable,但无法处理比页面上更多的列。所以我自己拆分列。但这意味着我最终打印出“先下来然后正确”,这不是我想要的。

有没有一种简单的方法来做我想要的?请注意,我不提前知道行高,因为我在setMinimumHeight()对象上调用PdfPCell

我能想到的唯一方法是笨拙,就像先前一样首先拆分列。然后,对于适合一个页面的每个列序列,只要它们适合,就将它们逐个添加到PdfPTable。如果他们不这样做,那就是我们需要拆分行的地方。最后,我们最终得到每组行和列的PdfPTable对象。我们需要将所有这些内容保存在内存中,并以右(行 - 主)顺序将它们添加到PDF文档中。

这似乎相当不优雅,所以我想检查是否有更清洁的解决方案。谢谢。

itext
1个回答
2
投票

如果您有非常大的表,那么维护概览并将表分布在不同页面上的最优雅方法是将表添加到一个非常大的PdfTemplate对象,然后将该PdfTemplate对象的剪切部分添加到不同的页面。

这就是我在TableTemplate例子中所做的。

我创建了一个15列的表,总宽度为1500pt。

PdfPTable table = new PdfPTable(15);
table.setTotalWidth(1500);
PdfPCell cell;
for (int r = 'A'; r <= 'Z'; r++) {
    for (int c = 1; c <= 15; c++) {
        cell = new PdfPCell();
        cell.setFixedHeight(50);
        cell.addElement(new Paragraph(String.valueOf((char) r) + String.valueOf(c)));
        table.addCell(cell);
    }
}

现在我将此表写入Form XObject,其测量值为1500乘1300.请注意,1300是表的总高度。您可以这样得到:table.getTotalHeight()或者您可以将26行乘以50 pt的固定高度。

PdfContentByte canvas = writer.getDirectContent();
PdfTemplate tableTemplate = canvas.createTemplate(1500, 1300);
table.writeSelectedRows(0, -1, 0, 1300, tableTemplate);

现在您已经拥有了Form XObject,您可以在每个页面上重复使用它,如下所示:

PdfTemplate clip;
for (int j = 0; j < 1500; j += 500) {
    for (int i = 1300; i > 0; i -= 650) {
        clip = canvas.createTemplate(500, 650);
        clip.addTemplate(tableTemplate, -j, 650 - i);
        canvas.addTemplate(clip, 36, 156);
        document.newPage();
    }
}

结果是table_template.pdf,其中我们在第1页有单元格A1到M5,第2页有单元格N1到Z5,第3页有单元格A6到M10,第4页有单元格N6到Z10,第5页有单元格A11到M15,单元格N11到第6页的Z15。

这回答了周五发布的谷歌所有答案。

© www.soinside.com 2019 - 2024. All rights reserved.