You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PDFSharp在PDF指定页面设置数字签名位置?

解决PDFsharp数字签名定位到最后一页文本后的问题

核心疑问解答

XForm 并非始终仅代表第一页,它是PDF中独立的可复用图形表单对象,专门用于绘制签名的外观,本身和任何页面没有绑定关系。你看到签名一直出现在第一页,是因为默认逻辑里签名注解(Annotation)被添加到了第一页的注解集合中,和XForm无关。

问题根源

原代码的PdfSignatureHandler默认会把签名注解附加到PDF文档的第一页,且没有提供直接指定目标页面的选项;另外你尝试直接用XGraphics.FromPdfPage绘制到最后一页,这违背了PDF签名的规范——签名是作为页面注解存在的,不是直接在页面上绘制图形。

修复步骤

1. 修改签名注解的归属页面

在SignExisting方法中,先获取最后一页,然后调整签名注解的关联页面:

private static void SignExisting()
{
    string outputPath = "SignExisting.pdf";
    PdfDocument pdfDocument = PdfReader.Open(new MemoryStream(Resources.doc1));
    // 获取最后一页
    PdfPage lastPage = pdfDocument.Pages[pdfDocument.Pages.Count - 1];

    PdfSignatureOptions options = new PdfSignatureOptions
    {
        ContactInfo = "Contact Info",
        Location = "Paris",
        Reason = "Test signatures",
        // 先暂时设置一个初始位置,后续再调整到文本之后
        Rectangle = new XRect(36.0, 100.0, 200.0, 50.0),
        AppearanceHandler = new Program.SignAppearenceHandler()
    };

    PdfSignatureHandler pdfSignatureHandler = new PdfSignatureHandler(Program.GetCertificate(), null, options);
    pdfSignatureHandler.AttachToDocument(pdfDocument);

    // 将签名注解从默认页面(第一页)移到最后一页
    PdfSignatureField signatureField = pdfDocument.AcroForm.Fields.Values.OfType<PdfSignatureField>().FirstOrDefault();
    if (signatureField != null)
    {
        // 从原页面移除
        pdfDocument.Pages[0].Annotations.Remove(signatureField);
        // 添加到最后一页
        lastPage.Annotations.Add(signatureField);
    }

    pdfDocument.Save(outputPath);
    Process.Start(outputPath);
}

2. 定位到最后一页文本之后

要把签名放在文本之后,需要先解析最后一页的内容,找到文本的底部坐标:

  • 可以使用PDFsharp的PdfContentReader解析页面内容流,提取文本的位置信息;
  • 或者借助第三方库简化文本位置的获取。

假设你已经获取到最后一页文本的底部Y坐标为textBottomY,只需修改Rectangle的Y值:

Rectangle = new XRect(36.0, textBottomY - 60.0, 200.0, 50.0),

(减去60是为了给签名留出足够空间,可根据实际调整)

3. 关于PrepareForSave方法的说明

原代码中的PrepareForSave是用来生成签名的外观表单,无需修改XGraphics的来源——XGraphics.FromForm(form)是正确的方式,因为签名外观是绘制在独立的XForm上,再关联到签名注解,最后通过注解绑定到目标页面。

内容的提问来源于stack exchange,提问作者DabbingHermit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:40:36