【发布时间】:2016-02-18 13:51:28
【问题描述】:
我有一个简单的签名方法可以很好地签署 PDF 文档,它使用显示名称、位置、日期和原因的默认图章签署文档。
现在我的经理问我是否可以在上面再添加一个字段。假设这是一个“电子邮件”字段,因为我没有被告知他们想要什么。
我尝试搜索并应用我找到的东西,但没有任何效果。
另外,有人问我是否可以删除/隐藏这 4 个默认字段(日期、原因等)的标签,但我无法做到,也找不到任何相关信息,我没有不知道是否真的可以定制。
在这里,我将展示她的签名过程是如何工作的。在 middel 中,我在 iText 网站上找到了一些代码,并尝试使用它来添加“新字段”,但没有显示与默认标记不同的任何结果。
public String signPdfFirstTime(String src, String dest, PrivateKey pk, Certificate[] chain, String providerName, String conteudoBase64, X509Certificate cert) throws IOException, DocumentException, GeneralSecurityException {
byte[] content = Base64.decode(conteudoBase64);
FileOutputStream fos = new FileOutputStream(path + File.separator + src);
fos.write(content );
fos.close();
File f = new File(path + File.separator + src);
FileInputStream in = new FileInputStream(f);
PdfReader reader = new PdfReader(in);
FileOutputStream os = new FileOutputStream(path + File.separator + dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
// Creating the appearance
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason("SOME REASON");
appearance.setLocation("SOMEWHERE");
// appearance.getAppearance().curveFromTo(98, 120, 46, 94);
Rectangle rectangle = new Rectangle(0, 0, 500, 70);
appearance.setVisibleSignature(rectangle, 1, "SIGNATURE");
//Here I trid to add fields to the stamp
//NOT WORKING AS I EXPECTED...
PdfWriter writer = stamper.getWriter();
PdfFormField field = PdfFormField.createEmpty(writer);
field.setFieldName("TEST 1111");
TextField name = new TextField(writer,rectangle, "TEST 2222");
PdfFormField personal_name = name.getTextField();
field.addKid(personal_name);
TextField password = new TextField(writer, rectangle, "password");
PdfFormField personal_password = password.getTextField();
field.addKid(personal_password);
stamper.addAnnotation(field, 1);
appearance.setCertificate(cert);
// Creating the signature
ExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, providerName);
ExternalDigest digest = new BouncyCastleDigest();
List<CrlClient> crlList = new ArrayList<CrlClient>();
crlList.add(new CrlClientOnline());
LtvVerification v = stamper.getLtvVerification();
OcspClient ocspClient = new OcspClientBouncyCastle();
String url = CertificateUtil.getCRLURL(cert);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509CRL crl = (X509CRL) cf.generateCRL(new URL(url).openStream());
System.out.println("CRL valid until: " + crl.getNextUpdate());
System.out.println("Certificate revoked: " + crl.isRevoked(chain[0]));
if (crl.isRevoked(chain[0])) {
throw new GeneralSecurityException("CERTIFICADO REVOGADO!");
}
else {
MakeSignature.processCrl(cert, crlList);
MakeSignature.signDetached(appearance, digest, pks, chain, null, null, null, 0, CryptoStandard.CMS);
os.close();
byte[] b = this.read(f);
return Base64.encodeBytes(b);
}
}
【问题讨论】:
标签: java itext digital-signature