C# iTextSharp-打印合并的PDF模板

C# iTextSharp-打印合并的PDF模板,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我正在asp.net(C#)中使用iTextSharp来合并多个PDf模板。“打印”功能仅打印模板的数据。合并模板时,使用iTextSharp的RenameField方法重命名模板中可用的字段/控件。 此实现破坏了打印功能。因为打印功能已根据字段写入。 对于合并模板,我使用PDFCopy Document document = new Document(); bool flag = true; using (FileStream fileStream = File.Create(newFile)

我正在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());
    }
 }
Document Document=新文档();
布尔标志=真;
使用(FileStream FileStream=File.Create(newFile))
{
PdfSmartCopy copy=新的PdfSmartCopy(文档、文件流);
PDF阅读器;
记忆流;
for(int i=0;i
Edit1:这是我在itextsharp文档中找到的解决方案,但它不起作用 “将PdfCopy与文档一起使用 具有命名目的地的是这些例外之一 作为链接注释,与PdfCopy一起保留,但它们不再适用于指向本地的链接 命名目的地。此问题有一个解决方法。“

PdfReader[]读卡器={
新的PdfReader(LinkActions.RESULT2),
新的PdfReader(LinkActions.RESULT1)};
文档=新文档();
PdfCopy副本=
新的PdfCopy(文档、新文件输出流(RESULT1));
document.open();
int n;
for(int i=0;i
表单不再工作,因为您忘记添加一行:
copy.setMergeFields()

请参见示例:

一次添加所有文档更安全:

copy.addDocument(reader);
重要提示:


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

合并两个pdf文档时是否遇到问题?根据您的描述,您的模板有一些特殊之处。它们的特殊打印功能似乎与重命名的AcroForm字段不兼容。不幸的是,如果要合并多个模板,则必须重命名它们。因此,您还必须使打印功能适应重命名的字段。如果您要合并。@不,合并后,模板顶部的操作按钮不起作用。对于合并pdf,我使用了PdfCopy和重命名字段功能,之后,我的链接按钮不起作用;不适用于我,是的,我的模板由一个页面组成,我尝试在循环中用不同的数据填充它。我使用PdfSmartCopy合并它,合并时我重命名字段。在示例中我也是,但我没有任何“打印”功能。阅读你的问题的人不知道你提到“打印”功能时的意思,因此,你不应该期望解决问题的答案是你能给出的唯一反馈。也许您应该向我们展示“打印”功能的代码。这不是关于打印功能,而是关于模板顶部已经存在的操作按钮。我不知道后面写的是什么功能,以前我没有使用PdfSmartCopy和renameFields()生成单个pdf,但现在我必须合并多个pdf。在这种情况下,操作按钮不起作用。我已经共享了代码。我找不到该操作按钮的代码。如果该代码引用名为
myField
的字段,并且如果您将该字段的名称更改为
myField1
,那么您的操作按钮显然不再工作,因为操作按钮后面的代码将找不到任何名为
myField
的字段。我重复一遍:如果你不在动作按钮后面显示代码,那么没有人能帮助你。
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);