日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SringBoot实现PDF签字盖章

發布時間:2023/12/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SringBoot实现PDF签字盖章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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(){//創建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();//創建PdfTemplate對象PdfTemplate template = new PdfTemplate(width, height);//將圖片繪制到模板template.getGraphics().drawImage(image, 0, 0, width, height);//創建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);//創建PdfAppearance對象PdfAppearance pdfAppearance = new PdfAppearance(stamp);//將模板應用為PdfAppearance的一般狀態pdfAppearance.setNormal(template);//將PdfAppearance 應用為圖章的樣式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);// 獲取總頁數 +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();}// 設置水印透明度PdfGState gs = new PdfGState();gs.setFillOpacity(0.4f);gs.setStrokeOpacity(0.4f);PdfContentByte content = null;for (int i = 1; i < total; i++) {// 在內容上方加水印content = stamper.getOverContent(i);// 在內容下方加水印// content = stamper.getUnderContent(i);content.saveState();content.setGState(gs);// 設置字體和字體大小content.beginText();content.setFontAndSize(base, 10);// 設置字體樣式float ta = 1F, tb = 0F, tc = 0F, td = 1F, tx = 0F, ty = 0F;// 設置加粗(加粗)ta += 0.25F;td += 0.05F;ty -= 0.2F;// 設置傾斜(傾斜程序自己改)tc += 0.8F;content.setTextMatrix(ta, tb, tc, td, tx, ty);// 設置相對于左下角位置(向右為x,向上為y)content.moveText(300F, 50F);// 顯示textcontent.showText("青蒔");content.endText();content.stroke();content.restoreState();}// 關流stamper.close();reader.close(); }//CA簽名認證工具類 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 數字簽名格式,itext有2種* @param reason 簽名的原因,顯示在pdf簽名屬性中* @param location 簽名的地點,顯示在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 參數依次為:文件名、文件輸入流、文件版本號、臨時文件、是否可以追加簽名* 1.1 false的話,pdf文件只允許被簽名一次,多次簽名,最后一次有效* 1.2 true的話,pdf可以被追加簽名,驗簽工具可以識別出每次簽名之后文檔是否被修改*/PdfStamper stamper = PdfStamper.createSignature(pdfReader, fileOutputStream, '\0', null, false);// 獲取數字簽章屬性對象,設定數字簽章的屬性PdfSignatureAppearance appearance = stamper.getSignatureAppearance();appearance.setReason(reason);appearance.setLocation(location);/*** 簽名的大小以及位置* 1 三個參數依次為:設置簽名的位置、頁碼、簽名域名稱,多次追加簽名的時候,簽名域名稱不能一樣* 1.1 簽名的位置四個參數:印章左下角的X、Y軸坐標,印章右上角的X、Y軸坐標,* 這個位置是相對于PDF頁面的位置坐標,即該坐標距PDF當前頁左下角的坐標*/appearance.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, "sign");/*** 用于蓋章的印章圖片,引包的時候要引入itext包的image*/Image image = Image.getInstance(img);appearance.setSignatureGraphic(image);/*** 設置認證等級,共4種,分別為:* NOT_CERTIFIED、CERTIFIED_NO_CHANGES_ALLOWED、* CERTIFIED_FORM_FILLING 和 CERTIFIED_FORM_FILLING_AND_ANNOTATIONS** 需要用哪一種根據業務流程自行選擇*/appearance.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED);/*** 印章的渲染方式,同樣有4種:* DESCRIPTION、NAME_AND_DESCRIPTION,* GRAPHIC_AND_DESCRIPTION,GRAPHIC;* 這里選擇只顯示印章*/appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);/*** 算法主要為:RSA、DSA、ECDSA* 摘要算法,這里的itext提供了2個用于簽名的接口,可以自己實現*/ExternalDigest digest = new BouncyCastleDigest();/*** 簽名算法,參數依次為:證書秘鑰、摘要算法名稱,例如MD5 | SHA-1 | SHA-2.... 以及 提供者*/ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, null);/*** 最重要的來了,調用itext簽名方法完成pdf簽章*/MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);} }//測試CA簽名認證 @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();} }

總結

以上是生活随笔為你收集整理的SringBoot实现PDF签字盖章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。