3

更新:

经过一番讨论,我们决定使用 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 岁的尝试,它使用了更旧版本的 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 放在所需位置

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

4

1 回答 1

0

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

其次:在您的代码示例中,您将在第一页的现有内容上添加一个表格。这是你的意图吗?为什么不使用表格创建一个单独的文档,然后将从头创建的文档与已填写并扁平化的表单合并?您是否假设现有内容会重排?在这种情况下,您不懂 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 的值来确定表格是否适合该列。只要表格没有完全呈现,您就应该插入页面,并将表格的一部分添加到这些新页面中。

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

于 2012-09-11T10:06:58.110 回答