簡體   English   中英

使用iTextsharp將FDF寫入PDF

[英]Write FDF to PDF using iTextsharp

我試圖通過將數據從FDF保存WPF應用程序中的PDFTemplate中來保存PDF文件。

所以,情況就是這樣。 我有一個PDFTemplate.pdf ,它用作模板並具有占位符(或字段)。 現在,我以語法方式生成此FDF文件,該文件又包含要填充PDFTemplate所需的所有字段名稱。此外,此FDF還包含PDFTemaplte的文件路徑,因此在打開時,它知道要處理的PDF采用。

現在,當嘗試雙擊FDF時 ,它會打開Adober 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();
    }

我不確定我在做什么錯。 請幫忙。

我能夠通過不使用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時 ,某些操作不起作用,不確定是什么。

但是我試圖使其更簡單並且有效。

這是使用內存流而不是文件流的類似示例。 我相信您只需要將內存流位置設置為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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM