簡體   English   中英

將數字簽名的字段添加到PDF

[英]Add field for a digital signature to PDF

我使用PDFsharp和MigraDoc創建一個新的PDF文件。 現在我想添加一個字段,用戶可以在其中單擊該字段並選擇用於對文件進行數字簽名的證書。

我在網上發現,這應該可以用AcroForms。 但是我無法使用AcroForm因為它總是為空。

我目前的示例代碼:

Document document = new Document();

Section section = document.AddSection();
section.AddParagraph("Signature Test");


PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always);
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();

// NullPointerException at the following line. AcroForm is null 
pdfRenderer.PdfDocument.AcroForm.Elements.Add(PdfAcroForm.Keys.SigFlags, new PdfInteger(3));

const string filename = "HelloWorld.pdf";
pdfRenderer.PdfDocument.Save(filename);
Process.Start(filename);

為什么這個屬性為null? 如何將其設置為正確值?

或者更好的是,如何添加字段來選擇數字證書?

我找到了一個為文檔添加簽名字段的解決方案。 不幸的是我不得不使用反射,因為auf缺少對所需對象的訪問權限。

using PdfSharp.Pdf;
using PdfSharp.Pdf.Annotations;
using System;
using System.Linq;
using System.Reflection;

internal sealed class MyPdfSignatureField : PdfAnnotation
{
    public MyPdfSignatureField(PdfDocument document, PdfRectangle rect) : base(document)
    {
        Elements.Add("/FT", new PdfName("/Sig"));
        Elements.Add(Keys.T, new PdfString("Signature1"));
        Elements.Add("/Ff", new PdfInteger(132));
        Elements.Add("/DR", new PdfDictionary());
        Elements.Add(Keys.Subtype, new PdfName("/Widget"));
        Elements.Add("/P", document.Pages[0]);


        PdfDictionary sign = new PdfDictionary(document);
        sign.Elements.Add(Keys.Type, new PdfName("/Sig"));
        sign.Elements.Add("/Filter", new PdfName("/Adobe.PPKLite"));
        sign.Elements.Add("/SubFilter", new PdfName("/adbe.pkcs7.detached"));
        sign.Elements.Add(Keys.M, new PdfDate(DateTime.Now));

        var irefTable = document
            .GetType()
            .GetField("_irefTable", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(document);
        var irefTableAdd = irefTable
            .GetType()
            .GetMethods()
            .Where(m => m.Name == "Add").Skip(1).FirstOrDefault();

        irefTableAdd.Invoke(irefTable, new object[] { sign });

        Elements.Add("/V", sign);

        Elements.Add("/Rect", rect);
        Flags = PdfAnnotationFlags.Print;
        Opacity = 1;
    }
}

並使用:

var sig = new MyPdfSignatureField(document, new PdfRectangle(new XPoint(480, 33.75), new XPoint(612.2, 62.1)));
document.Pages[0].Annotations.Add(sig);

這不是一個很好的解決方案,但它涵蓋了我的基本要求。 如果您有更好的想法,請告訴我。

這個類的想法來自這里: https//github.com/empira/PDFsharp/pull/11/files

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM