目录

1. 电子公章的制作

2. java工具keytool生成p12数字证书文件

3. pom依赖

4. 实体类

5. 工具类及测试示例

6. 效果


1. 电子公章的制作

做章网站:http://seal.biaozhiku.com/

  • 我们选择圆形印章

  • 然后输入公司名,输入章名输入编码然后点击395生成,最后点击保存图片,我们的个人专业章就实现了

2. java工具keytool生成p12数字证书文件

Keytool是用于管理**和证书的工具,位于%JAVA_HOME%/bin目录。 使用JDK的keytool工具

  • keytool在jdk的bin目录下

2. 打开keytool所在的bin目录,然后在上面的路径显示框中输入CMD,然后回车,即可在当前文件夹下打开命令提示符,并且路径是当前文件夹。

  • 生成数字文件,在命令行输入
  • keytool -genkeypair -alias whj -keypass 111111 -storepass 111111 -dname “C=CN,ST=SD,L=QD,O=haier,OU=dev,CN=haier.com” -keyalg RSA -keysize 2048 -validity 3650 -keystore D:\keystore\server.keystore

参数解释:

storepass keystore 文件存储密码
keypass 私钥加解密密码
alias 实体别名(包括证书私钥)
dname 证书个人信息
keyalt 采用公钥算法,默认是DSA keysize **长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA)
validity 有效期
keystore 指定keystore文件

  • 转换为p12格式

在命令行输入

keytool -importkeystore -srckeystore D:\keystore\server.keystore -destkeystore D:\keystore\whj.p12 -srcalias whj -destalias serverkey -srcstoretype jks -deststoretype pkcs12 -srcstorepass 111111 -deststorepass 111111 -noprompt

  • 生成的最终文件

3. pom依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version>
</dependency>
<!--itext7 pom-->
<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.0</version><type>pom</type>
</dependency>

4. 实体类

package com.example.demo.itext.model;import com.itextpdf.signatures.PdfSignatureAppearance;import java.security.PrivateKey;
import java.security.cert.Certificate;public class SignatureInfo {private String reason; //签名的原因,显示在pdf签名属性中/*** 将证书文件放入指定路径,并读取keystore ,获得私钥和证书链*/private String pkPath;/*** KeyStore类型*/private String keyStoreType;/*** 原PDF文件路径*/private String src;/*** 数字签章后的文件路径*/private String target;private String location;//签名的地点,显示在pdf签名属性中private String digestAlgorithm;//摘要算法名称,例如SHA-1private String imagePath;//图章路径private String fieldName;//表单域名称private Certificate[] chain;//证书链private PrivateKey pk;//签名私钥private int certificationLevel = 0; //批准签章private PdfSignatureAppearance.RenderingMode renderingMode;//表现形式:仅描述,仅图片,图片和描述,签章者和描述//图章属性private float rectllx;//图章左下角xprivate float rectlly;//图章左下角yprivate float recturx;//图章右上角xprivate float rectury;//图章右上角ypublic float getRectllx() {return rectllx;}public void setRectllx(float rectllx) {this.rectllx = rectllx;}public float getRectlly() {return rectlly;}public void setRectlly(float rectlly) {this.rectlly = rectlly;}public float getRecturx() {return recturx;}public void setRecturx(float recturx) {this.recturx = recturx;}public float getRectury() {return rectury;}public void setRectury(float rectury) {this.rectury = rectury;}public String getReason() {return reason;}public void setReason(String reason) {this.reason = reason;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public String getDigestAlgorithm() {return digestAlgorithm;}public void setDigestAlgorithm(String digestAlgorithm) {this.digestAlgorithm = digestAlgorithm;}public String getImagePath() {return imagePath;}public void setImagePath(String imagePath) {this.imagePath = imagePath;}public String getFieldName() {return fieldName;}public void setFieldName(String fieldName) {this.fieldName = fieldName;}public Certificate[] getChain() {return chain;}public void setChain(Certificate[] chain) {this.chain = chain;}public PrivateKey getPk() {return pk;}public void setPk(PrivateKey pk) {this.pk = pk;}public int getCertificationLevel() {return certificationLevel;}public void setCertificationLevel(int certificationLevel) {this.certificationLevel = certificationLevel;}public PdfSignatureAppearance.RenderingMode getRenderingMode() {return renderingMode;}public void setRenderingMode(PdfSignatureAppearance.RenderingMode renderingMode) {this.renderingMode = renderingMode;}public String getPkPath() {return pkPath;}public void setPkPath(String pkPath) {this.pkPath = pkPath;}public String getKeyStoreType() {return keyStoreType;}public void setKeyStoreType(String keyStoreType) {this.keyStoreType = keyStoreType;}public String getSrc() {return src;}public void setSrc(String src) {this.src = src;}public String getTarget() {return target;}public void setTarget(String target) {this.target = target;}
}

5. 工具类及测试示例

ItextUtil工具类参考:https://mp.csdn.net/mp_blog/creation/editor/128789640
package com.example.demo.itext.util;import com.example.demo.itext.model.KeyWordBean;
import com.example.demo.itext.model.SignatureInfo;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.StampingProperties;
import com.itextpdf.signatures.*;
import lombok.SneakyThrows;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.util.ResourceUtils;import java.io.*;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.util.List;
import java.util.Map;/*** 功能描述: pdf数字签章工具类 <br>** @Author: lhp* @Date: 2023/1/29 15:45*/
public class PdfStampUtil {/*** keystory密码,可以放到配置文件中*/public static final char[] PASSWORD = "111111".toCharArray();/*** 功能描述: PDF添加数字签章 <br>** @Param: [src:原PDF文件路径, target:数字签章后的文件路径, signatureInfo:参数]* @Return: void* @Author: lhp* @Date: 2023/1/29 15:33*/public static void sign(SignatureInfo signatureInfo) {// 原PDF文件路径String src = signatureInfo.getSrc();// 数字签章后的文件输出路径String target = signatureInfo.getTarget();InputStream inputStream = null;FileOutputStream outputStream = null;ByteArrayOutputStream result = new ByteArrayOutputStream();try {inputStream = new FileInputStream(src);ByteArrayOutputStream tempArrayOutputStream = new ByteArrayOutputStream();PdfReader reader = new PdfReader(inputStream);PdfSigner stamper = new PdfSigner(reader, tempArrayOutputStream, new StampingProperties());stamper.setCertificationLevel(signatureInfo.getCertificationLevel());// 获取数字签章属性对象PdfSignatureAppearance appearance = stamper.getSignatureAppearance();appearance.setReason(signatureInfo.getReason());appearance.setLocation(signatureInfo.getLocation());// 读取图章图片ImageData image = ImageDataFactory.create(signatureInfo.getImagePath());appearance.setSignatureGraphic(image);Float rectllx = signatureInfo.getRectllx();System.out.println("x:" + rectllx);Float rectlly = signatureInfo.getRectlly();System.out.println("y:" + rectlly);Float recturx = signatureInfo.getRecturx();System.out.println("recturx:" + recturx);Float rectury = signatureInfo.getRectury();System.out.println("rectury:" + rectury);appearance.setPageNumber(1);appearance.setPageRect(new Rectangle(rectllx, rectlly, recturx, rectury));
//            appearance.setPageRect(new Rectangle(rectllx, rectlly, image.getWidth(), image.getHeight()));// 设置图章的显示方式,如下选择的是只显示图章(还有其他的模式,可以图章和签名描述一同显示)appearance.setRenderingMode(signatureInfo.getRenderingMode());// 这里的itext提供了2个用于签名的接口,可以自己实现,后边着重说这个实现// 摘要算法IExternalDigest digest = new BouncyCastleDigest();// 签名算法Security.addProvider(new BouncyCastleProvider());// 签名算法IExternalSignature signature = new PrivateKeySignature(signatureInfo.getPk(), signatureInfo.getDigestAlgorithm(), BouncyCastleProvider.PROVIDER_NAME);// 调用itext签名方法完成pdf签章 //数字签名格式,CMS,CADEstamper.signDetached(digest, signature, signatureInfo.getChain(), null, null, null, 0, PdfSigner.CryptoStandard.CADES);inputStream = new ByteArrayInputStream(tempArrayOutputStream.toByteArray());// 定义输入流为生成的输出流内容,以完成多次签章的过程result = tempArrayOutputStream;outputStream = new FileOutputStream(target);outputStream.write(result.toByteArray());outputStream.flush();reader.close();} catch (Exception e) {throw new RuntimeException(e);} finally {try {if (null != outputStream) {outputStream.close();}if (null != inputStream) {inputStream.close();}if (null != result) {result.close();}} catch (IOException e) {throw new RuntimeException(e);}}}@SneakyThrowspublic static void pdfStamp(SignatureInfo signatureInfo) {String keyStoreType = signatureInfo.getKeyStoreType();KeyStore ks = KeyStore.getInstance(keyStoreType);// 将证书文件放入指定路径,并读取keystore ,获得私钥和证书链ks.load(new FileInputStream(ResourceUtils.getFile("classpath:whj.p12")), PASSWORD);String alias = ks.aliases().nextElement();PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);// 得到证书链Certificate[] chain = ks.getCertificateChain(alias);signatureInfo.setPk(pk);signatureInfo.setChain(chain);signatureInfo.setCertificationLevel(1);signatureInfo.setDigestAlgorithm(DigestAlgorithms.SHA1);signatureInfo.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);sign(signatureInfo);}public static void main(String[] args) {SignatureInfo signInfo = new SignatureInfo();signInfo.setReason("理由");signInfo.setLocation("位置");signInfo.setFieldName("demo");// 签章图片String imagePath = "F:\\software\\myfile\\南无阿弥陀佛电子印章制作平台.png";signInfo.setImagePath(imagePath);// 需要进行签章的pdfString path = "F:\\software\\myfile\\txt12_加水印_加水印.pdf";signInfo.setSrc(path);String target = "F:\\software\\myfile\\txt12-PdfStamp15.pdf";signInfo.setTarget(target);String keyStoreType = "PKCS12";signInfo.setKeyStoreType(keyStoreType);// 值越大,代表向x轴坐标平移 缩小 (反之,值越小,印章会橫向放大)
//        signInfo.setRectllx(100);// 值越大,代表向y轴坐标向上平移(反之,值越小,印章会纵向放大)
//        signInfo.setRectlly(100);// 值越大   代表向x轴坐标向右平移  (大小不变)signInfo.setRecturx(100);// 值越大,代表向y轴坐标向上平移(大小不变)signInfo.setRectury(100);Map<Integer, List<KeyWordBean>> listMap = ItextUtil.keyWordLocationMap("负责人签名:", path);KeyWordBean keyWordBean = listMap.get(1).get(0);
//        KeyWordBean keyWordBean = listMap.get(1).get(1);signInfo.setRectllx(keyWordBean.getX() + 70);signInfo.setRectlly(keyWordBean.getY() - 50);pdfStamp(signInfo);}
}

6. 效果

参考:

历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案: 历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案

itext根据关键字定位在pdf中的坐标_牛一样的程序员的博客-CSDN博客_itext 坐标

Itext7在PDF指定位置添加电子公章相关推荐

  1. java根据坐标在PDF指定位置添加文本

    目录 一.使用Aspose 1.前言: 2.创建一个模型 3.demo测试 二.使用Itext 1.前言 2.创建模型 3.测试demo 1)测试方法 2)实现代码 三.效果展示 一.使用Aspose ...

  2. pdfBox在pdf指定位置添加表格和内容

    功能描述:在右上角指定位置添加表格和文本. 实现思路:读取pdf,在指定位置画线,线段组成表格:指定位置也就是表格内写入文字.所有pdf坐标原点(0,0)都为左下角. 遇到问题:坐标原点大部分在左下角 ...

  3. python使用matplotlib可视化线图(line plot)、在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot)

    python使用matplotlib可视化线图(line plot).在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot) 目录

  4. pandas在dataframe指定位置添加新的数据列、使用insert函数

    pandas在dataframe指定位置添加新的数据列.使用insert函数 目录 pandas在dataframe指定位置添加新的数据列.使用insert函数 #仿真数据

  5. R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框、竖向文本框)

    R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框.竖向文本框) 目录

  6. js 对表格的动态操作(动态添加行,删除该行,在指定位置添加控件)

    ***************************************************************** js动态添加表的列,并在列中添加控件的方法<html> ...

  7. poi操作word替换模板向指定位置添加图表

    poi操作word替换模板向指定位置添加图表 首先是引入pom文件 <dependency><groupId>org.apache.poi</groupId>< ...

  8. 给PDF文档添加电子图章的方法

    在这电子商务遍地走的社会,电子图章被越来越多地应用在合同.发票和其它电子文档中.那么如果不会使用PS,该如何实现在文档中添加电子图章呢?今天就给各位老铁一种为PDF文档添加电子图章的方法. 工具: P ...

  9. Python向DataFrame中指定位置添加一列或多列

    对于这个问题,相信很多人都会很困惑,本篇文章将会给大家介绍一种非常简单的方式向DataFrame中任意指定的位置添加一列. 在此之前或许有不少读者已经了解了最普通的添加一列的方式,如下: import ...

最新文章

  1. Verilog以及VHDL所倡导的的代码准则
  2. “产教融合新范式,校企聚力新实践”——2018杭州云栖大会大学合作专场论坛成功举办...
  3. python常用函数-Python 学习:常用函数整理
  4. Linux命令scp用于远程文件的拷贝(上传和下载)
  5. Jenkins加Shell实现最简单的持续部署
  6. 中科院分词系统(NLPIR)JAVA简易教程
  7. JetBrains——账户登录错误(JetBrains Account Error:JetBrains Account connection error: www.jetbrains.com)解决方案
  8. linux指令-动态查看系统资源情况
  9. iOS原生的AVFoundation扫描二维码/条形码
  10. atitit uke企业行政部 世界行政区域划分表 与邮政编码规划 v5 r88.xlsx
  11. java字体倾斜_Java没有合成斜体字体
  12. iOS 注册极光推送
  13. 【光学】(杨氏双缝+劈尖)干涉+(单缝+多缝+圆孔+矩孔)衍射仿真matlab源码含GUI
  14. 科斯定理(交易费用足够低,谁用的好就归谁)
  15. python利用四个坐标点对图片目标区域最小外接矩形进行裁剪
  16. linux热迁移137error VMware vCenter Converter 问题小结
  17. C/C++函数调用约定(基于X86架构下)
  18. 这一刻我學會了堅強、給我一雙翅膀,我会向天空去翱翔。
  19. Hadoop实例学习(十三) Join应用
  20. 中兴换头;任正非表态中美差距还有 50 年;Google 回应隐私丑闻 | CSDN 极客头条...

热门文章

  1. 叫醒我的不是闹钟,是梦想
  2. IPv4和IPv6的链路本地地址的自动分配
  3. 跟hoowa学做智能路由
  4. 信息安全与密码学博士:应该掌握的52个知识--(2)T19-- Shamir秘密共享方案
  5. 《音视频直播------GPUImage》
  6. computed使用场景
  7. 公众号涨粉神器“易拉宝”上线啦!快速增加精准粉丝
  8. 短视频制作素材都在这了
  9. mysql 表和视图_MySQL中视图和普通表的区别
  10. Premiere 出现“该级别的帧大小/帧速率无效。请减小视频范围或帧速率,或者增加配置文件和级别,然后重试”的解决办法