如何将PdfPTable插入现有的PDF模板?

时间:2012-09-11 07:37:36

标签: c# pdf itextsharp pdfptable pdfstamper

更新

经过一番讨论后,我们决定选择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");

这是直截了当的。

然后我尝试添加一个表格,该表格将从几个页面上的设定位置开始。有一个3岁的here尝试使用更旧版本的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

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

1 个答案:

答案 0 :(得分:0)

首先:如果你没有展平表单,你的代码就不会起作用了。在使用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的值来确定表是否适合列。只要表格没有完全呈现,您应该插入页面,并将表格的一部分添加到这些新页面。

当然:如果你改编自己的形式,你的设计会好得多,而不是发明一些“混合”方法。