使用Java对PDF进行电子签章 | 您所在的位置:网站首页 › 怎么用手机在pdf上签名字用什么软件 › 使用Java对PDF进行电子签章 |
使用Java对PDF进行电子签章
开始之前前期准备开始生成keystore证书来张材料全家福编码项目结构签署工具类
开始之前
公司近期做的项目用到了电子签章(给PDF盖章签名),这过程真是曲折。恰逢现在时间比较空闲(有时间摸鱼)。我把签章的过程给记录下来
前期准备
1. 需要签名的PDF (废话,没有PDF签什么名啊~)
2. 给PDF签名的印章图片 (貌似也是废话)
3. keystore 证书文件 (先认识认识,教程接下来会说怎么生成)
开始
生成keystore证书
安装有JDK的机器,并配置系统变量 (安装教程很多,自行百度) ![]() ![]() 说明: -alias 证书别名 -keyalg 算法,有两种:RSA 和 CipherSuite RSA -validity 证书有效期,我这里是30天 -keystore 证书的名称以及路径(方便演示,我这里放在桌面) 输入口令的时候,出于安全考虑是不显示的。直接输入密码再次确认就行。 然后输入一些信息,按照提示输入就行。输入密钥口令的时候如果和上面密钥库口令相同可以直接回车,我这里使用相同的,直接回车。 回车完之后在哪里找到呢? 打开C盘 -> 用户 -> [用户名] 就可以找到刚才生成的证书了。 至此,需要的资料就准备完毕了~ 接下来…废话少说,直接上号 创建项目: -放一张结构图,防止找不到在哪里 OK 到这里我们的签署就完成了,下面只需要去提供参数调用该工具类就行。那我们直接开搞 在测试类KeystoreDemoApplicationTests给出以下代码 import com.example.utils.KeystoreUtils; import com.itextpdf.text.pdf.security.DigestAlgorithms; import com.itextpdf.text.pdf.security.MakeSignature; import org.springframework.boot.test.context.SpringBootTest; import javax.swing.*; import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.Certificate; @SpringBootTest class KeystoreDemoApplicationTests { public static final String KEYSTORE = "D:\\android.keystore"; // 之前生成的keystory密码 public static final char[] PASSWORD = "123456".toCharArray(); // 需要签名的PDF路径 public static final String SRC = "D:\\abc.pdf"; // 完成签名的PDF路径 public static final String OUTPUT_SRC = "D:\\abc-sign.pdf"; public static final String IMG = "D:\\seal01.jpg"; public static void main(String[] args) { try { //读取keystore ,获得私钥和证书链 KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream(KEYSTORE), PASSWORD); String alias = (String)keyStore.aliases().nextElement(); PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, PASSWORD); Certificate[] chain = keyStore.getCertificateChain(alias); KeystoreUtils keystoreUtils = new KeystoreUtils(); keystoreUtils.sign(SRC, String.format(OUTPUT_SRC, 3),IMG, chain, PrivateKey, DigestAlgorithms.SHA1, null, MakeSignature.CryptoStandard.CMS, "Test", "Ghent"); } catch (Exception e) { JOptionPane.showMessageDialog(null, e.getMessage()); e.printStackTrace(); } } }直接运行看下效果 这样,我们就完成了电子签名。 我们再修改下一下KeystoreUtils中印章位置 appearance.setVisibleSignature(new Rectangle(200, 200, 300, 300), 1, "sign1");再运行查看 我们去康康摘要算法是怎么实现的 public class BouncyCastleDigest implements ExternalDigest { public BouncyCastleDigest() { } public MessageDigest getMessageDigest(String hashAlgorithm) throws GeneralSecurityException { String oid = DigestAlgorithms.getAllowedDigests(hashAlgorithm); if (oid == null) { throw new NoSuchAlgorithmException(hashAlgorithm); } else if (oid.equals("1.2.840.113549.2.2")) { return new Digest(); } else if (oid.equals("1.2.840.113549.2.5")) { return new org.bouncycastle.jcajce.provider.digest.MD5.Digest(); } else if (oid.equals("1.3.14.3.2.26")) { return new org.bouncycastle.jcajce.provider.digest.SHA1.Digest(); } else if (oid.equals("2.16.840.1.101.3.4.2.4")) { return new org.bouncycastle.jcajce.provider.digest.SHA224.Digest(); } else if (oid.equals("2.16.840.1.101.3.4.2.1")) { return new org.bouncycastle.jcajce.provider.digest.SHA256.Digest(); } else if (oid.equals("2.16.840.1.101.3.4.2.2")) { return new org.bouncycastle.jcajce.provider.digest.SHA384.Digest(); } else if (oid.equals("2.16.840.1.101.3.4.2.3")) { return new org.bouncycastle.jcajce.provider.digest.SHA512.Digest(); } else if (oid.equals("1.3.36.3.2.2")) { return new org.bouncycastle.jcajce.provider.digest.RIPEMD128.Digest(); } else if (oid.equals("1.3.36.3.2.1")) { return new org.bouncycastle.jcajce.provider.digest.RIPEMD160.Digest(); } else if (oid.equals("1.3.36.3.2.3")) { return new org.bouncycastle.jcajce.provider.digest.RIPEMD256.Digest(); } else if (oid.equals("1.2.643.2.2.9")) { return new org.bouncycastle.jcajce.provider.digest.GOST3411.Digest(); } else { throw new NoSuchAlgorithmException(hashAlgorithm); } } }哦~ 这一顿操作下来原来是要我们给算法名啊。根据不同的算法获取对应的签名摘要。当然我们也可以自己去实现,签名算法同样也可以由我们自己实现(敲黑板,我要留作业了) 你学废了吗? 创作不易,请点个赞嘛~ |
CopyRight 2018-2019 实验室设备网 版权所有 |