2010-07-29 24 views

risposta

16

Dovresti trovare i nomi dei campi nel modulo PDF. Prendi i campi e poi leggi il loro valore.

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

Ovviamente nel codice precedente, nome di campo è il nome del campo modulo PDF e il metodo GetField restituisce una rappresentazione di stringa di tale valore. Here è un articolo con codice di esempio che probabilmente potresti usare. Mostra come puoi leggere e scrivere i campi dei moduli usando iTextSharp.

+0

questo funziona come un fascino ... Mi chiedo perché non ho guardato in questa funzione .. quando Ho provato ogni altra funzione :). Grazie mille ... hai salvato il mio weekend. – Bhuvan

+1

Annuncio di servizio pubblico: il seguente codice non ti darà quello che vuoi: 'pdfReader.AcroFields.Fields [" fieldName "]. Value'. Ho perso un paio d'ore prima di trovare questo post. –

+1

Ciao. Penso che ci sia un errore nella terza riga del tuo esempio. Il modulo corretto sarebbe: 'Campi AcroField = pdfReader.AcroFields;' – cesAR

2

Se si utilizza PowerShell, il codice di scoperta per i campi è:

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 

Quel codice vi darà i nomi di tutti i campi del documento PDF, "something_important.pdf".

Questo è il modo per accedere ogni campo una volta che si conosce il nome del campo:

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

Questo ha funzionato per me! Annota i parametri quando definisci il timbro! '\ 0', vero

  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

L'OP voleva solo * leggere i dati del modulo PDF * (e ottenere una buona risposta per questo). Il tuo codice mostra come * modificare i dati del modulo PDF. * – mkl

+0

Spiacente, in realtà ho postato la risposta nel thread sbagliato ...Questo voleva essere una spiegazione su come spingere i valori nei campi e preservare la modifica del modulo quando il file viene riaperto ... – Serg

7

Forse la libreria iTextSharp è stata modificata di recente ma non sono riuscito a far funzionare la risposta accettata. Qui è la mia soluzione:

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 differenza molto sottile, a causa di reader.AcroFields.Fields che restituiscono un'IDictionary invece di un oggetto AcroFields.

+0

funziona, ma è molto lento, impiega più di un minuto a leggere ~ 3000 campi. Qualcuno sa un modo più veloce per enumerare questi? Ho provato a farlo in parallelo, ma questo non sembra essere d'aiuto. – DLeh

1

Il nome PDF è "report.pdf" ..

Il campo di dati da leggere in TextBox1 è "TextField25" nel 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: Può essere utilizzato SOLO SE il PDF non è appiattito (significa che i campi devono essere modificabili) mentre è stato creato utilizzando iTextSharp ..

cioè

 pdfStamper.FormFlattening = False 

Questo è molto semplice .. E funziona come un fascino .. :)

Problemi correlati