更新
经过一番讨论后,我们决定选择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。
答案 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的值来确定表是否适合列。只要表格没有完全呈现,您应该插入页面,并将表格的一部分添加到这些新页面。
当然:如果你改编自己的形式,你的设计会好得多,而不是发明一些“混合”方法。