itextpdf 提取数字签名签章图片
itextpdf 提取数字签名签章图片
因业务需求,需要对签名的pdf进行签名验证,政府的电子验证的功能是除了提取pdf表单内容外,还可以提取签章的图片,研究了好久,特此记录一下。
/*** 获取pdf签名图片信息* @param path pdf文件* @param fileBasePath 图片保存基础路径* @return 提取结果*/
public static PdfSignInfo getImageFromPdf(String path, String fileBasePath) {PdfSignInfo pdfSignInfo = new PdfSignInfo();try {FileInputStream fis = new FileInputStream(path);PdfReader reader = new PdfReader(fis);String fileName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));if (!fileBasePath.endsWith("/")) {fileBasePath = fileBasePath + "/";}fileBasePath = fileBasePath + fileName + "/";File file = new File(fileBasePath);file.mkdirs();pdfSignInfo.setName(path.substring(path.lastIndexOf("/") + 1));Field rsaDataField = PdfPKCS7.class.getDeclaredField("RSAdata");rsaDataField.setAccessible(true);int numberOfPages = reader.getNumberOfPages();// pdf 页码数量log.debug("page size: {}", numberOfPages);int xrefSize = reader.getXrefSize();ExtImageRenderListener listener = new ExtImageRenderListener();listener.setBasePath(fileBasePath);// 获取acro字段AcroFields fields = reader.getAcroFields();Rectangle pageSize = reader.getPageSize(numberOfPages - 1);// pdf 作用域尺寸(全屏)log.info("pdf rectangle: {},{},{},{}", pageSize.getLeft(), pageSize.getBottom(), pageSize.getRight(), pageSize.getTop());// 获取签名名称ArrayList<String> signatureNames = fields.getSignatureNames();for (String name : signatureNames) {// 指定提供者 获取签名的pkcs7数据PdfPKCS7 pkcs7 = fields.verifySignature(name);X509Certificate certificate = pkcs7.getSigningCertificate();PdfSignInfo.SignatureDetail info = new PdfSignInfo.SignatureDetail();String[] appearanceStates = fields.getAppearanceStates(name);// 表单域的位置List<AcroFields.FieldPosition> fieldPositions = fields.getFieldPositions(name);for (AcroFields.FieldPosition fieldPosition : fieldPositions) {Rectangle position = fieldPosition.position;log.info("field {} position: {}, {}, {}, {}, {}", name, fieldPosition.page,position.getLeft(), position.getBottom(), position.getRight(), position.getTop());info.page = fieldPosition.page;info.llx = position.getLeft();info.lly = position.getBottom();info.urx = position.getRight();info.ury = position.getTop();}AcroFields.Item fieldItem = fields.getFieldItem(name);int size = fieldItem.size();for (int i = 0; i < size; i++) {PdfDictionary value = fieldItem.getValue(i);Set<PdfName> keys = value.getKeys();for (PdfName key : keys) {String keyName = PdfName.decodeName(new String(key.getBytes()));if ("Rect".equalsIgnoreCase(keyName)) {log.debug("签名域的坐标为:{}", value.get(key));}}PdfObject pdfObject = value.get(PdfName.AP);if (pdfObject != null) {PdfDictionary dictionary = (PdfDictionary) pdfObject;PdfIndirectReference ref = (PdfIndirectReference) dictionary.get(PdfName.N);int number = ref.getNumber();log.debug("fieldName: {}, idx: {}", name, number);// 根据ap 获取签章图片PdfObject pdfObjectRelease = reader.getPdfObject(number);if (pdfObjectRelease instanceof PdfStream) {PdfStream s = (PdfStream) pdfObjectRelease;PdfDictionary resources = s.getAsDict(PdfName.RESOURCES);listener.setI(number);try {PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);processor.processContent(ContentByteUtils.getContentBytesFromContentObject(s), resources);info.filePath = fileBasePath + number + ".png";} catch (Exception ignore) {}}}}// 签名信息info.name = name;info.time = pkcs7.getSignDate().getTime();info.notBefore = certificate.getNotBefore();info.notAfter = certificate.getNotAfter();info.dnName = certificate.getSubjectDN().getName();info.serialNumber = certificate.getSerialNumber();info.pubKey = Base64Encoder.encode(certificate.getPublicKey().getEncoded());info.pubKeyFormat = certificate.getPublicKey().getFormat();info.sigAlgName = certificate.getSigAlgName();info.userDnName = certificate.getIssuerDN().getName();info.reason = pkcs7.getReason();info.location = pkcs7.getLocation();info.res = pkcs7.verify();pdfSignInfo.getSignatureDetails().add(info);}log.info(JSON.toJSONString(pdfSignInfo));} catch (Exception e) {e.printStackTrace();}return pdfSignInfo;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PdfSignInfo {private String name;private List<SignatureDetail> signatureDetails = new ArrayList<>();public static class SignatureDetail {public String name;// 签名日期时间public Date time;// 有效期开始时间public Date notBefore;// 有效期public Date notAfter;// 证书名称public String dnName;// 序列号public BigInteger serialNumber;// 证书格式 // 证书颁发者public String pubKey, pubKeyFormat, sigAlgName, userDnName;public boolean res;public String imageContent, imagePath;public String reason, location;public int page;public float llx, lly, urx, ury;public String filePath;}}
@Slf4j
@Data
public class ExtImageRenderListener implements RenderListener {private int i;private String basePath;@Overridepublic void beginTextBlock() {}public void setBasePath(String basePath) {if (basePath.endsWith("/")) {this.basePath = basePath;} else {this.basePath = basePath + "/";}}@Overridepublic void renderText(TextRenderInfo renderInfo) {}@Overridepublic void endTextBlock() {}PdfDictionary resources;List<List<Integer>> numbers = new ArrayList<>();@SneakyThrows@Overridepublic void renderImage(ImageRenderInfo renderInfo) {PdfImageObject image = renderInfo.getImage();if (image == null) {log.debug("Image {} could not be read", renderInfo.getRef().getNumber());return;}BufferedImage bufferedImage = image.getBufferedImage();if (bufferedImage != null) {log.debug("bufferedImage: {}", bufferedImage.getHeight());writeImage(bufferedImage);}// PRStream maskStream = (PRStream) image.getDictionary().getAsStream(PdfName.SMASK);
// if (maskStream != null) {// PdfImageObject pdfImageObject = new PdfImageObject(maskStream);
// log.debug("mask image: {}", pdfImageObject.getFileType());
// BufferedImage mask = pdfImageObject.getBufferedImage();
// writeImage(mask);
// }}private void writeImage(BufferedImage bufferedImage) {try {File file = new File(basePath + i + ".png");if (file.exists()) {return;}log.debug("generated image: {}", file.getPath());ImageIO.write(bufferedImage, "png", file);} catch (IOException e) {e.printStackTrace();}}
}
itextpdf 提取数字签名签章图片相关推荐
- 使用Adobe Acrobat提取PDF签章图片
1.Adobe Arcobat 打开带有签章的pdf文件 2.选择 工具>导出PDF,选择Microsoft Word,导出 3.打开导出的pdf文件,在签章图片上,选择另存图片
- HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章 电子签章图片采集
电子签章图片采集 印章图片的采集两种互补方式: 方式1:在线生成印章图片方式,但是这种方式有个弊端,对印章中公司名称字数有限制,字数越多可能就完蛋了. 方式2:上传印章扫描件,系统来对扫描图片进行处理 ...
- HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章
HTML5印章绘制电子签章图片,中文英文椭圆章.中文英文椭圆印章 原文:HTML5印章绘制电子签章图片,中文英文椭圆章.中文英文椭圆印章 电子签章图片采集 印章图片的采集两种互补方式: 方式1:在线生 ...
- HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
HTML5印章绘制电子签章图片(中文英文椭圆章.中文英文椭圆印章) 这篇文章主要介绍了HTML5印章绘制电子签章图片(中文英文椭圆章.中文英文椭圆印章),文中通过示例代码介绍的非常详细,对大家的学习或 ...
- python获取视频帧的时间_Python提取视频中图片的示例(按帧、按秒)
一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'D:\\test\\' ...
- python做视频抽帧图_Python提取视频中图片的示例(按帧、按秒)
一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'd:\\test\\' ...
- Python PDF转Word,以及提取Word中图片里的文字
PDF转Word,以及提取Word中图片里的文字 PS: 也是从网上各个帖子中学习的Python,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 软件截图: #!/usr/bin/ ...
- python:批量处理txt文件,读取txt文件内容,根据内容(例子为数字1)提取出对应txt文件到其他文件夹,后根据txt文件名提取对应名字图片。
本段代码为根据想要内容(数字1),把所有txt文件中有数字1的复制保存至其他文件夹 # 提取全部txt文件中 含有pf缺陷的txt文件 保存至其他文件夹中import os import shuti ...
- java提供图片链接,提取网页的图片链接的Java程序
提取网页的图片链接的Java程序 输入网页文件名,和资源列表文件名 输出资源列表文件供迅雷下载. 适用于批量下载图片. 由两个文件组成. 没有提供网页下载功能,因为我没有时间写,相关的代码以后再贴. ...
- PDF 签章图片不显示问题
问题 使用word等工具转换PDF文档签章的文件,使用WPS.Chrome 等均无法显示签章图片,但是使用最新的pdf.js 却可以显示图片. 分析 在使用word等工具转换PDF时,PDF可能会转换 ...
最新文章
- jsp+ajax+servlet+sqlserver实现分页查询_SXT DAY063 分页
- 数据分析入门(第一课)
- mysql内置的变量,MySQL服务器模式及相关内置变量
- 《Sklearn 与 TensorFlow 机器学习实用指南》 第6章 决策树
- 是什么影响了数据库索引选型?
- Unix 电子书大全
- Airbnb搜索:深度学习排序算法如何进化?
- 《高性能科学与工程计算》—— 导读
- 在python 中is和= = 的区别
- E4A直播盒子APP源码搭建教程之——APP源码篇
- C++ malloc头文件
- 【路径规划】基于遗传算法求解同时取送货车辆路径问题matlab代码
- SQL行列转换-sum函数的妙用
- 高交会美女图片!!!
- 空气质量等级c语言编程,字节跳动2018秋招编程题——空气质量
- FPGA的学习:基于ROM的VGA图像显示(弹跳特效)
- MNF最小噪声分离变换(转)
- pytorch入门(二):数据加载和处理
- 张超 计算机 清华 论文,张超-清华大学航天航空学院
- pytorch之词嵌入(三)
热门文章
- 一种可以自我修改的计算机器
- autocad ios 虚线_autocad 如何画虚线
- opencv之扩展模块安装
- 批量导出导入docker镜像
- Unmapped Spring configuration files found. Please configure Spring facet or use ‘Create Default Con
- 陈坤发微博调侃 回应儿子生母话题
- 思维导图一定要用计算机来完成吗,程序猿不仅可以用电脑敲代码,还可以用来制作思维导图...
- 电瓶车续航测试软件,谁的续航更真实? 新出行为你测试三款市面上主流电动车...
- Python基础之键盘操作
- 自动化爬虫selenium之键盘操作