2010-07-29 112 views

回答

16

您必須在PDF表格中找到字段名稱。獲取字段,然後閱讀它們的值。

string pdfTemplate = "my.pdf"; 
PdfReader pdfReader = new PdfReader(pdfTemplate); 
AcroFields fields = pdfReader.AcroFields.Fields; 
string val = fields.GetField("fieldname"); 

顯然,在上面的代碼中,字段名是PDF形式字段的名稱和getfield命令方法返回該值的字符串表示。 Here是一個帶有可能使用的示例代碼的文章。它展示瞭如何使用iTextSharp來讀寫表單字段。

+0

這就像一個魅力...我不知道爲什麼我沒有看過這個功能..當我嘗試了其他所有功能:)。非常感謝..你救了我的週末。 – Bhuvan 2010-07-30 23:22:03

+1

公共服務公告:以下代碼不會得到你想要的:'pdfReader.AcroFields.Fields [「fieldName」] .value'。我在發現這篇文章之前浪費了幾個小時。 – 2013-06-21 13:55:23

+1

嗨。我認爲你的例子的第三行有一個錯誤。 正確的形式是:'AcroFields fields = pdfReader.AcroFields;' – cesAR 2017-07-18 17:43:43

2

如果你正在使用PowerShell中,用於場發現的代碼是:

Add-Type -Path C:\Users\Micah\Desktop\PDF_Test\itextsharp.dll 
    $MyPDF = "C:\Users\Micah\Desktop\PDF_Test\something_important.pdf" 
    $PDFDoc = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $MyPDF 
    $PDFDoc.AcroFields.Fields 

該代碼會給你的PDF文檔,「something_important.pdf」的所有字段的名稱。

這是一旦你知道該字段的名稱,你如何訪問每個字段:

$PDFDoc.AcroFields.GetField("Name of the field here") 
2

這爲我工作! 注意定義壓模時的參數! '\ 0',true

  string TempFilename = Path.GetTempFileName(); 

      PdfReader pdfReader = new PdfReader(FileName); 
      //PdfStamper stamper = new PdfStamper(pdfReader, new FileStream(TempFilename, FileMode.Create)); 
      PdfStamper stamper = new PdfStamper(pdfReader, new FileStream(TempFilename, FileMode.Create), '\0', true); 

      AcroFields fields = stamper.AcroFields; 
      AcroFields pdfFormFields = pdfReader.AcroFields; 

      foreach (KeyValuePair<string, AcroFields.Item> kvp in fields.Fields) 
      { 
       string FieldValue = GetXMLNode(XMLFile, kvp.Key); 
       if (FieldValue != "") 
       { 
        fields.SetField(kvp.Key, FieldValue); 
       } 
      } 

      stamper.FormFlattening = false; 
      stamper.Close(); 
      pdfReader.Close() 
+0

OP只希望*閱讀PDF表格數據*(並且得到了很好的答案)。您的代碼顯示如何*更改PDF格式的數據。* – mkl 2013-09-03 08:10:58

+0

對不起,實際上已將答案發布到錯誤的線程中...這意味着解釋如何將值壓入字段並在文件再次打開時保留表格編輯... – Serg 2013-09-04 20:02:15

7

也許iTextSharp庫最近發生了變化,但我無法獲得接受的工作答案。這裏是我的解決方案:

var pdf_filename = "pdf2read.pdf"; 
using (var reader = new PdfReader(pdf_filename)) 
{ 
    var fields = reader.AcroFields.Fields; 

    foreach (var key in fields.Keys) 
    { 
     var value = reader.AcroFields.GetField(key); 
     Console.WriteLine(key + " : " + value); 
    } 
} 

一個很細微的區別,由於reader.AcroFields.Fields返回一個IDictionary,而不是隻是一個AcroFields的對象。

+0

這可以工作,但速度很慢,需要花費一分鐘才能讀取〜3000字段。任何人都知道一個更快的方式來枚舉這些?我試着平行做,但似乎沒有幫助。 – DLeh 2016-10-18 04:47:00

1

PDF格式的名稱是 「report.pdf」 ..

數據字段讀入TextBox1中的 「TextField25」 中的PDF ..

 Dim pdf As String = "report.pdf" 
     Dim reader As New PdfReader(pdf) 
     Dim fields As AcroFields = reader.AcroFields 
     TextBox1.Text = fields.GetField("TextField25") 

重要提示:這可以使用只有如果的PDF不扁平(意味着這些字段應該是可編輯的),而它是使用iTextSharp創建的。

 pdfStamper.FormFlattening = False 

這是非常簡單的。而它的工作原理就像一個魅力.. :)