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

+1

Объявление о государственной службе: Следующий код не даст вам то, что вы хотите: 'pdfReader.AcroFields.Fields [" fieldName "]. Value'. Я потратил несколько часов, прежде чем нашел этот пост. –

+1

Привет. Я думаю, что есть ошибка в третьей строке вашего примера. Правильная форма: 'AcroFields fields = pdfReader.AcroFields;' – cesAR

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

+0

Извините, на самом деле отправил ответ в неправильную тему ...Это означало объяснение того, как вводить значения в поля и сохранять редактирование формы, когда файл снова открывается ... – Serg

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

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 

Это очень просто .. И это работает как шарм .. :)