我在Java中使用iText制作了这份PDF文档。 PDF文档包含通过PDFPTable对象添加的数据。
'问题'是当我有更多数据然后适合一个PDF页面时,数据将在下一页上呈现,在第一页上留下空白空间。 (参见图像'问题'一侧)。
我想让这些空白空间填充'PDFPCell'对象,请参阅'解决方案'(这些PdfPCell对象包含另一个PdfPTable,这个PdfPTable中的数据不能在pdf的下一页上'继续'不合适。)
这是代码中的一个小例子:
PdfPTable outerTable = new PdfPTable(1);
outerTable.setHorizontalAlignment(Element.ALIGN_LEFT);
outerTable.setWidthPercentage(100);
int i = 0;
while (i < 5)
{
i++;
PdfPTable innerTable = new PdfPTable(new float[] {0.25f, 0.25f, 0.25f, 0.25f});
innerTable .setHorizontalAlignment(Element.ALIGN_LEFT);
innerTable .setWidthPercentage(100);
PdfPCell cell = new PdfPCell(innerTable);
cell.setPadding(0);
innerTable.addCell(new Phrase("test Data"));
innerTable.addCell(new Phrase("test Data"));
innerTable.addCell(new Phrase("test Data"));
innerTable.addCell(new Phrase("test Data"));
outerTable.addCell(cell);
}
document.add(outertable);
document.close();
答案 0 :(得分:1)
请查看DropTablePart示例。在此示例中,我向ColumnText
对象添加了4个包含19行的表。一旦表格不适合页面,我删除ColumnText
对象的剩余内容(这将自动删除表的其余部分)并开始一个新表将开始新表
删除ColumnText
对象的内容可以通过两种不同的方式完成:
或者:
ct = new ColumnText(writer.getDirectContent());
或者:
ct.setText(null);
结果如下:
如您所见,第10-18行从内部表3中删除。
这是完整的代码:
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
Rectangle column = new Rectangle(36, 36, 559, 806);
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(column);
for (int i = 0; i < 4; ) {
PdfPTable table = new PdfPTable(new float[]{0.25f, 0.25f, 0.25f, 0.25f});
table.setHorizontalAlignment(Element.ALIGN_LEFT);
table.setWidthPercentage(100);
PdfPCell cell = new PdfPCell(new Phrase("inner table " + (++i)));
cell.setColspan(4);
table.addCell(cell);
for (int j = 0; j < 18; j++) {
table.addCell(new Phrase("test Data " + (j + 1) + ".1"));
table.addCell(new Phrase("test Data " + (j + 1) + ".1"));
table.addCell(new Phrase("test Data " + (j + 1) + ".1"));
table.addCell(new Phrase("test Data " + (j + 1) + ".1"));
}
ct.addElement(table);
if (ColumnText.hasMoreText(ct.go())) {
document.newPage();
ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(column);
}
}
document.close();
}
我没有使用嵌套表,因为使用嵌套表通常是个坏主意。它会对应用程序的性能产生负面影响,并且通常会导致难以维护的代码(继承我们的应用程序的程序员会感谢您不使用嵌套表)。