2

我需要用另一個單詞替換現有PDF AcroField中的單詞。我正在使用iTEXTSHARP的PDFStamper來做同樣的事情,它工作正常。但是,這樣做需要創建一個新的PDF,我希望這些更改能夠反映在現有的PDF本身中。如果我將目標文件名設置爲與原始文件名相同,則不會有任何變化。我是iTextSharp的新手,有什麼我做錯了嗎?請幫助..我我使用如何在不創建新PDF的情況下更新PDF?

private void ListFieldNames(string s) 
    { 
     try 
     { 
      string pdfTemplate = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf"; 
      string newFile = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf"; 
      PdfReader pdfReader = new PdfReader(pdfTemplate); 

      for (int page = 1; page <= pdfReader.NumberOfPages; page++) 
      { 
       PdfReader reader = new PdfReader((string)pdfTemplate); 
       using (PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite))) 
       { 
        AcroFields form = stamper.AcroFields; 
        var fieldKeys = form.Fields.Keys; 
        foreach (string fieldKey in fieldKeys) 
        { 
         //Replace Address Form field with my custom data 
         if (fieldKey.Contains("Address")) 
         { 
          form.SetField(fieldKey, s); 
         }  
        } 
        stamper.FormFlattening = true; 
        stamper.Close(); 

       } 

      } 
     } 

回答

5

正如我在書中記載iText in Action提供一段代碼,您無法讀取文件的同時寫入。想想Word是如何工作的:你無法打開Word文檔並直接寫入。 Word總是創建一個臨時文件,將更改寫入它,然後用它替換原始文件,然後丟棄該臨時文件。

你可以做到這一點:

  • 閱讀PdfReader原始文件,
  • 創建一個臨時文件PdfStamper,當你完成後,
  • 與臨時替換原文件文件。

或者:

  • 讀取原始文件轉換成byte[]
  • 創建PdfReader這個byte[],並
  • 使用路徑到原始文件的PdfStamper

第二個選項更加危險,因爲如果您在PdfStamper中做了導致例外的情況,您將丟失原始文件。

+0

我遵循你的第一個方法,並使用壓模創建一個臨時文件,後來用它來替換原始文件。但是,由於PDF是從SDL Tridion發佈並存儲在Tridion文件系統中的,因此我們無法對原始編輯/刪除進行任何更改。 Evrytime我嘗試刪除原來的以下錯誤: e:\ Web \ Compliance \ NonPCI \ SDL \ wwwroot \ xyzrights \ updatePdf.aspx:line 150訪問路徑'E:\ Web \ Compliance \ NonPCI \ SDL \ wwwroot \ xyzrights \ Images \ ListPrograming_Part1_AcroForm.pdf'被拒絕。 請幫忙.. – tk2013

+1

如果您沒有刪除文件的權限,您可能沒有權限更新它。其權限可能設置爲只讀。您需要聯繫系統管理員。這不再是一個iText問題,而是一個關於文件權限的問題。 –

+0

@BrunoLowagie你能解釋一下這一點嗎? => **使用原始文件的路徑作爲PdfStamper ** – jason

相關問題