如何使 iTextSharp 签名出现在文档的每一页上?
How do I make an iTextSharp signature appear on every page of a document?
当我签署文件时,签名只出现在第一页上。我能做些什么让它出现在每一页上吗?这是我现在使用的签署PDF的方法,希望它能帮助找到解决方案:
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), '[=10=]');
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() 是一种方法,包括一个参数,指示应显示签名的页面。但是,它不能用于确定显示签名的页数..
请允许我从 ISO-32000-2 中复制一个句子和一个注释。这个文档还没有,因为它要到2016年才发布。不过,这个问题的主题已经很清楚了:
然而,这一直是正确的:它只记录在 Adobe 的专有文档中。从PDF 2.0开始就规范了。
简而言之:您要求的内容违反了 PDF 规范。
其实你可能有一个签名域和一个对应的widget annotation,也可以在所有其他地方放置代表这个签名的图像或其他对象。
当我签署文件时,签名只出现在第一页上。我能做些什么让它出现在每一页上吗?这是我现在使用的签署PDF的方法,希望它能帮助找到解决方案:
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), '[=10=]');
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() 是一种方法,包括一个参数,指示应显示签名的页面。但是,它不能用于确定显示签名的页数..
请允许我从 ISO-32000-2 中复制一个句子和一个注释。这个文档还没有,因为它要到2016年才发布。不过,这个问题的主题已经很清楚了:
然而,这一直是正确的:它只记录在 Adobe 的专有文档中。从PDF 2.0开始就规范了。
简而言之:您要求的内容违反了 PDF 规范。
其实你可能有一个签名域和一个对应的widget annotation,也可以在所有其他地方放置代表这个签名的图像或其他对象。