2010-07-29 102 views

Respuesta

16

Debería encontrar los nombres de los campos en el formulario PDF. Obtenga los campos y luego lea su valor.

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

Obviamente en el código anterior, el nombre del campo es el nombre del campo de formulario PDF y el método GetField devuelve una representación de cadena de ese valor. Here es un artículo con código de ejemplo que probablemente pueda usar. Muestra cómo puede leer y escribir campos de formulario con iTextSharp.

+0

esto funciona como un encanto ... Me pregunto por qué no he mirado en esta función cuando .. Intenté cada otra función :). Muchas gracias ... me salvaste el fin de semana. – Bhuvan

+1

Anuncio de servicio público: El siguiente código no le proporcionará lo que desea: 'pdfReader.AcroFields.Fields [" fieldName "]. Value'. Perdí unas horas antes de encontrar esta publicación. –

+1

Hola. Creo que hay un error en la tercera línea de tu ejemplo. La forma correcta sería: 'AcroFields fields = pdfReader.AcroFields;' – cesAR

2

Si está usando Powershell, el código descubrimiento de los campos es:

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 

Este código le dará los nombres de todos los campos de la Documento PDF, "something_important.pdf".

Esta es la forma de acceder a cada campo una vez que se conoce el nombre del campo:

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

Esto funcionó para mí! ¡Tenga en cuenta los parámetros al definir el estampador! '\ 0', la verdadera

  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

El OP solo quería leer * datos de formulario PDF * (y obtuvo una buena respuesta para eso). Su código muestra cómo * cambiar los datos del formulario PDF. * – mkl

+0

Lo sentimos, de hecho publicamos la respuesta en el hilo equivocado ...Esto significaba una explicación sobre cómo insertar valores en los campos y preservar la edición de formularios cuando el archivo se abre de nuevo ... – Serg

7

Tal vez la biblioteca iTextSharp ha cambiado recientemente, pero no fue capaz de obtener la respuesta aceptada para trabajar. Aquí está mi solución:

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); 
    } 
} 

Una diferencia muy sutil, debido a reader.AcroFields.Fields que devuelven un IDictionary en lugar de sólo un objeto AcroFields.

+0

esto funciona, pero es realmente lento, toma más de un minuto leer ~ 3000 campos. ¿Alguien sabe una forma más rápida de enumerar estos? Intenté hacerlo en paralelo, pero eso no pareció ayudar. – DLeh

1

El nombre PDF es "REPORT.pdf" ..

El campo de datos para ser leídos en TextBox1 es "TextField25" en el PDF ..

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

Nota importante: Esto se puede usar SOLAMENTE SI el PDF no está aplanchado (significa que los campos deben ser editables) mientras se creó usando iTextSharp ..

es decir

 pdfStamper.FormFlattening = False 

Esto es muy simple .. Y funciona como un encanto .. :)

Cuestiones relacionadas