【问题标题】:How to insert a PdfPTable into an existing PDF template?如何将 PdfPTable 插入现有的 PDF 模板?
【发布时间】:2012-09-04 02:25:30
【问题描述】:

更新:

经过一番讨论,我们决定使用 TeX,特别是与 windows 兼容的MiKTeX。我们意识到,即使我们可以通过微观管理布局来格式化动态加长表格(这似乎不可能,或者像计算每行的行高一样乏味),还有其他动态控件,例如大文本框,我们也会需要进行微观管理,因此我们决定即时生成整个文档。考虑到这一点,使用 TeX 是显而易见的选择,因为它的强大功能和我们之前的经验,现在一周后,我很高兴我们这样做了,因为我们所有的报告都是动态生成的,并且背后的代码是干净的最小。

原文:

我有一个使用 LiveCycle 生成的 pdf 表单模板,我想填写它 (pdfstamper) 并添加一些表格 (pdfptable),但事实证明它比我最初想象的要困难。

我打开一个 pdf 并使用 pdfstamper 编辑静态字段:

using (var outputPDF1 = new MemoryStream())
{
    var pdfReader = new PdfReader(pdf);
    var pdfStamper = new PdfStamper(pdfReader, outputPDF1);
    var pdfFields = pdfStamper.AcroFields;

    pdfFields.SetField("Field1", "Value1");

这是直截了当的。

然后我尝试添加一个表格,该表格将从多个页面的设定位置开始。这个here 已经有 3 年历史了,它的 itextsharp 版本要旧得多,而且非常手动。

该代码的关键是使用 GetOverContent 将 ColumnText 插入到生成的表格中,但这需要知道表格高度并手动将表格切割成合适的大小

    var cb = pdfStamper.GetOverContent(1);
    var ct = new ColumnText(cb);
    ct.Alignment = Element.ALIGN_CENTER; 
    ct.SetSimpleColumn(36, 36, PageSize.A4.Width-36, PageSize.A4.Height-300); 
    ct.AddElement(table);
    ct.Go();

还有一个答案 Itextsharp: Adjust 2 elements on exactly one page 这仅限于单个页表。它可以是可扩展的,但您似乎还必须在后续页面上计算页眉/页脚。

以及同一个大方向上的各种悬而未决的问题:

adding a dynamic Table to an pdf template

itextsharp place Pdfptable at desired position

所以我的问题是,目前使用所见即所得编辑器静态创建 pdf 并对其进行修改以添加动态大小的内容(例如表格或任意长度的文本)的最佳方法是什么?如果我们可以使用 WYSIWYG LiveCycle 来使模板正常工作,我不想从头开始生成一个,但是如果为 pdf 模板格式化表格比动态生成整个表格需要更多的努力,那么我宁愿使用 itextsharp 即时生成整个 pdf。

【问题讨论】:

    标签: c# pdf itextsharp pdfptable pdfstamper


    【解决方案1】:

    首先:如果您不展平表单,您的代码将永远无法工作。在使用 LiveCycle Designer 创建的文档中,PDF 充当 XML 的容器。 PdfPTable 可用于创建 PDF 语法,这与 XML 非常不同。

    其次:在您的代码示例中,您要在第一页的现有内容上添加一个表格。这是你的意图吗?为什么不使用表格创建一个单独的文档,然后将从头创建的文档与已填写并扁平化的表单合并? 您是否假设现有内容会重排?在这种情况下,您不懂 PDF,请多阅读。

    假设您正在使用此代码:

    var cb = pdfStamper.GetOverContent(1);
    var ct = new ColumnText(cb);
    ct.Alignment = Element.ALIGN_CENTER; 
    ct.SetSimpleColumn(36, 36, PageSize.A4.Width-36, PageSize.A4.Height-300); 
    ct.AddElement(table);
    ct.Go();
    

    如果这对您来说很好,除非表格放不下一页,为什么不插入第二页?您指的是有一行的示例:

    int status = ct.go(); 
    

    您应该使用 status 的值来确定表格是否适合列。只要表格没有完全呈现,您就应该插入页面,并将表格的一部分添加到这些新页面中。

    当然:如果你调整你的表单,你的设计会更好,而不是发明一些“混合”方法。

    【讨论】:

    • 首先:我确实将表格展平。在 LiveCycle 中,可以选择创建静态 PDF 或 XFA,我选择前者,您说的是后者。其次:我可以轻松地标记一页并将其与生成的表合并,这不是问题要问的。存在大量信息可以执行您所暗示的操作。 GetOverContent 对我不起作用,如果您不理解,请再次阅读我的问题。为什么我不插入第二页?请告诉我你是如何对一个超过 2 页的表格的现有 pdf 执行此操作的。
    • 如果我“适应”我的表单,我的设计当然会更好?所以请先生,在您最开明的状态下,请教给我们愚蠢的人您将如何做到这一点。
    • 你得到了我的反对,因为你没有阅读问题,然后你没有回答问题,然后你提供了所有的绒毛,没有解决方案,最重要的是,你的态度需要修正.
    • 好的,所以你免费使用 iTextSharp,你选择侮辱图书馆的原作者以及写两本书的人。你还期待答案吗?
    • 我对这个问题投了反对票,因为您说“GetOverContent 对我来说不能正常工作”而没有解释为什么它不能正常工作。 GetOverContent 可以完美地添加内容。当然:如果内容不合适,您需要添加更多页面。如何添加更多页面?好吧,到目前为止,您只是尝试侮辱 iText 的作者和 iText in Action 书籍。也许您会使用 insertPage 方法获得更多成功:api.itextpdf.com/itext/com/itextpdf/text/pdf/…
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多