如何在pdf中为多条记录iTextsharp添加新页面

时间:2014-02-10 10:32:13

标签: c# .net itextsharp

我有一个xml并使用iTextsharp映射到pdf表单字段。它适用于单一记录。但是当存在多个记录时,它不会在输出pdf中添加第二条记录。这是一个代码

public static void GeneratePdf(string sin, List<XElement> elements)
        {
            var pdfTemplate = HttpContext.Current.Server.MapPath("~/input.pdf");

            var newFile = HttpContext.Current.Server.MapPath("~/output.pdf");

            var pdfReader = new PdfReader(pdfTemplate);
            var pdfStamper = new PdfStamper(pdfReader, new FileStream(
                newFile, FileMode.Create));

            foreach (var element in elements)
            {
                foreach (var elem in elements.Elements())
                {
                    pdfStamper.AcroFields.SetField(elem.Name.ToString(), (string)elem);
                }
            }

            pdfStamper.FormFlattening = false;
            pdfStamper.Close();
        } 

1 个答案:

答案 0 :(得分:0)

您的问题不明确,因为您没有告诉我们您表单的性质。

如果您的表格基于ACROFORM技术

请查看此视频教程:http://itextpdf.com/codenvy_webapp

您可以在此处找到本教程中使用的示例:https://github.com/blowagie/itextsamples

您还可以在此处找到独立示例:http://itextpdf.com/sandbox/acroforms/reporting

请注意,有一个例子“如何不做”。请确保使用正确的示例:FillFlattenMerge2

Document document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
document.open();
ByteArrayOutputStream baos;
PdfReader reader;
PdfStamper stamper;
AcroFields fields;
while (myApp.hasMoreRecords()) {
    baos = new ByteArrayOutputStream();
    reader = new PdfReader(SRC);
    stamper = new PdfStamper(reader, baos);
    fields = stamper.getAcroFields();
    myApp.processNextRecord(fields);
    stamper.setFormFlattening(true);
    stamper.close();
    reader.close();
    // add the PDF to PdfCopy
    reader = new PdfReader(baos.toByteArray());
    copy.addDocument(reader);
    reader.close();
}
document.close();

请注意,myApp是您可以编写以循环遍历记录集的自定义类的实例。您将实现方法hasMoreRecords()processNextRecord()来循环记录并逐个处理它们。

如果您的表单基于XML格式架构

在这种情况下,您使用了错误的方法。您无法使用setField()方法填写动态表单。它适用于一条记录的事实表明您的表单是AcroForm或混合XFA表单。在这两种情况下都无法实现您想要的效果,而无需将您的表单更改为纯粹的动态XFA表单。

只要您拥有纯动态XFA表单,就需要使用以下代码:

PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader,
        new FileOutputStream(dest));
AcroFields form = stamper.getAcroFields();
XfaForm xfa = form.getXfa();
xfa.fillXfaForm(new FileInputStream(xml));
stamper.close();
reader.close();

我再说一遍:只有拥有正确的表单,此代码段才有效。问题中的元素表明情况并非如此。如果您的表单不是动态XFA表单,您将找不到任何可以实现您想要的软件!!!

观看这些电影了解更多信息:http://itextpdf.com/product/xfa_worker