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

标签 c# pdf itext 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");

这是简单明了的。

然后我尝试添加一个表格,该表格将从多个页面的设置位置开始。有这个 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。

最佳答案

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

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

关于c# - 如何将 PdfPTable 插入现有的 PDF 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364926/

相关文章:

c# - 在不使用匿名委托(delegate)的情况下将状态数据传递到 Parallel.ForEach

php - Android 浏览器拒绝内容处置 :inline?

android - 如何将pdf转换为图像?

pdf - 让 Crystal 在 PDF 中正确嵌入 TT 字体

c# - iText7:无法读取许可证 key json 文件

c# - 如何将数据转换为pdf文件,然后插入到zip并下载

C# MongoDB 驱动程序——需要简单的代码来读取/查询集合

itext - iText是否尊重颜色透明度?

c# - 为什么我在发送 SMTP 电子邮件时收到“"' 属性无法分配”?

iTextSharp ColumnText.SetSimpleColumn Addtext 导致 Adob​​e Reader X 10.1.5 中出现错误