如何使用iTextSharp向现有的PDF添加表单字段?

11

如何使用iTextSharp向现有pdf中添加表单字段?

我有一个现有的pdf文档,希望在其中添加表单字段,而不需要创建副本并写入新文档。

3个回答

7
经过进一步审查,现场的裁决被推翻了。原来,如果您对印章进行压平,则结果文档上不会显示字段(因为它们缺少“外观”设置)。另外,表单压平可以防止对表单字段进行进一步编辑。现在我们可以为表单添加外观,但更简单的方法是使用TextField类,而不必担心显式设置“外观”对象。
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();
}

2
通过AddAnotation添加的字段无论如何都不会被展平,可以在iTextSharp的源代码中PdfStamper.cs文件的Formflattening属性的注释中查看。 - yoel halb

2

我曾经为此苦苦挣扎,所以决定发布这个问题和答案。

使用itext的PdfStamper类是关键。(我猜这确实会创建一个副本,但比使用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();
}

我的代码和你的非常相似。签名字段在屏幕上表现得非常正常,但是一旦我尝试打印它,在纸上它就显示为空白。你有这种情况吗? - Haoest

1
使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接