Comment ajouter un champ de formulaire à un fichier PDF existant avec iTextShaRP? p>
J'ai un document PDF existant, j'aimerais ajouter des champs de formulaire sans créer de copie et écrire un nouveau document. p>
3 Réponses :
J'ai lutté avec ceci pendant un certain temps alors figuré que je posterais la question et la réponse
Utilisation de la classe PDFstamper IText est la clé. (Je suppose que cela fait une copie, mais c'est beaucoup plus propre que d'utiliser les classes IText PDFCopy). P>
public void AddFormFieldToExistingPDF( ) { PdfReader reader = new PdfReader(@"c:\existing.pdf"); FileStream out = new FileStream(@"C:\existingPlusFields.pdf", FileMode.Create, FileAccess.Write); PdfStamper stamp = new PdfStamper(reader, out); PdfFormField field = PdfFormField.CreateTextField(stamp.Writer, false, false, 50); // set a field w/some position and size field.SetWidget(new iTextSharp.text.Rectangle(40, 500, 360, 530), PdfAnnotation.HIGHLIGHT_INVERT); field.SetFieldFlags(PdfAnnotation.FLAGS_PRINT); field.FieldName = "some_field"; // add the field here, the second param is the page you want it on stamp.AddAnnotation(field, 1); stamp.Close(); }
Mon code est très similaire au vôtre. Le champ de signature se comporte parfaitement normal sur l'écran, mais une fois que j'essaie de l'imprimer, il montre vide sur papier. Est-ce que cela vous arrive?
Après examen plus approfondi, la décision sur le terrain est renversée. S'avère que si vous formez l'aplatissez l'abattre, les champs ne figurent pas sur le document résultant (car ils manquent de paramètres «apparence»). BTW, la forme aplatissement empêche d'autres modifications d'un champ de formulaire. Maintenant, nous pouvons ajouter l'apparence au formulaire, cependant, un moyen plus facile d'utiliser la classe Textfield et ne vous inquiétez pas de configurer explicitement des objets «apparence».
public void ABetterWayToAddFormFieldToExistingPDF( ) { PdfReader reader = new PdfReader(@"c:\existing.pdf"); FileStream out = new FileStream(@"C:\existingPlusFields.pdf", FileMode.Create, FileAccess.Write); PdfStamper stamp = new PdfStamper(reader, out); TextField field = new TextField(stamp.Writer, new iTextSharp.text.Rectangle(40, 500, 360, 530), "some_text"); // add the field here, the second param is the page you want it on stamp.AddAnnotation(field.GetTextField(), 1); stamp.FormFlattening = true; // lock fields and prevent further edits. stamp.Close(); }
Les champs ajoutés avec ADDONATION sont de toute façon non aplaties, voir le commentaire sur la propriété Formlatenel dans le code source d'ItextShaarp SourceForge.net/p/itextSharap/code/453/tree/trunk/src/core/...
Utiliser pdfstamper strong> Vous pouvez le compléter. PdfStamper Stamper= new PdfStamper(new PdfReader(sourcefile), File.Create(NewOutputFile));
TextField moreText = new TextField(Stamper.Writer,
new iTextSharp.text.Rectangle(20, 20, 590, 780), "moreText");
moreText.Visibility = TextField.VISIBLE_BUT_DOES_NOT_PRINT;
moreText.Text = "Use this space for any additional information";
moreText.Options = (TextField.MULTILINE);
PdfFormField Fieldtxt = moreText.GetTextField();
Stamper.AddAnnotation(Fieldtxt, n);