如何在文档的每个页面上显示iTextSharp签名? [英] How do I make an iTextSharp signature appear on every page of a document?

查看:143
本文介绍了如何在文档的每个页面上显示iTextSharp签名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我签署文档时,签名仅出现在第一页上。我能做些什么让它出现在每一页上吗?这是我正在使用的方法来签署PDF,希望它有助于找到解决方案:

when I sign a document the signature only appears on the first page. Is there anything I can do to make it appear on every page? This is the method I'm using right now to sign the PDF, hope it helps find a solution:

public static PdfStamper SignHashedUser(string Target, SysX509.X509Certificate2 Certificate, string Reason, string Location, bool AddVisibleSign, PdfReader objReader, int pags)
    {
        X509CertificateParser objCP = new X509CertificateParser();
        X509Certificate[] objChain = new X509Certificate[] { objCP.ReadCertificate(Certificate.RawData) };

        PdfStamper objStamper = PdfStamper.CreateSignature(objReader, new FileStream(Target, FileMode.Create), '\0');
        PdfSignatureAppearance objSA = objStamper.SignatureAppearance;
        int[] perms = { PdfWriter.AllowPrinting, PdfWriter.AllowFillIn };


        if (AddVisibleSign)
            objSA.SetVisibleSignature(new Rectangle(50, 50, 250, 100), pags, null);
//pags define in which page of the PDF will the signature appear 
        objSA.SignDate = DateTime.Now;
        objSA.SetCrypto(null, objChain, null, null);
        objSA.Acro6Layers = true;
        objSA.Render = PdfSignatureAppearance.SignatureRender.NameAndDescription;
        PdfSignature objSignature = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
        objSignature.Date = new PdfDate(objSA.SignDate);
        objSignature.Name = PdfPKCS7.GetSubjectFields(objChain[0]).GetField("CN");
        if (objSA.Reason != null)
            objSignature.Reason = objSA.Reason;
        if (objSA.Location != null)
            objSignature.Location = objSA.Location;
        objSA.CryptoDictionary = objSignature;
        int intCSize = 4000;
        Hashtable objTable = new Hashtable();
        objTable[PdfName.CONTENTS] = intCSize * 2 + 2;
        objSA.PreClose(objTable);

        HashAlgorithm objSHA1 = new SHA1CryptoServiceProvider();

        Stream objStream = objSA.RangeStream;
        int intRead = 0;
        byte[] bytBuffer = new byte[8192];
        while ((intRead = objStream.Read(bytBuffer, 0, 8192)) > 0)
            objSHA1.TransformBlock(bytBuffer, 0, intRead, bytBuffer, 0);
        objSHA1.TransformFinalBlock(bytBuffer, 0, 0);

        byte[] bytPK = SignMsg(objSHA1.Hash, Certificate, false);
        byte[] bytOut = new byte[intCSize];

        PdfDictionary objDict = new PdfDictionary();

        Array.Copy(bytPK, 0, bytOut, 0, bytPK.Length);

        objDict.Put(PdfName.CONTENTS, new PdfString(bytOut).SetHexWriting(true));
        objSA.Close(objDict);

        return objStamper;
    }

编辑:PdfSignatureAppearance.SetVisibleSignature()是一个包含指示页面的参数的方法应该显示签名的位置。但是它不能用于确定显示一个人的签名的页数。

PdfSignatureAppearance.SetVisibleSignature() is a method including a parameter indicating the page where the Signature should be displayed. However it can't be used to determine the number of pages where one's signature would be shown..

推荐答案

允许我复制ISO-32000-2中的一个句子和一个注释。此文档尚未公布,因为它仅在2016年发布。但是,这个问题的主题非常明确:

Allow me to copy a sentence and a note from ISO-32000-2. This document isn't available yet because it will only be released in 2016. However, it is very clear on the subject of this question:

但这始终如此:它只是记录在Adobe专有的文档中。从PDF 2.0开始,它将是规范性的。

This has always been true, however: it was only documented in documentation proprietary to Adobe. Starting with PDF 2.0, it will be normative.

简而言之:您要求的内容违反了PDF规范。

In short: you are asking for something that is in violation with the PDF specification.

这篇关于如何在文档的每个页面上显示iTextSharp签名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆