簡體   English   中英

如何在 iTextSharp 中簽署 PDF 后隱藏有效性未知符號

[英]How to hide Validity unknown symbol after signing the PDF in iTextSharp

我在 C#.Net 中使用 iTextSharp 創建了一個簽名的 PDF。 在簽名的 PDF 中,我想要一個有效符號,這樣當用戶在 Adobe Reader 中打開它時,它會顯示一個綠色的勾號及其簽名。

但是在我的 web 應用程序(帶有畫布的 html 頁面)中,我想從 PDF 中刪除該問號,使其不會像此屏幕中那樣顯示: 在此處輸入圖像描述

所以我想保留 PDF 的原始字節,其中signatureappearance.Acro6Layers = false; 在代碼中添加以獲取此符號。 但是在我的查看器(帶有畫布的html頁面)中顯示它之前,我想修改字節並刪除這個黃色標記,這樣它就不會顯示“簽名未驗證”。

我沒有使用 Aspose PDF 到圖像渲染的經驗,但看起來它可能只是像在 PDF 中那樣渲染簽名外觀。 順便說一句,這將是正確的做法。

由於 Acrobat 6 之前的額外圖層都在已保存文件的簽名外觀中繪制,因此您必須清除它們。 你可以這樣做:

using (PdfReader pdfReader = new PdfReader(source))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(dest, FileMode.Create, FileAccess.Write), '\0', true))
{
    AcroFields fields = pdfStamper.AcroFields;
    List<string> names = fields.GetSignatureNames();
    foreach (string name in names)
    {
        PdfDictionary normal = PdfReader.GetPdfObject(fields.GetNormalAppearance(name)) as PdfDictionary;
        PdfDictionary frm = normal?.GetAsDict(PdfName.RESOURCES)?.GetAsDict(PdfName.XOBJECT)?.GetAsStream(PdfName.FRM);
        PdfDictionary frmResources = frm?.GetAsDict(PdfName.RESOURCES);
        PdfDictionary frmXobjectResources = frmResources?.GetAsDict(PdfName.XOBJECT);
        if (frmXobjectResources != null)
        {
            Console.WriteLine("Found XObject resources of FRM XObject");
            clearLayer(pdfStamper.Writer, frmXobjectResources, PdfName.N1);
            clearLayer(pdfStamper.Writer, frmXobjectResources, PdfName.N3);
            clearLayer(pdfStamper.Writer, frmXobjectResources, PdfName.N4);
            pdfStamper.MarkUsed(frmXobjectResources);
            pdfStamper.MarkUsed(frmResources);
            pdfStamper.MarkUsed(frm);
        }
    }
}

使用此輔助方法:

void clearLayer(PdfWriter writer, PdfDictionary frmXobjectResources, PdfName layerName)
{
    PdfStream existingLayer = frmXobjectResources.GetAsStream(layerName);
    if (existingLayer != null)
    {
        PdfArray bBox = existingLayer.GetAsArray(PdfName.BBOX);
        PdfTemplate newLayer = PdfTemplate.CreateTemplate(writer, 0, 0);
        newLayer.BoundingBox = PdfReader.GetNormalizedRectangle(bBox);
        frmXobjectResources.Put(layerName, newLayer.IndirectReference);
    }
}

在不同的渲染器中,原始示例文檔的簽名外觀和由上述代碼生成的文檔如下所示:

  • “原樣”渲染器(我使用的是 Chrome):

    原版-Chrome 結果-Chrome

  • Acrobat 9.5(德語語言環境)不信任您的發行人

    原創-Acrobat9.5 結果-Acrobat9.5

  • Acrobat DC 信任您的發行人

    原創-AcrobatDc 結果-AcrobatDc

但是,請注意:如果文檔帶有認證簽名,而不僅僅是批准簽名,尤其是不允許更改的認證簽名,Acrobat 很可能不會喜歡結果。

暫無
暫無

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

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