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 提取数字签名签章图片相关推荐

  1. 使用Adobe Acrobat提取PDF签章图片

    1.Adobe Arcobat 打开带有签章的pdf文件 2.选择 工具>导出PDF,选择Microsoft Word,导出 3.打开导出的pdf文件,在签章图片上,选择另存图片

  2. HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章 电子签章图片采集

    电子签章图片采集 印章图片的采集两种互补方式: 方式1:在线生成印章图片方式,但是这种方式有个弊端,对印章中公司名称字数有限制,字数越多可能就完蛋了. 方式2:上传印章扫描件,系统来对扫描图片进行处理 ...

  3. HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章

    HTML5印章绘制电子签章图片,中文英文椭圆章.中文英文椭圆印章 原文:HTML5印章绘制电子签章图片,中文英文椭圆章.中文英文椭圆印章 电子签章图片采集 印章图片的采集两种互补方式: 方式1:在线生 ...

  4. HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)

    HTML5印章绘制电子签章图片(中文英文椭圆章.中文英文椭圆印章) 这篇文章主要介绍了HTML5印章绘制电子签章图片(中文英文椭圆章.中文英文椭圆印章),文中通过示例代码介绍的非常详细,对大家的学习或 ...

  5. python获取视频帧的时间_Python提取视频中图片的示例(按帧、按秒)

    一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'D:\\test\\' ...

  6. python做视频抽帧图_Python提取视频中图片的示例(按帧、按秒)

    一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'd:\\test\\' ...

  7. Python PDF转Word,以及提取Word中图片里的文字

    PDF转Word,以及提取Word中图片里的文字 PS: 也是从网上各个帖子中学习的Python,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 软件截图: #!/usr/bin/ ...

  8. python:批量处理txt文件,读取txt文件内容,根据内容(例子为数字1)提取出对应txt文件到其他文件夹,后根据txt文件名提取对应名字图片。

     本段代码为根据想要内容(数字1),把所有txt文件中有数字1的复制保存至其他文件夹 # 提取全部txt文件中 含有pf缺陷的txt文件 保存至其他文件夹中import os import shuti ...

  9. java提供图片链接,提取网页的图片链接的Java程序

    提取网页的图片链接的Java程序 输入网页文件名,和资源列表文件名 输出资源列表文件供迅雷下载. 适用于批量下载图片. 由两个文件组成. 没有提供网页下载功能,因为我没有时间写,相关的代码以后再贴. ...

  10. PDF 签章图片不显示问题

    问题 使用word等工具转换PDF文档签章的文件,使用WPS.Chrome 等均无法显示签章图片,但是使用最新的pdf.js 却可以显示图片. 分析 在使用word等工具转换PDF时,PDF可能会转换 ...

最新文章

  1. jsp+ajax+servlet+sqlserver实现分页查询_SXT DAY063 分页
  2. 数据分析入门(第一课)
  3. mysql内置的变量,MySQL服务器模式及相关内置变量
  4. 《Sklearn 与 TensorFlow 机器学习实用指南》 第6章 决策树
  5. 是什么影响了数据库索引选型?
  6. Unix 电子书大全
  7. Airbnb搜索:深度学习排序算法如何进化?
  8. 《高性能科学与工程计算》—— 导读
  9. 在python 中is和= = 的区别
  10. E4A直播盒子APP源码搭建教程之——APP源码篇
  11. C++ malloc头文件
  12. 【路径规划】基于遗传算法求解同时取送货车辆路径问题matlab代码
  13. SQL行列转换-sum函数的妙用
  14. 高交会美女图片!!!
  15. 空气质量等级c语言编程,字节跳动2018秋招编程题——空气质量
  16. FPGA的学习:基于ROM的VGA图像显示(弹跳特效)
  17. MNF最小噪声分离变换(转)
  18. pytorch入门(二):数据加载和处理
  19. 张超 计算机 清华 论文,张超-清华大学航天航空学院
  20. pytorch之词嵌入(三)

热门文章

  1. 一种可以自我修改的计算机器
  2. autocad ios 虚线_autocad 如何画虚线
  3. opencv之扩展模块安装
  4. 批量导出导入docker镜像
  5. Unmapped Spring configuration files found. Please configure Spring facet or use ‘Create Default Con
  6. 陈坤发微博调侃 回应儿子生母话题
  7. 思维导图一定要用计算机来完成吗,程序猿不仅可以用电脑敲代码,还可以用来制作思维导图...
  8. 电瓶车续航测试软件,谁的续航更真实? 新出行为你测试三款市面上主流电动车...
  9. Python基础之键盘操作
  10. 自动化爬虫selenium之键盘操作