Hellow:
Here is my code for multiple signatures with Certification Level
"CERTIFIED_FORM_FILLING_AND_ANNOTATIONS". When add "Signature1" at Blank
Signature Form Field, the previous signature (certified) break.
Excuse me. I am from Argentina. I can not write English very well.
Step 1: Add blank Signature1 field
stp = new PdfStamper(reader, fout.getOutputStream(),'\0',true);
PdfFormField sig = PdfFormField.createSignature(stp.getWriter());
sig.setWidget(new Rectangle(350, 100, 590, 200), null);
sig.setFieldFlags(PdfAnnotation.FLAGS_PRINT);
sig.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g"));
sig.setFieldName("Signature1");
sig.setPage(1);
stp.addAnnotation(sig, 1);
stp.close();
Step 2: Add Signature2 with Certification Level
stp = PdfStamper.createSignature(reader,
fout.getOutputStream(), '\0',null,true);
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null,
PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason(razon);
sap.setLocation(localidad);
sap.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS);
int cant_paginas = reader.getNumberOfPages();
Calendar signingDate = sap.getSignDate();
Format formatter = new SimpleDateFormat("dd/MM/yyyy");
fecha_firma =
new String(formatter.format(signingDate.getTime()) + "
" +
new
Time(signingDate.getTimeInMillis()).toString());
Certificate[] certChain = sap.getCertChain();
String digitallySignedBy =
"" +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("DN")
+
"\n";
digitallySignedBy =
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("CN")
+
"\n";
if
(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("T")
!=
null)
digitallySignedBy =
digitallySignedBy +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("T")
+
"\n";
if
(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("O")
!=
null)
digitallySignedBy =
digitallySignedBy +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("O")
+
"\n";
if
(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("OU")
!=
null)
digitallySignedBy =
digitallySignedBy +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("OU")
+
"\n";
digitallySignedBy = digitallySignedBy + "\n";
digitallySignedBy =
digitallySignedBy + "Fecha de firma:" +
formatter.format(signingDate.getTime()) +
"\n";
sap.setLayer2Font(new Font(Font.TIMES_ROMAN, 10, Font.ITALIC,
Color.BLUE));
sap.setLayer2Text(digitallySignedBy);
sap.setImage(Image.getInstance(PDFSigner.class.getClassLoader().getResource("image/marcafirma.png")));
sap.setAcro6Layers(true);
sap.setVisibleSignature(rectangulo, cant_paginas, null);
sap.setExternalDigest(null, new byte[20], null);
sap.preClose();
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
byte buf[] = new byte[8192];
int n;
InputStream inp = sap.getRangeStream();
while ((n = inp.read(buf)) > 0) {
messageDigest.update(buf, 0, n);
}
byte hash[] = messageDigest.digest();
PdfSigGenericPKCS sg = sap.getSigStandard();
PdfLiteral slit = (PdfLiteral)sg.get(PdfName.CONTENTS);
byte[] outc = new byte[(slit.getPosLength() - 2) / 2];
PdfPKCS7 sig = sg.getSigner();
sig.setExternalDigest(null, hash, null);
PdfDictionary dic = new PdfDictionary();
byte[] ssig = sig.getEncodedPKCS7();
System.arraycopy(ssig, 0, outc, 0, ssig.length);
dic.put(PdfName.CONTENTS, new
PdfString(outc).setHexWriting(true));
sap.close(dic);
Step 3: Fill form field Signature1
stp = PdfStamper.createSignature(reader,
fout.getOutputStream(),'\0',null,true));
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setVisibleSignature("Signature1");
sap.setCrypto(key, chain, null,
PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason(razon);
sap.setLocation(localidad);
int cant_paginas = reader.getNumberOfPages();
Calendar signingDate = sap.getSignDate();
Format formatter = new SimpleDateFormat("dd/MM/yyyy");
fecha_firma =
new String(formatter.format(signingDate.getTime()) + "
" +
new
Time(signingDate.getTimeInMillis()).toString());
Certificate[] certChain = sap.getCertChain();
String digitallySignedBy =
"" +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("DN")
+
"\n";
digitallySignedBy =
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("CN")
+
"\n";
if
(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("T")
!=
null)
digitallySignedBy =
digitallySignedBy +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("T")
+
"\n";
if
(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("O")
!=
null)
digitallySignedBy =
digitallySignedBy +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("O")
+
"\n";
if
(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("OU")
!=
null)
digitallySignedBy =
digitallySignedBy +
PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("OU")
+
"\n";
digitallySignedBy = digitallySignedBy + "\n";
digitallySignedBy =
digitallySignedBy + "Fecha de firma:" +
formatter.format(signingDate.getTime()) +
"\n";
sap.setLayer2Font(new Font(Font.TIMES_ROMAN, 10, Font.ITALIC,
Color.BLUE));
sap.setLayer2Text(digitallySignedBy);
sap.setImage(Image.getInstance(PDFSigner.class.getClassLoader().getResource("image/marcafirma.png")));
sap.setAcro6Layers(true);
sap.setExternalDigest(null, new byte[20], null);
sap.preClose();
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
byte buf[] = new byte[8192];
int n;
InputStream inp = sap.getRangeStream();
while ((n = inp.read(buf)) > 0) {
messageDigest.update(buf, 0, n);
}
byte hash[] = messageDigest.digest();
PdfSigGenericPKCS sg = sap.getSigStandard();
PdfLiteral slit = (PdfLiteral)sg.get(PdfName.CONTENTS);
byte[] outc = new byte[(slit.getPosLength() - 2) / 2];
PdfPKCS7 sig = sg.getSigner();
sig.setExternalDigest(null, hash, null);
PdfDictionary dic = new PdfDictionary();
byte[] ssig = sig.getEncodedPKCS7();
System.arraycopy(ssig, 0, outc, 0, ssig.length);
dic.put(PdfName.CONTENTS, new
PdfString(outc).setHexWriting(true));
sap.close(dic);
Please, can you help me to see my error?
Thanks
-----------------------------------
Visite nuestra página en Internet:
http://www.mendoza.edu.ar
Dirección General de Escuelas
MENDOZA - ARGENTINA
-----------------------------------
~
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
Do you like iText?
Buy the iText book: http://www.1t3xt.com/docs/book.php
Or leave a tip: https://tipit.to/itexttipjar