Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例
在設(shè)置文檔內(nèi)容保護(hù)的方法中,除了對文檔加密、添加水印外,應(yīng)用數(shù)字簽名也是一種有效防偽手段。數(shù)字簽名的文件比較容易驗(yàn)證,并且具有較高的權(quán)威性和可信度。在PDF文檔中,有可直接添加或驗(yàn)證數(shù)字簽名的功能方法,下面的文章中,將通過Java程序來介紹添加數(shù)字簽名到PDF文檔,以及驗(yàn)證簽名是否有效。
使用工具:Spire.PDF for Java
Jar文件獲取及導(dǎo)入方法:方法1:可通過官網(wǎng)下載jar文件包。下載后,解壓文件,并將lib文件夾下的Spire.Pdf.jar文件導(dǎo)入到Java程序。參考如下導(dǎo)入效果:(這里程序?qū)ar文件分別導(dǎo)入了兩個module)
方法2:可通過maven倉庫安裝導(dǎo)入。
Java代碼示例
【示例1】添加數(shù)字簽名到PDF
import com.spire.pdf.*;import com.spire.pdf.graphics.PdfImage;import com.spire.pdf.graphics.PdfTrueTypeFont;import com.spire.pdf.security.GraphicMode;import com.spire.pdf.security.PdfCertificate;import com.spire.pdf.security.PdfCertificationFlags;import com.spire.pdf.security.PdfSignature;import java.awt.*;import java.awt.geom.Point2D;import java.awt.geom.Rectangle2D;public class AddCertificate { public static void main(String[]args){//加載PDF文檔PdfDocument doc = new PdfDocument();doc.loadFromFile('test.pdf');//加載pfx證書,及證書秘鑰PdfCertificate cert = new PdfCertificate('Cermia.pfx','123654yes!');//添加數(shù)字簽名到指定頁面,并設(shè)置其位置和大小PdfSignature signature = new PdfSignature(doc, doc.getPages().get(2), cert, 'MySignature');Rectangle2D rect = new Rectangle2D.Float();rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 340, (float) doc.getPages().get(0).getActualSize().getHeight() - 230), new Dimension(280, 150));signature.setBounds(rect);//設(shè)置簽名為圖片加文本模式signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);//設(shè)置簽名的內(nèi)容signature.setNameLabel('簽字者:');signature.setName('Mia');signature.setContactInfoLabel('聯(lián)系電話:');signature.setContactInfo('02881705109');signature.setDateLabel('日期:');signature.setDate(new java.util.Date());signature.setLocationInfoLabel('地點(diǎn):');signature.setLocationInfo('成都');signature.setReasonLabel('原因:');signature.setReason('文檔所有者');signature.setDistinguishedNameLabel('DN: ');signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());signature.setSignImageSource(PdfImage.fromFile('sign.png'));//設(shè)置簽名的字體signature.setSignDetailsFont(new PdfTrueTypeFont(new Font('Arial Unicode MS', Font.PLAIN, 9)));//設(shè)置文檔權(quán)限為禁止更改signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);signature.setCertificated(true);//保存文檔doc.saveToFile('AddSignature.pdf');doc.close(); }}
數(shù)字簽名添加效果:
【示例2】驗(yàn)證數(shù)字簽名有效性
import com.spire.pdf.*;import com.spire.pdf.security.PdfSignature;import com.spire.pdf.widget.PdfFormFieldWidgetCollection;import com.spire.pdf.widget.PdfFormWidget;import com.spire.pdf.widget.PdfSignatureFieldWidget;import javax.swing.*;public class ValidateSignature { public static void main(String[]args){//創(chuàng)建PdfDocument實(shí)例PdfDocument doc = new PdfDocument();//加載含有簽名的PDF文件doc.loadFromFile('SignnedFile.pdf');//獲取域集合PdfFormWidget pdfFormWidget = (PdfFormWidget) doc.getForm();PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();//遍歷域for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) { //判定是否為簽名域 if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {//獲取簽名域PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);//獲取簽名PdfSignature signature = signatureFieldWidget.getSignature();//判定簽名是否有效boolean result = signature.verifySignature();if (result) { String str1 =' 有效簽名'; JOptionPane.showMessageDialog(null,str1);} else { String str2 =' 無效簽名'; JOptionPane.showMessageDialog(null,str2);} }} }}
驗(yàn)證結(jié)果:
擴(kuò)展:Java 添加簽名域到PDF,可以參考這篇文章。
到此這篇關(guān)于Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例的文章就介紹到這了,更多相關(guān)Java PDF數(shù)字簽名內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. idea不能自動補(bǔ)全yml配置文件的原因分析2. 教你如何寫出可維護(hù)的JS代碼3. CSS可以做的幾個令你嘆為觀止的實(shí)例分享4. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)5. 使用Python和百度語音識別生成視頻字幕的實(shí)現(xiàn)6. 利用ajax+php實(shí)現(xiàn)商品價格計算7. Vue的Options用法說明8. css代碼優(yōu)化的12個技巧9. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法10. 怎樣才能用js生成xmldom對象,并且在firefox中也實(shí)現(xiàn)xml數(shù)據(jù)島?
