用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(ListdataList){
//生成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;idataVOList,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绝对路径
*/
publicstaticHashSetlistDir(Stringpath){
HashSetFileNameString=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;ifilePaths=listDir(fromDirPath);
if(filePaths==null){
return;
}
ListexcelDataVOS=newArrayList<>();
for(StringfilePath:filePaths){
ExcelDataVOexcelDataVO=checkPdf(filePath);
excelDataVOS.add(excelDataVO);
}
ExcelWriter.writeExcel(excelDataVOS,toFilePath);
System.out.println("验签完成...");
}
}
以上就是用Java验证pdf文件的电子章签名的详细内容,更多关于Java验证pdf文件的电子章签名的资料请关注毛票票其它相关文章!