iTextSharp填写表格并创建多个页面

时间:2014-06-02 14:43:27

标签: vb.net itextsharp

我有以下书面代码

    Dim template As String = Server.MapPath("files/") & "2_paged_form.pdf"
    Dim newFile As String = Server.MapPath("exports/") & "newFile.pdf"

    Dim reader = New PdfReader(template)

    Dim output = New FileStream(newFile, FileMode.Create, FileAccess.Write)

    Dim stamp = New PdfStamper(reader, output)
    stamp.AcroFields.SetField("client", "hello")
    stamp.AcroFields.SetField("name", "test test")
    stamp.AcroFields.SetField("address", "Hellocourt")
    stamp.AcroFields.SetField("postcode", "xx 3xx")
    stamp.AcroFields.SetField("dob", "11/02/1987")
    stamp.FormFlattening = True
    stamp.Close()

    output.Close()
    reader.Close()

我设法创建了一个newfile.pdf,只有2_paged_form.pdf中的一次性条目。

但是我有多个信息要循环,以便newfile.pdf有多个条目。例如newfile.pdf应该有10个页面,包含5个不同的条目。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

官方iText网站和书中记录了这一点。

如果您更喜欢观看视频,可以观看this tutorial。您可以尝试示例here。您需要输入“填充,拼合和合并:如何正确执行”。这些示例的代码可以在这里找到:FillFlattenMerge2。请注意,还有一个FillFlattenMerge1示例演示 NOT 如何执行此操作。请不要使用该示例; - )

如果您更喜欢看书,请下载Chapter 6 of "iText in Action - Second Edition"。您已经知道如何填写一个表单(如第185页所述),您现在想要合并不同的结果。同样,有一个关于如何执行此操作的示例(第190页)以及 应如何执行此操作(第190-191页)。

我从未写过一行vb.net,但请把这个Java代码看作是伪代码:

PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
document.open();
ByteArrayOutputStream baos;
PdfReader reader;
PdfStamper stamper;
AcroFields fields;
while (data.hasMoreElements()) {
    // create a PDF in memory
    baos = new ByteArrayOutputStream();
    reader = new PdfReader(SRC);
    stamper = new PdfStamper(reader, baos);
    fields = stamper.getAcroFields();
    MyData myData = data.nextElement();
    fields.setField("name", myData.getName());
    fields.setField("address", myData.getAddress());
    ...
    stamper.setFormFlattening(true);
    stamper.close();
    reader.close();
    // add the PDF to PdfCopy
    reader = new PdfReader(baos.toByteArray());
    copy.addDocument(reader);
    reader.close();
}
document.close();

如您所见,您需要创建以填充表单,从而生成保存在内存中的PDF。然后,您需要从内存中读取此PDF并使用PdfSmartCopy方法将其添加到addDocument()实例。

<强> P.S。 1: 示例有什么问题?它会导致文本膨胀,因为表单的静态内容会在复制表单时多次添加。 PdfSmartCopy检查冗余信息,并仅添加一次静态内容。

P.S。 2:为什么有糟糕的方式呢?如果您合并的文档非常不同,那么糟糕的方式实际上是一种好方法。在这种情况下,方式更快,内存更少,因此实际上是方式。当您合并彼此非常相似的文档时,例如填充了不同数据集的相同表单,这是唯一不好的。