2010-07-29 110 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 

这是非常简单的。而它的工作原理就像一个魅力.. :)