Ammetto la mia ignoranza... Non sapevo che esistessero i PDF Forms!
Intanto cosa sono e come si possono creare
Un Form PDF, come dice il nome, è un documento PDF contenente alcuni campi compilabili o selezionabili dall'utente, tipo TextBox, Combo, CheckBox...
Per creare un PDF Form, bisogna utilizzare la versione completa di Adobe Acrobat, oppure se si desidera risparmiare qualche soldo, basta utilizzare Open Office sfruttando le sue potenzialità di export PDF.
Per inserire campi persoanlizzabili all'interno del documento, si utilizzano gli strumenti presenti nella toolbox "Form Controls" visualizzabile tramite "View -> Toolbars -> Form Controls".
A questo punto basterà "disegnare" i controlli necessari direttamente nella pagina, e ovviamente dargli un nome sensato (che ci consenta di recuperarli in futuro)
Una volta creato il form, sarà necessario esportarlo in PDF tramite "File -> Export as PDF..." selezionando le opzioni "Create PDF Form" e "Export bookmarks" e... ecco fatto, il nostro PDF Form è pronto all'uso!.
Nota: Per utilizzare il PDF Form come template da dare in pasto al nostro futuro programma, utilizzare come controlli i TextBox, ed eventualmente, nelle proprietà del singolo controllo (doppio click su di esso) impostare il bordo come "Without frame" così il documento generato non visualizzerà i bordi delle caselle di testo.
Come si possono compilare da codice?
Bene, ora passiamo alla parte facile (effettivamente mi ci è voluto molto di più a capire come fare il form che a farlo compilare da iTextSharp)
Supponiamo di dover compilare un form che rappresenta una fattura:
Aggiungiamo il riferimento ad iTextSharp al nostro progetto e copia-incolliamo l'esempio seguente, il quale mostra in modo un po' grezzo, ma molto comprensibile come compilare i vari campi
string pdfTemplate = @"c:\InvoiceForm.pdf";
string newFile = @"c:\Invoice_Compiled.pdf";
PdfReader pdfReader = new PdfReader(pdfTemplate);
// PdfStamper, usato per aggiungere contenuti al documento PDF.
// In questo caso viene utilizzato per compilare campi del form, ma si può anche utilizzare per aggiungere
// qualsiasi altro contenuto al PDF anche tramite posizione assoluta o con riferimenti tipo Top e Bottom.
// Può essere usato per scopi tipo watermarking.
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));
AcroFields pdfFormFields = pdfStamper.AcroFields;
// Per scorrere i vari campi presenti nel PDF - Non serve nell'esempio, è un reminder
foreach (DictionaryEntry de in pdfFormFields.Fields)
Console.WriteLine(de.Key.ToString());
Console.ReadLine();
// Compilazione dei campi
pdfFormFields.SetField("txtRagioneSociale", "Pinco Pallo s.r.l.");
pdfFormFields.SetField("txtIndirizzo", "via delle Fontane Secche, 1 - Gotham City");
pdfFormFields.SetField("txtPIVA", "0123456789");
pdfFormFields.SetField("txtDescrizione", "Acquisto 4 pneumatici Bat-Mobile");
pdfFormFields.SetField("txtImponibile", "4000");
pdfFormFields.SetField("txtIVA", "800");
pdfFormFields.SetField("txtTotale", "4800");
// Questa istruzione consente di rimuovere le potenzialità di editing del form, risultando
// in un PDF non più modificabile dall'utente, se si imposta a false, il PDF risultante sarà
// compilato ma comunque editabile dall'utente
pdfStamper.FormFlattening = true;
// CHIUDERE IL PDFSTAMPER!!! Lasciarlo aperto comporterà la produzione di un PDF corrotto
pdfStamper.Close();
Process.Start(newFile);