iTextSharp - 打印合并的PDF模板

时间:2015-09-14 14:56:58

标签: c# pdf itextsharp

我在asp.net(C#)中使用iTextSharp以合并多个PDf模板。打印功能仅打印模板的数据。在合并模板时,使用iTextSharp的RenameField方法重命名模板中可用的字段/控件。 此实现已破坏打印功能。由于打印功能已根据字段编写。 对于合并模板,我使用的是PDFCopy。

Document document = new Document();
bool flag = true;
using (FileStream fileStream = File.Create(newFile))
{
    PdfSmartCopy copy = new PdfSmartCopy(document, fileStream);
    PdfReader reader;
    MemoryStream baos;
    for (int i = 0; i < loopCount; i++)
    {
        reader = new PdfReader(pdfTemplate);
        baos = new MemoryStream();
        stamper = new PdfStamper(reader, baos);
        AcroFields pdfDoc = stamper.AcroFields;
        BuildData(datarow,pdfDoc, obj)
        renameFields(reader);
         stamper.FormFlattening = false;
         stamper.Close();
        reader = new PdfReader(baos.ToArray());
        copy.AddPage(copy.GetImportedPage(reader, 1));
    }
    document.Close();
    strFileName = newFile;
}

private static void renameFields(PdfReader pdfReader)
{
    string prepend = String.Format("_{0}", counter++);
    foreach (KeyValuePair<string, AcroFields.Item> de in pdfReader.AcroFields.Fields)
    {
         pdfReader.AcroFields.RenameField(de.Key.ToString(), prepend + de.Key.ToString());
    }
 }

Edit1:这是我在itextsharp doc中找到的解决方案,但是它没有工作 &#34;将PdfCopy与文档一起使用 具有命名目标的是其中一个例外。所有注释,例如 作为链接注释,与PdfCopy一起保存,但它们不再适用于本地链接 命名目的地。这个问题有一个解决方法。&#34;

PdfReader[] readers = {
new PdfReader(LinkActions.RESULT2),
new PdfReader(LinkActions.RESULT1) };
Document document = new Document();
PdfCopy copy =
new PdfCopy(document, new FileOutputStream(RESULT1));
document.open();
int n;
for (int i = 0; i < readers.length; i++) {
readers[i].consolidateNamedDestinations();
n = readers[i].getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(readers[i], ++page));
}
} 

1 个答案:

答案 0 :(得分:0)

表单不再有效,因为您忘记添加一行:copy.setMergeFields();

请参阅MergeForms2示例:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
    copy.setMergeFields();
    document.open();
    List<PdfReader> readers = new ArrayList<PdfReader>();
    for (int i = 0; i < 3; ) {
        PdfReader reader = new PdfReader(renameFields(src, ++i));
        readers.add(reader);
        copy.addDocument(reader);
    }
    document.close();
    for (PdfReader reader : readers) {
        reader.close();
    }
}

public byte[] renameFields(String src, int i) throws IOException, DocumentException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, baos);
    AcroFields form = stamper.getAcroFields();
    Set<String> keys = new HashSet<String>(form.getFields().keySet());
    for (String key : keys) {
        form.renameField(key, String.format("%s_%d", key, i));
    }
    stamper.close();
    reader.close();
    return baos.toByteArray();
}

您似乎还假设您的模板只包含一个页面:

copy.addPage(copy.getImportedPage(reader, 1));

一次添加文档更安全:

copy.addDocument(reader);

重要:

我的例子是用Java编写的。您正在使用C#中的iTextSharp。您必须通过将特定于Java的方法更改为C#特定的属性或方法来调整方法。