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

时间:2014-02-28 11:32:29

标签: itext

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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);
    }
}

现在我将此表写入一个测量1500乘1300的Form XObject。注意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,单元格A11到M15在第5页上,单元格N11到Z15在第6页上。

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