【问题标题】:iTextSharp - unable to merge files with form dataiTextSharp - 无法将文件与表单数据合并
【发布时间】:2012-02-10 16:57:29
【问题描述】:

我正在尝试合并包含表单数据的 PDF 文件。我在 StackOverflow 上尝试了几个不同的 iTextSharp 示例,但它们都导致相同的行为:合并的第一个 PDF 文档保留其表单数据,但随后的 PDF 文档会丢失其表单数据。我还尝试使用下面的代码在合并之前展平文档,但这只会导致所有表单数据完全丢失。

public static byte[] FlattenPdfForm(byte[] bytes)
{
    PdfReader reader = new PdfReader(bytes);

    using (MemoryStream stream = new MemoryStream())
    {
        PdfStamper stamper = new PdfStamper(reader, stream) { FormFlattening = true };
        stamper.Close();
        reader.Close();
        return stream.ToArray();
    }
}

我尝试合并的 PDF 文档是从 UPS API 返回的。这是一个示例文档:http://dl.dropbox.com/u/9005746/OriginalPDF.pdf

您对如何在维护表单数据的同时将上述多个 PDF 文件合并为一个 PDF 有什么建议吗?

【问题讨论】:

  • 尝试以两种不同的方式合并您在上面链接的测试文档:[1] 像您尝试的那样展平,以及 [2] 重命名各个表单字段。得出了和你一样的结果。您有 PDF 验证器吗? iText[Sharp] 不能很好地处理 border PDF - 不符合 PDF 规范的 PDF。您的测试 PDF 是我遇到的第一个我无法与 iTextSharp 合并的 PDF。
  • IText merge documents with acrofields(如果您想合并表单并保持交互性)和iText 5.5 fails to fill form 的可能副本,如果您想知道为什么字段内容在展平后会丢失。

标签: c# pdf pdf-generation itextsharp


【解决方案1】:

这段代码很适合我:

PdfCopyFields copier = new PdfCopyFields(new FileStream(tgtfilename, FileMode.Create));
int doc = 0;

foreach (string filename in srcfilenames)
{
    PdfReader reader = new PdfReader(filename);

    // This should ensure field names are unique across merged documents
    foreach (var item in reader.AcroFields.Fields)
        reader.AcroFields.RenameField(item.Key, String.Format("_D{0}_{1}", doc++, item.Key));

    copier.AddDocument(reader);
}

copier.Close();

我改编自this answer

【讨论】:

    【解决方案2】:

    对上述代码稍作改动对我有用

    public static void CreateBulkPdfFile(string[] fileNames, string outFile)
    {
      PdfCopyFields copier = new PdfCopyFields(new FileStream(outFile, FileMode.Create));
      int doc = 0;
    
      foreach (string filename in fileNames)
      {          
        PdfReader reader = new PdfReader(filename);
    
        // This should ensure field names are unique across merged documents
        foreach (var item in reader.AcroFields.Fields)
          reader.AcroFields.RenameField(item.ToString(), String.Format("_D{0}_{1}", doc++, item.ToString()));
    
        copier.AddDocument(reader);         
      }
    
      copier.Close();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多