1

我正在尝试通过将FDF中的数据保存到我的WPF应用程序中的PDFTemplate来保存PDF文件。

所以,情况是这样的。我有一个PDFTemplate.pdf作为模板并具有占位符(或字段)。现在我以编程方式生成这个FDF文件,该文件又包含要填写的PDFTemplate所需的所有字段名称。此外,这个FDF还包含PDFTemaplte的文件路径,因此在打开时,它知道要填写哪个PDF利用。

现在,当尝试双击FDF时,它会打开Adob​​er Acrobat Reader并显示填充了数据的PDFTemplate。但我无法使用“文件”菜单保存此文件,因为它说此文件将在没有数据。

所以,然后我决定使用iTextsharp,阅读PDFTemaplate文件,阅读FDF文件并从那里获取数据,然后创建另一个PDF文件并将其与数据一起保存。

以下是我正在使用的代码,但是当我打开新保存的文件时,它说文件已损坏且无法修复:

    using (MemoryStream pdfFlat = new MemoryStream())
    using (PdfReader pdfReader = new PdfReader(templateLocation))
    using(PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfFlat))
    using(FdfReader fdfReader = new FdfReader(fdfFileNameAndPath))
    {
        AcroFields pdfForm = pdfStamper.AcroFields;
        pdfForm.SetFields(fdfReader);
        pdfStamper.FormFlattening = true;
        pdfStamper.Writer.CloseStream = false;

        using (FileStream saveStream = 
            new FileStream(
                outputFileNameAndPath, 
                FileMode.Create, 
                FileAccess.Write))
        {
            pdfFlat.WriteTo(saveStream);
            pdfFlat.Flush();
            saveStream.Close();
        }

        fdfReader.Close();
        pdfStamper.Close();
        pdfReader.Close();
        pdfFlat.Close();
    }

我不确定我做错了什么。请帮忙。

4

2 回答 2

1

我能够通过不使用MemoryStream来做到这一点:

  File.Copy(formLocation, outputFileNameAndPath, true);

  using (FileStream pdfFlat = new FileStream(outputFileNameAndPath,FileMode.Open))
  using (PdfReader pdfReader = new PdfReader(formLocation))
  using (PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfFlat))
  using (FdfReader fdfReader = new FdfReader(fdfFileNameAndPath))
  {
      AcroFields pdfForm = pdfStamper.AcroFields;

      pdfForm.SetFields(fdfReader);
      pdfStamper.FormFlattening = true;
      pdfStamper.Writer.CloseStream = false;

      fdfReader.Close();
      pdfStamper.Close();
      pdfReader.Close();
      pdfFlat.Close();
  }

我不确定,但是当我使用MemoryStream打开文件然后将其保存到另一个FileStream时,有些东西不起作用,不知道是什么。

但我试图让它更简单,它奏效了。

于 2013-06-26T08:09:38.413 回答
0

这是一个使用内存流而不是文件流的类似示例。我相信您只需将内存流位置设置为 0。我还从 fdf FileSpec 属性中获取 pdf 模板文件名,如果您有多个可能的模板,这将很有帮助。

using (Stream stream = new MemoryStream())
using (FdfReader fdfReader = new FdfReader(fdfFilePath))
using (PdfReader pdfReader = new PdfReader(fdfReader.FileSpec))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, stream)) {
    AcroFields pdfForm = pdfStamper.AcroFields;
    pdfForm.SetFields(fdfReader);
    pdfStamper.FormFlattening = true;
    pdfStamper.Writer.CloseStream = false;

    fdfReader.Close();
    pdfStamper.Close();
    pdfReader.Close();

    stream.Position = 0;
    //string contentType = "application/pdf";
    //SaveStreamToCloudStorage(contentType, stream, cloudStorageFileName);
}
于 2014-06-27T14:51:41.127 回答