将签名表单字段添加到最后一页中可见的页面

时间:2017-10-24 09:22:00

标签: c# .net itext itext7

我正在尝试使用iText for .NET(v7.0.4)将签名表单字段放在特定页面的给定位置。我正在处理的代码如下:

public static void test()
    {
        using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(@"c:\temp\pippo.pdf")))
        {
            //Add some blank pages
            pdfDoc.AddNewPage();
            pdfDoc.AddNewPage();
            pdfDoc.AddNewPage();

            //Instantiate a Signature Form Field using factory
            PdfSignatureFormField sgnField = 
                PdfFormField.CreateSignature(pdfDoc, new Rectangle(100, 100, 200, 100));

            //setting name and page
            sgnField.SetFieldName("pluto");
            sgnField.SetPage(1);

            //Adding to AcroForm
            PdfAcroForm.GetAcroForm(pdfDoc, true).AddField(sgnField);
        }
    }

输出文档(pippo.pdf)在第一页中有签名字段,这是预期的行为。问题是我甚至可以在最后一页(在这种情况下是第三页)中看到签名字段。

此外,如果我通过调用pdfDoc.RemovePage(3);删除最后一页,则签名字段甚至会从第一页消失。

问题是:如何在最后一页中复制签名表单字段?任何建议都被广泛接受!

2 个答案:

答案 0 :(得分:0)

方法AddField(PdfFormField field)记录为

 * This method adds the field to the last page in the document.
 * If there's no pages, creates a new one.

因此,您首先使用

将字段分配到第一页
sgnField.SetPage(1)

然后也使用

到最后一个
PdfAcroForm.GetAcroForm(pdfDoc, true).AddField(sgnField);

您应该使用AddField(PdfFormField field, PdfPage page)代替:

PdfAcroForm.GetAcroForm(pdfDoc, true).AddField(sgnField, pdfDoc.GetFirstPage());

@iText DEV:当使用PDF2时,应该阻止这种情况。

答案 1 :(得分:0)

mkl的回答很好

还适用于您尝试添加到PDF页面的其他组件,例如PdfTextFormField

我认为最简单的方法是应用getPage作为参数,以确保我得到的正是预期的结果。

示例:

PdfAcroForm
    .getAcroForm(pdfDoc, true)
    .addField(myTextArea, pdfDoc.getPage(pageCount));