C# 将签名表单字段添加到页面it';它在最后一页中也可见

C# 将签名表单字段添加到页面it';它在最后一页中也可见,c#,.net,itext,itext7,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.AddNewP

我试图使用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),签名字段甚至从第一页消失

问题是:如何使签名表单字段不在最后一页中复制?任何建议都是可以接受的

方法
AddField(PdfFormField)
记录如下

*此方法将字段添加到文档的最后一页。
*如果没有页面,则创建一个新页面。
因此,首先使用

sgnField.SetPage(1)
然后也是最后一个使用

PdfAcroForm.GetAcroForm(pdfDoc, true).AddField(sgnField);
您应该使用
AddField(PdfFormField字段,PdfPage页面)

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

@iText-DEV:在使用PDF2时,应该防止出现这种情况。

mkl给出了一个很好的答案

也适用于您试图添加到PDF页面的其他组件,如
PdfTextFormField

我发现最简单的方法是应用
getPage
作为参数,以确保我得到的正是我所期望的

示例:

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

不允许在PDF2中分配多个同名签名字段吗?@breez“不允许在PDF2中分配多个同名签名字段吗?”-我不太清楚您的确切意思(必须确切知道,因为这里禁止大多数复制变体)。因此,你能自己把这个问题说成是一个很好的问题,并准确地解释你的意思吗?我指的是你在回答中的最后一句话(@iText DEV),我认为OP试图做的是违反PDF2规范?OP并没有用同一个名称添加多个字段,他在多个页面中添加了一个字段。仅当在这些页面上使用该字段的不同小部件注释时,才允许这样做。但由于PDF-2.0(ISO 32000-2),签名字段不得引用多个注释。