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

更新:

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

原版的:

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

我打开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岁,有一个更老版本的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:在一页上调整2个元素,仅限于一个页面表。 它可以是可扩展的,但似乎你必须在后续页面上计算页眉/页脚。

以及在同一大方向上的各种未解答的问题:

将动态表添加到pdf模板

itextsharp将Pdfptable放置在所需位置

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

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

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