【问题标题】:Adding a signature form field to a page it's visible in the last page also将签名表单字段添加到在最后一页中可见的页面
【发布时间】:2018-04-05 00:38:25
【问题描述】:

我正在尝试使用 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); 删除最后一页,签名字段甚至会从第一页消失。

问题是:如何使签名表单字段不在最后一页复制?任何建议都非常好接受!

【问题讨论】:

    标签: c# .net itext itext7


    【解决方案1】:

    方法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 时,应该避免这种情况。

    【讨论】:

    • PDF2中是否不允许分配多个同名签名域?
    • @breez “是否不允许在 PDF2 中分配多个具有相同名称的签名字段?” - 我不太清楚你的意思是什么(必须确切地知道,因为这里禁止大多数重复的变化)。因此,您能否单独提出这个问题并准确解释您的意思?
    • 我在您的回答中指的是您的最后一句话 (@iText DEV),这对我来说表明 OP 试图做的是违反 PDF2 规范?
    • OP 没有添加具有相同名称的多个字段,他将一个字段添加到多个页面。只有在那些页面上使用该字段的不同小部件注释时才允许这样做。但自 PDF-2.0 (ISO 32000-2) 起,签名字段不得引用多个注释。
    【解决方案2】:

    mkl 的好回答

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

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

    示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多