SringBoot实现PDF签字盖章
生活随笔
收集整理的這篇文章主要介紹了
SringBoot实现PDF签字盖章
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
maven引入依賴
<dependency><groupId>repository_personal.com.lowagie</groupId><artifactId>itext</artifactId><version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version> </dependency><!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian --> <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version> </dependency><!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.60</version> </dependency><!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --> <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.60</version> </dependency>工具類
//PDF蓋章 void ImageStamp(){//創(chuàng)建PdfDocument對象,加載PDF測試文檔PdfDocument doc = new PdfDocument();doc.loadFromFile("E://瀏覽器//test1.pdf");//獲取文檔第3頁PdfPageBase page = doc.getPages().get(0);//加載印章圖片PdfImage image = PdfImage.fromFile("E://瀏覽器//qs.png");//獲取印章圖片的寬度和高度int width = image.getWidth();int height = image.getHeight();//創(chuàng)建PdfTemplate對象PdfTemplate template = new PdfTemplate(width, height);//將圖片繪制到模板template.getGraphics().drawImage(image, 0, 0, width, height);//創(chuàng)建PdfRubebrStampAnnotation對象,指定大小和位置Rectangle2D rect = new Rectangle2D.Float((float) (page.getActualSize().getWidth() - width - 10), (float) (page.getActualSize().getHeight() - height - 60), width, height);PdfRubberStampAnnotation stamp = new PdfRubberStampAnnotation(rect);//創(chuàng)建PdfAppearance對象PdfAppearance pdfAppearance = new PdfAppearance(stamp);//將模板應(yīng)用為PdfAppearance的一般狀態(tài)pdfAppearance.setNormal(template);//將PdfAppearance 應(yīng)用為圖章的樣式stamp.setAppearance(pdfAppearance);//添加圖章到PDFpage.getAnnotationsWidget().add(stamp);//保存文檔doc.saveToFile("E://瀏覽器//ImageStamp.pdf",FileFormat.PDF); } //PDF簽字 @Test void TextStamp() throws IOException, DocumentException {// 要輸出的pdf文件BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("E://瀏覽器//TextStamp.pdf")));// 將pdf文件先加水印然后輸出PdfReader reader = new PdfReader("E://瀏覽器//ImageStamp.pdf");PdfStamper stamper = new PdfStamper(reader, bos);// 獲取總頁數(shù) +1, 下面從1開始遍歷int total = reader.getNumberOfPages() + 1;// 使用classpath下面的字體庫BaseFont base = null;try {base = BaseFont.createFont("E://瀏覽器//方正楷體.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);} catch (Exception e) {// 日志處理e.printStackTrace();}// 設(shè)置水印透明度PdfGState gs = new PdfGState();gs.setFillOpacity(0.4f);gs.setStrokeOpacity(0.4f);PdfContentByte content = null;for (int i = 1; i < total; i++) {// 在內(nèi)容上方加水印content = stamper.getOverContent(i);// 在內(nèi)容下方加水印// content = stamper.getUnderContent(i);content.saveState();content.setGState(gs);// 設(shè)置字體和字體大小content.beginText();content.setFontAndSize(base, 10);// 設(shè)置字體樣式float ta = 1F, tb = 0F, tc = 0F, td = 1F, tx = 0F, ty = 0F;// 設(shè)置加粗(加粗)ta += 0.25F;td += 0.05F;ty -= 0.2F;// 設(shè)置傾斜(傾斜程序自己改)tc += 0.8F;content.setTextMatrix(ta, tb, tc, td, tx, ty);// 設(shè)置相對于左下角位置(向右為x,向上為y)content.moveText(300F, 50F);// 顯示textcontent.showText("青蒔");content.endText();content.stroke();content.restoreState();}// 關(guān)流stamper.close();reader.close(); }//CA簽名認(rèn)證工具類 import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfSignatureAppearance; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.security.*;import java.io.FileOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.security.PrivateKey; import java.security.cert.Certificate;public class KeystoreUtils {/**** @param src 需要簽章的pdf文件路徑* @param dest 簽完章的pdf文件路徑* @param chain 證書鏈* @param img 印章圖片* @param pk 簽名私鑰* @param digestAlgorithm 摘要算法名稱,例如SHA-1* @param provider 密鑰算法提供者,可以為null* @param subfilter 數(shù)字簽名格式,itext有2種* @param reason 簽名的原因,顯示在pdf簽名屬性中* @param location 簽名的地點(diǎn),顯示在pdf簽名屬性中* @throws GeneralSecurityException* @throws IOException* @throws DocumentException*/public void sign(String src, String dest,String img, Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider,MakeSignature.CryptoStandard subfilter, String reason, String location) throws GeneralSecurityException, IOException, DocumentException {PdfReader pdfReader = new PdfReader(src);FileOutputStream fileOutputStream = new FileOutputStream(dest);/*** 1 參數(shù)依次為:文件名、文件輸入流、文件版本號、臨時文件、是否可以追加簽名* 1.1 false的話,pdf文件只允許被簽名一次,多次簽名,最后一次有效* 1.2 true的話,pdf可以被追加簽名,驗(yàn)簽工具可以識別出每次簽名之后文檔是否被修改*/PdfStamper stamper = PdfStamper.createSignature(pdfReader, fileOutputStream, '\0', null, false);// 獲取數(shù)字簽章屬性對象,設(shè)定數(shù)字簽章的屬性PdfSignatureAppearance appearance = stamper.getSignatureAppearance();appearance.setReason(reason);appearance.setLocation(location);/*** 簽名的大小以及位置* 1 三個參數(shù)依次為:設(shè)置簽名的位置、頁碼、簽名域名稱,多次追加簽名的時候,簽名域名稱不能一樣* 1.1 簽名的位置四個參數(shù):印章左下角的X、Y軸坐標(biāo),印章右上角的X、Y軸坐標(biāo),* 這個位置是相對于PDF頁面的位置坐標(biāo),即該坐標(biāo)距PDF當(dāng)前頁左下角的坐標(biāo)*/appearance.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, "sign");/*** 用于蓋章的印章圖片,引包的時候要引入itext包的image*/Image image = Image.getInstance(img);appearance.setSignatureGraphic(image);/*** 設(shè)置認(rèn)證等級,共4種,分別為:* NOT_CERTIFIED、CERTIFIED_NO_CHANGES_ALLOWED、* CERTIFIED_FORM_FILLING 和 CERTIFIED_FORM_FILLING_AND_ANNOTATIONS** 需要用哪一種根據(jù)業(yè)務(wù)流程自行選擇*/appearance.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED);/*** 印章的渲染方式,同樣有4種:* DESCRIPTION、NAME_AND_DESCRIPTION,* GRAPHIC_AND_DESCRIPTION,GRAPHIC;* 這里選擇只顯示印章*/appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);/*** 算法主要為:RSA、DSA、ECDSA* 摘要算法,這里的itext提供了2個用于簽名的接口,可以自己實(shí)現(xiàn)*/ExternalDigest digest = new BouncyCastleDigest();/*** 簽名算法,參數(shù)依次為:證書秘鑰、摘要算法名稱,例如MD5 | SHA-1 | SHA-2.... 以及 提供者*/ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, null);/*** 最重要的來了,調(diào)用itext簽名方法完成pdf簽章*/MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);} }//測試CA簽名認(rèn)證 @Test void KeystoreTest(){String KEYSTORE = "E:\\瀏覽器\\android.keystore";// 之前生成的keystory密碼char[] PASSWORD = "123456".toCharArray();// 需要簽名的PDF路徑String SRC = "E://瀏覽器//test1.pdf";// 完成簽名的PDF路徑String OUTPUT_SRC = "E://瀏覽器//ImageStamp.pdf";String IMG = "E://瀏覽器//qs.png";try {//讀取keystore ,獲得私鑰和證書鏈KeyStore keyStore = KeyStore.getInstance("JKS");keyStore.load(new FileInputStream(KEYSTORE), PASSWORD);String alias = (String)keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, PASSWORD);Certificate[] chain = keyStore.getCertificateChain(alias);KeystoreUtils keystoreUtils = new KeystoreUtils();keystoreUtils.sign(SRC, String.format(OUTPUT_SRC, 3),IMG, chain, PrivateKey, DigestAlgorithms.SHA1, null, MakeSignature.CryptoStandard.CMS, "Test", "Ghent");} catch (Exception e) {JOptionPane.showMessageDialog(null, e.getMessage());e.printStackTrace();} }總結(jié)
以上是生活随笔為你收集整理的SringBoot实现PDF签字盖章的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网-3互联网思维的应用
- 下一篇: 前端实现搜索联想时防抖功能: