用Java验证pdf文件的电子章签名
pom.xml
4.0.0 com.yalong verifyPdf 1.0-SNAPSHOT UTF-8 1.8 1.18.10 javax.xml.bind jaxb-api 2.3.0 e-iceblue spire.pdf.free 2.6.3 org.apache.poi poi 4.0.1 org.apache.poi poi-ooxml 4.0.1 org.projectlombok lombok ${lombok.version} com.e-iceblue http://repo.e-iceblue.cn/repository/maven-public/
VerifySignature.java
importcom.spire.pdf.PdfDocument; importcom.spire.pdf.security.PdfCertificate; importcom.spire.pdf.security.PdfSignature; importcom.spire.pdf.widget.PdfFormFieldWidgetCollection; importcom.spire.pdf.widget.PdfFormWidget; importcom.spire.pdf.widget.PdfSignatureFieldWidget; importlombok.Data; importlombok.ToString; importorg.apache.poi.ss.usermodel.*; importorg.apache.poi.ss.usermodel.Font; importorg.apache.poi.xssf.streaming.SXSSFWorkbook; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.Serializable; importjava.text.SimpleDateFormat; importjava.util.ArrayList; importjava.util.Date; importjava.util.HashSet; importjava.util.List; importjava.util.regex.Matcher; importjava.util.regex.Pattern; importjavax.swing.*; importjava.awt.*; @Data @ToString classExcelDataVOimplementsSerializable{ privateStringfileName; privateStringsignDate; privateStringvalidBefore; privateStringvalidAfter; privateStringsubject; privateStringserialNumber; privateBooleanisEffective=false; } classExcelWriter{ //表头 privatestaticfinalListCELL_HEADS; static{ //类装载时就载入指定好的表头信息,如有需要,可以考虑做成动态生成的表头 CELL_HEADS=newArrayList<>(); CELL_HEADS.add("文件名"); CELL_HEADS.add("签名时间"); CELL_HEADS.add("有效期"); CELL_HEADS.add("有效期"); CELL_HEADS.add("签名机构"); CELL_HEADS.add("序列号"); CELL_HEADS.add("是否通过验签"); } /** *生成Excel并写入数据信息 * *@paramdataList数据列表 *@return写入数据后的工作簿对象 */ publicstaticWorkbookexportData(List dataList){ //生成xlsx的Excel Workbookworkbook=newSXSSFWorkbook(); //如需生成xls的Excel,请使用下面的工作簿对象,注意后续输出时文件后缀名也需更改为xls //Workbookworkbook=newHSSFWorkbook(); //生成Sheet表,写入第一行的表头 Sheetsheet=buildDataSheet(workbook); //构建每行的数据内容 introwNum=1; for(ExcelDataVOdata:dataList){ if(data==null){ continue; } //输出行数据 Rowrow=sheet.createRow(rowNum++); convertDataToRow(workbook,data,row); } returnworkbook; } /** *生成sheet表,并写入第一行数据(表头) * *@paramworkbook工作簿对象 *@return已经写入表头的Sheet */ privatestaticSheetbuildDataSheet(Workbookworkbook){ Sheetsheet=workbook.createSheet(); //设置表头宽度 for(inti=0;i dataVOList,StringexportFilePath){ //写入数据到工作簿对象内 Workbookworkbook=ExcelWriter.exportData(dataVOList); //以文件的形式输出工作簿对象 FileOutputStreamfileOut=null; try{ FileexportFile=newFile(exportFilePath); if(!exportFile.exists()){ booleannewFile=exportFile.createNewFile(); if(!newFile){ System.out.println("文件创建失败"); } } fileOut=newFileOutputStream(exportFilePath); workbook.write(fileOut); fileOut.flush(); }catch(Exceptione){ System.out.println("输出Excel时发生错误,错误原因:"+e.getMessage()); }finally{ try{ if(null!=fileOut){ fileOut.close(); } workbook.close(); }catch(IOExceptione){ System.out.println("关闭输出流时发生错误,错误原因:"+e.getMessage()); } } } } publicclassVerifySignature{ privatestaticStringfromDirPath; privatestaticStringtoFilePath; publicstaticvoidmain(String[]args){ finalJFramejf=newJFrame("测试窗口"); jf.setSize(400,250); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanelpanel=newJPanel(); //创建文本区域,用于显示相关信息 finalJTextAreamsgTextArea=newJTextArea(10,30); msgTextArea.setLineWrap(true); panel.add(msgTextArea); JButtonopenBtn=newJButton("选择文件路径"); openBtn.addActionListener(e->showFileOpenDialog(jf,msgTextArea)); panel.add(openBtn); JButtonsaveBtn=newJButton("结果保存位置"); saveBtn.addActionListener(e->showFileSaveDialog(jf,msgTextArea)); panel.add(saveBtn); jf.setContentPane(panel); jf.setVisible(true); JButtonenSureBtn=newJButton("确认"); enSureBtn.addActionListener(e->enSureListener(jf)); panel.add(enSureBtn); jf.setContentPane(panel); jf.setVisible(true); } /* *打开文件 */ privatestaticvoidshowFileOpenDialog(Componentparent,JTextAreamsgTextArea){ //创建一个默认的文件选取器 JFileChooserfileChooser=newJFileChooser(); //设置默认显示的文件夹为当前文件夹 fileChooser.setCurrentDirectory(newFile(".")); //设置文件选择的模式(只选文件、只选文件夹、文件和文件均可选) fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); //设置是否允许多选 fileChooser.setMultiSelectionEnabled(false); ////添加可用的文件过滤器(FileNameExtensionFilter的第一个参数是描述,后面是需要过滤的文件扩展名可变参数) //fileChooser.addChoosableFileFilter(newFileNameExtensionFilter("zip(*.zip,*.rar)","zip","rar")); // ////设置默认使用的文件过滤器 //fileChooser.setFileFilter(newFileNameExtensionFilter("image(*.jpg,*.png,*.gif)","jpg","png","gif")); //打开文件选择框(线程将被阻塞,直到选择框被关闭) intresult=fileChooser.showOpenDialog(parent); if(result==JFileChooser.APPROVE_OPTION){ //如果点击了"确定",则获取选择的文件路径 Filefile=fileChooser.getSelectedFile(); fromDirPath=file.getAbsolutePath(); msgTextArea.append("选择源文件:"+fromDirPath+"\n\n"); } } /* *选择文件保存路径 */ privatestaticvoidshowFileSaveDialog(Componentparent,JTextAreamsgTextArea){ //创建一个默认的文件选取器 JFileChooserfileChooser=newJFileChooser(); //把时间戳经过处理得到期望格式的时间 Datedate=newDate(); SimpleDateFormatformat0=newSimpleDateFormat("yyyyMMddHHmmss"); Stringnow=format0.format(date.getTime()); //设置打开文件选择框后默认输入的文件名 fileChooser.setSelectedFile(newFile(now+".xlsx")); //打开文件选择框(线程将被阻塞,直到选择框被关闭) intresult=fileChooser.showSaveDialog(parent); if(result==JFileChooser.APPROVE_OPTION){ //如果点击了"保存",则获取选择的保存路径 Filefile=fileChooser.getSelectedFile(); toFilePath=file.getAbsolutePath(); msgTextArea.append("结果文件路径:"+toFilePath+"\n\n"); } } //找到需要的内容 publicfinalstaticPatternpattern=Pattern.compile("\\[Subject\\].*?O=(.*?),.*?\\[Issuer\\](.*?)\\[SerialNumber\\](.*?)\\[NotBefore\\](.*?)\\[NotAfter\\](.*?)\\[Thumbprint\\](.*?)"); //剔除特殊字符 publicfinalstaticPatternreplacePattern=Pattern.compile("\t|\r|\n"); /** *查找某个路径下的所有pdf文件 * *@return所有的pdf绝对路径 */ publicstaticHashSet listDir(Stringpath){ HashSet FileNameString=newHashSet (); Filefile=newFile(path);//获取其file对象 File[]fs=file.listFiles();//遍历path下的文件和目录,放在File数组中 if(fs==null){ System.out.println(path+"路径下没有文件"); returnnull; } //遍历File[]数组 for(Filef:fs){ StringfileName=String.valueOf(f); if(!f.isDirectory()&&fileName.toLowerCase().endsWith(".pdf"))//若非目录(即文件),则打印 FileNameString.add(fileName); } returnFileNameString; } /** *检验pdf文件是否签名 * *@paramfilePathpdf文件绝对路径 */ publicstaticExcelDataVOcheckPdf(StringfilePath){ //创建PdfDocument实例 PdfDocumentdoc=newPdfDocument(); //创建结果集 ExcelDataVOexcelDataVO=newExcelDataVO(); //文件名,注意windows下应该是\\,linux下是/ StringfileName=filePath.substring(filePath.lastIndexOf("\\")+1); excelDataVO.setFileName(fileName); //加载含有签名的PDF文件 doc.loadFromFile(filePath); //获取域集合 PdfFormWidgetpdfFormWidget=(PdfFormWidget)doc.getForm(); PdfFormFieldWidgetCollectionpdfFormFieldWidgetCollection=pdfFormWidget.getFieldsWidget(); //intcountCollection=pdfFormFieldWidgetCollection.getCount(); //System.out.println("共发现"+countCollection+"个域"); //遍历域 for(inti=0;i filePaths=listDir(fromDirPath); if(filePaths==null){ return; } List excelDataVOS=newArrayList<>(); for(StringfilePath:filePaths){ ExcelDataVOexcelDataVO=checkPdf(filePath); excelDataVOS.add(excelDataVO); } ExcelWriter.writeExcel(excelDataVOS,toFilePath); System.out.println("验签完成..."); } }
以上就是用Java验证pdf文件的电子章签名的详细内容,更多关于Java验证pdf文件的电子章签名的资料请关注毛票票其它相关文章!