【问题标题】:Create absolute positioned table with page breaks in iText在 iText 中创建带有分页符的绝对定位表
【发布时间】:2017-01-01 09:46:51
【问题描述】:

我正在尝试将表格放置在 PDF 文档中的绝对位置并将表格拆分到下一页,但是,将表格添加到 ColumnText 似乎可以防止这种情况发生,我怀疑这是因为我正在使用 DirectContent 编写但我不能确定。

这是显示此内容的代码 sn-p。

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());
    }
}

【问题讨论】:

    标签: itext


    【解决方案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 的情况,如iText 7: Building Blocks 教程的chapter 2 中所述。渲染器的概念是 iText 7 的主要改进之一。如果您希望您的代码面向未来,您应该考虑升级。

    【讨论】:

    • 非常感谢您。我可能会重新发布这个问题,但针对的是 iText 7 库。当然我会先尝试回答我自己的问题:)
    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多