在iText中创建具有分页符的绝对定位表

时间:2016-08-25 05:16:23

标签: itext

我正在尝试将表格放在PDF文档的绝对位置,并让表格进入下一页,但是,将表格添加到ColumnText似乎可以防止这种情况,我怀疑它是因为我&# 39;用DirectContent写作,但我无法确定。

这是显示此内容的代码段。

void Main(string[] args)
{   
    new Splitting().manipulatePdf(Splitting.dest);
}

public class Splitting {

    public static string dest = @"d:\\splitting.pdf";

    public void manipulatePdf(String dest)
    {

        var doc = new Document(PageSize.A4);
        var ms = new MemoryStream();
        var writer = PdfWriter.GetInstance(doc, ms);

        doc.Open();
        doc.NewPage();

        Paragraph p = new Paragraph("Test");
        var table = new PdfPTable(2);
        for (int i = 1; i < 60; i++) {
            table.AddCell("key " + i);
            table.AddCell("value " + i);
        }

        doc.Add(table);

        ColumnText ct = new ColumnText(writer.DirectContent);
        ct.SetSimpleColumn(0, 0, 300, 300);
        ct.AddElement(table);
        ct.Go();

        doc.Close();

        File.WriteAllBytes(dest, ms.ToArray());
    }
}

1 个答案:

答案 0 :(得分:1)

您有以下代码:

ColumnText ct = new ColumnText(writer.DirectContent);
ct.SetSimpleColumn(0, 0, 300, 300);
ct.AddElement(table);
ct.Go();

这会将表格添加到一个尺寸为300 x 300个用户单位的矩形中。 ct.Go()的返回值会通知您所有矩形是否足够大以适应表格,或者表格中是否还有一些内容不合适。在后一种情况下,您必须在新页面上定义新列。

例如,请参阅官方文档中的ColumnTable示例(这是一个Java示例;可以在页面底部找到指向C#版本的链接)。

ColumnText column = new ColumnText(writer.DirectContent);
float[][] x = {
    new float[] { document.Left, document.Left + 380 },
    new float[] { document.Right - 380, document.Right }
};
column.AddElement(GetTable(day));
int count = 0;
int status = 0;
// render the column as long as it has content
while (ColumnText.HasMoreText(status)) {
    column.SetSimpleColumn(
        x[count][0], document.Bottom,
        x[count][1], document.Top
    );
    // render as much content as possible
    status = column.Go();
    // go to a new page if you've reached the last column
    if (++count > 1) {
        count = 0;
        document.NewPage();
    }
}

如果您坚持使用iTextSharp 5,这是代码。如果您要升级到最新版本的iText 7 for C#,您的代码将更容易阅读。在这种情况下,仅仅是将DocumentRenderer更改为ColumnDocumentRenderer的情况,如chapter 2教程的iText 7: Building Blocks中所述。渲染器的概念是iText 7的主要改进之一。如果您希望您的代码能够面向未来,则应考虑升级。