首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用iTextsharp将FDF写成PDF格式

用iTextsharp将FDF写成PDF格式
EN

Stack Overflow用户
提问于 2013-06-24 10:47:20
回答 2查看 3.3K关注 0票数 1

我试图保存一个PDF文件,方法是将数据从FDF保存到一个PDFTemplate中,在我的WPF应用程序中。

所以情况是这样的。我有一个PDFTemplate.pdf,它用作模板,并有占位符(或字段)。现在,我以亲语法的方式生成这个FDF文件,它反过来包含要填充PDFTemplate所需的所有字段名。此外,这个FDF还包含PDFTemaplte的文件路径,以便在打开时知道要使用哪个PDF

现在,当尝试并双击FDF时,它将打开Adober Acrobat Reader,并使用填充的数据显示PDFTemplate。但是我不能使用“文件”菜单保存这个文件,因为它说这个文件将在没有数据的情况下保存。

因此,我决定使用iTextsharp,读取文件,读取FDF文件并从中获取数据,并创建另一个PDF文件,并将其与数据一起保存。

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

代码语言:javascript
复制
    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();
    }

我不知道我做错了什么。请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-26 08:09:38

我不使用MemoryStream就可以做到这一点。

代码语言:javascript
复制
  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中时,有些东西不起作用,不确定是什么原因。

但我试着让它更简单,而且成功了。

票数 1
EN

Stack Overflow用户

发布于 2014-06-27 14:51:41

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

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17273610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档