我使用iTextSharp生成PDF文件。
我创建了6个PdfPTable
,但它只显示了3个。
// Create new PDF document
Document document = new Document(PageSize.A4, 20f, 20f, 20f, 20f);
try {
PdfWriter writer = PdfWriter.GetInstance(document,
new FileStream(filename, FileMode.Create));
document.Open();
int spacing = 0;
for (int i = 0; i <= 6; i++) {
PdfPTable table = new PdfPTable(2);
table.TotalWidth = 144f;
table.LockedWidth = false;
PdfPCell cell = new PdfPCell(new Phrase("This is table" + i));
cell.Colspan = 3;
cell.HorizontalAlignment = 1;
table.AddCell(cell);
table.WriteSelectedRows(0, -1,
document.Left + spacing, document.Top,
writer.DirectContent);
spacing = spacing + 200;
}
}
catch (Exception ex) {}
finally {
document.Close();
ShowPdf(filename);
}
这里我把for循环放了6次,但它只显示了3个表。
如何显示所有6个表格?我想在中断之后只显示3行中的一个表到新行并显示其他3个表。
答案 0 :(得分:2)
我认为你问题的标题实际上总结了这个问题。
当您使用WriteSelectedRows
时,您有责任提供要写入的X和Y位置,并且您要在页面边界之外绘图。 A4
有595个横向单位,而且空间不足。这是100%有效,但大多数人都不会看到它。我猜你想要&#34;包裹&#34;你的桌子到下一行。有几种方法可以做到这一点:
页面尺寸更大
切换到类似PageSize.A0
的内容,您应该有更多空间。页面大小只是一个提示,无论如何,打印软件将根据需要进行扩展。
MOD check in loop
这是一个稍微复杂一点,但每个n
表格都会将x
坐标重置为左边缘,并将y
增加到前一行表格的最高位置。< / p>
int spacing = 0;
//The current Y position
float curY = document.Top;
//Well ask iText how tall each table was and set the tallest to this variable
float lineHeight = 0;
//Maximum number of tables that go on a line
const int maxPerLine = 3;
for (int i = 0; i <= 6; i++) {
PdfPTable table = new PdfPTable(2);
table.TotalWidth = 144f;
table.LockedWidth = false;
PdfPCell cell = new PdfPCell(new Phrase("This is table" + i));
cell.Colspan = 3;
cell.HorizontalAlignment = 1;
table.AddCell(cell);
table.WriteSelectedRows(0, -1,
document.Left + spacing, curY,
writer.DirectContent);
spacing = spacing + 200;
//Set the height to whichever is taller, the last table or this table
lineHeight = Math.Max(lineHeight, table.TotalHeight);
//If we're at the "last" spot in the "row"
if (0 == (i + 1) % maxPerLine) {
//Offset our Y by the tallest table
curY -= lineHeight;
//Reset "row level" variables
spacing = 0;
lineHeight = 0;
}
}
包装表
这是我真正推荐的。如果你想&#34;包装&#34;然后只需使用外表来保存内部表格,即可免费获得所有内容,而且不必混淆DirectContent
(尽管您可能希望更改表格边框)。 / p>
var outerTable = new PdfPTable(3);
outerTable.DefaultCell.Border = PdfPCell.NO_BORDER;
for (int i = 0; i <= 6; i++) {
PdfPTable innerTable = new PdfPTable(2);
innerTable.TotalWidth = 144f;
innerTable.LockedWidth = false;
PdfPCell cell = new PdfPCell(new Phrase("This is table" + i));
cell.Colspan = 3;
cell.HorizontalAlignment = 1;
innerTable.AddCell(cell);
outerTable.AddCell(innerTable);
}
document.Add(outerTable);