在pdf大小限制之后无法看到其他表

时间:2016-07-20 11:30:32

标签: c# pdf itext

我使用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个表。

try .. catch

如何显示所有6个表格?我想在中断之后只显示3行中的一个表到新行并显示其他3个表。

1 个答案:

答案 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);