我正在iText中创建一个列出日期事件的表格。如果日期有多个事件,我将日期单元格的rowspan属性设置为事件数。我目前正在为每个事件使用一行,因为我想显示事件的其他信息,并希望保持一致。 基本上我的表格看起来像这样:
Date | Event | Details
--------+-----------+---------------
date 1 | event 1 | details 1
--------+-----------+---------------
date 2 | event 2 1 | more
| | details 2 1
+-----------+---------------
| event 2 2 | details 2 2
--------+-----------+---------------
包含date 2
的单元格的行数为2。
我在循环中使用ColumnText.go()
添加表格。
如果我将表格写入文档并且event 2 1
只剩下足够的空间,event 2 2
会转到新页面。如何在添加date 2
之前强制新页面?
使用PdfPTable.setSplitLate(true)
似乎不会影响多行单元格。也没有将date 2
单元格的固定高度设置为两行的组合高度。
一种解决方案是使用第2列和第3列的嵌套表(并将第2列和第3列视为一列)
另一个在我正在使用的iText版本中无法正常工作的解决方案是使用PdfPTable.writeSelectedRows()
并只写入适合页面的(组合)行。问题是,通过这种方式忽略行跨度,Date
单元看起来像tey只跨越一行。
还有其他方法吗?
答案 0 :(得分:1)
你可以为每一行创建一个表,并使用PdfPTable.setKeepTogether(true)
甚至可以在iText 2.1.7中使用,但我不建议保留该版本。下面是一个示例,其中outputFile
是正在创建PDF文件的文件类型变量。
Document document = new Document(new Rectangle(620, 150));
PdfWriter.getInstance(document, new FileOutputStream(outputFile));
document.open();
PdfPTable headerRow = new PdfPTable(3);
headerRow.setKeepTogether(true);
headerRow.addCell("Date");
headerRow.addCell("Event");
headerRow.addCell("Details");
PdfPTable firstRow = new PdfPTable(3);
firstRow.setKeepTogether(true);
firstRow.addCell("date 1");
firstRow.addCell("event 2 1");
firstRow.addCell("more\ndetails 2 1");
PdfPTable secondRow = new PdfPTable(3);
secondRow.setKeepTogether(true);
PdfPCell cell = new PdfPCell(new Phrase("date 2"));
cell.setRowspan(2);
secondRow.addCell(cell);
secondRow.addCell("event 2 1");
secondRow.addCell("more\ndetails 2 1");
secondRow.addCell("event 2 2");
secondRow.addCell("details 2 2");
document.add(headerRow);
document.add(firstRow);
document.add(secondRow);
document.close();
老实说,我认为嵌套表是更好的主意。
答案 1 :(得分:0)
Document document = new Document(PageSize.A4, 30, 30, 100, 150);
document.SetPageSize(iTextSharp.text.PageSize.A4);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
writer.PageEvent = new ITextEvents();
document.Open();
iTextSharp.text.Font fntHead2 = new iTextSharp.text.Font(bfntHead, 11, 1, BaseColor.BLACK);
Paragraph para = new Paragraph();
Chunk glue = new Chunk(new VerticalPositionMark());
Phrase ph1 = new Phrase();
Paragraph main = new Paragraph();
ph1.Add(new Chunk("Left Side", fntHead2));
ph1.Add(glue); // Here I add special chunk to the same phrase.
ph1.Add(new Chunk("Right Side", fntHead2));
para.Add(ph1);
document.Add(para);