itextsharpを使用して既存のpdfにフォームフィールドを追加するには?
既存の PDF ドキュメントがあり、コピーを作成して新しいドキュメントを書き出すことなく、フォーム フィールドを追加したいと考えています。
itextsharpを使用して既存のpdfにフォームフィールドを追加するには?
既存の PDF ドキュメントがあり、コピーを作成して新しいドキュメントを書き出すことなく、フォーム フィールドを追加したいと考えています。
さらに検討した結果、現場の判決は覆されました。スタンパーをフラット化すると、結果のドキュメントにフィールドが表示されないことがわかります(「外観」設定がないため)。ところで、フォームの平坦化は、フォームフィールドのそれ以上の編集を防ぎます。これでフォームに外観を追加できますが、より簡単な方法はTextFieldクラスを使用し、「appearance」オブジェクトを明示的に設定することを心配しないことです。
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();
}
しばらくこれに苦労したので、質問と回答を投稿することにしました
PdfStamper itext クラスを使用することが重要です。(これはコピーを作成すると思いますが、itext PdfCopy クラスを使用するよりもはるかにクリーンです)。
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();
}
pdfStamperを使用して完成させることができます。
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);