publicvoidsign(Stringsrc/
/需要签章的pdf文件路径 ,Stringdest/
/ 签完章的pdf文件路径 ,ImageDataimg/
/ 印章图片 ,intpageNum/
/ 印在第几页 ,Rectanglerectangle/
/ 印章显示的位置 ,Certificate[]chain/
/证书链 ,PrivateKeypk/
/签名私钥 ,StringdigestAlgorithm/
/摘要算法名称,例如SHA-1 ,Stringprovider/
/ 密钥算法提供者,可以为null ,PdfSigner.CryptoStandardsubfilter/
/数字签名格式,itext有2种 ,Stringreason/
/签名的原因,显示在pdf签名属性中,随便填 ,Stringlocation)/
/签名的地点,显示在pdf签名属性中,随便填 throwsGeneralSecurityException,IOException{ /
/下边的步骤都是固定的,照着写就行了,没啥要解释的 PdfReaderreader=newPdfReader(src); PdfDocumentdocument=newPdfDocument(reader); document.setDefaultPageSize(PageSize.TABLOID); /
/目标文件输出流 FileOutputStreamos=newFileOutputStream(dest); /
/创建签章工具PdfSigner ,最后一个boolean参数 /
/false的话,pdf文件只允许被签名一次,多次签名,最后一次有效 /
/true的话,pdf可以被追加签名,验签工具可以识别出每次签名之后文档是否被修改 PdfReaderreader2=newPdfReader(src);/
/ PdfSigner stamper = new PdfSigner(reader2, os, true); StampingPropertiesstampingProperties=newStampingProperties(); stampingProperties.useAppendMode(); PdfSignerstamper=newPdfSigner(reader2,os,stampingProperties); /
/ 获取数字签章属性对象,设定数字签章的属性 PdfSignatureAppearanceappearance=stamper.getSignatureAppearance(); appearance.setReason(reason); appearance.setLocation(location); /
/设置签名的位置,页码,签名域名称,多次追加签名的时候,签名与名称不能一样 /
/签名的位置,是图章相对于pdf页面的位置坐标,原点为pdf页面左下角 /
/四个参数的分别是,图章左下角x,图章左下角y,图章宽度,图章高度 appearance.setPageNumber(pageNum); appearance.setPageRect(rectangle); /
/插入盖章图片 appearance.setSignatureGraphic(img); /
/设置图章的显示方式,如下选择的是只显示图章(还有其他的模式,可以图章和签名描述一同显示) appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC); /
/ 这里的itext提供了2个用于签名的接口,可以自己实现,后边着重说这个实现 /
/ 摘要算法 IExternalDigestdigest=newBouncyCastleDigest(); /
/ 签名算法 IExternalSignaturesignature=newPrivateKeySignature(pk,digestAlgorithm,BouncyCastleProvider.PROVIDER_NAME); /
/ 调用itext签名方法完成pdf签章 stamper.setCertificationLevel(1); stamper.signDetached(digest,signature,chain,null,null,null,0,PdfSigner.CryptoStandard.CADES); }