package itext_test.sign; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.PrivateKey; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; import com.lowagie.text.pdf.PdfSignatureAppearance; import java.io.File; import java.security.Security; public class SignByDigitalID { static final int SIGNTYPE_INVISIBLE = 0; static final int SIGNTYPE_VISIBLE = 1; static final int SIGNTYPE_FIELD = 2; public static void main(String[] args) throws Exception { if (!new File("HelloWorld.pdf").exists()) com.lowagie.examples.general.HelloWorld.main(null); // If you don't use BouncyCastle as a security provider, you have to modify the next line. if (Security.getProvider("BC") == null) Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); stampSignature("HelloWorld.pdf", "VisibleSigned.pdf", "self-sign-test.pfx", "password", SIGNTYPE_VISIBLE, null, false, new Rectangle(100, 100, 200, 200), 1, "Signed by visible signature.", "Hyogo"); stampSignature("HelloWorld.pdf", "InvisibleSigned.pdf", "self-sign-test.pfx", "password", SIGNTYPE_INVISIBLE, null, false, null, 0, "Signed by invisible signature.", "Takarazuka"); stampSignature("SignatureField.pdf", "SignedOnField.pdf", "self-sign-test.pfx", "password", SIGNTYPE_FIELD, "Signature", false, null, 0, "Signed on a field.", "Japan"); stampSignature("SignedOnField.pdf", "MultiSigned.pdf", "self-sign-test2.pfx", "password2", SIGNTYPE_VISIBLE, null, true, new Rectangle(300, 100, 400, 200), 1, "Multi-Signed by visible signature.", "Tokyo"); } static void stampSignature(String filename, String signedFilename, String keyFilename, String password, int signType, String fieldName, boolean append, Rectangle rect, int page, String reason, String location) throws Exception { KeyStore ks = KeyStore.getInstance("PKCS12"); ks.load(new FileInputStream(keyFilename), password.toCharArray()); String alias = (String)ks.aliases().nextElement(); PrivateKey key = (PrivateKey)ks.getKey(alias, password.toCharArray()); Certificate[] chain = ks.getCertificateChain(alias); PdfReader reader = new PdfReader(filename); FileOutputStream fout = new FileOutputStream(signedFilename); PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', (File)null, append); PdfSignatureAppearance sap = stp.getSignatureAppearance(); sap.setCrypto(key, chain, null, PdfSignatureAppearance.SELF_SIGNED); sap.setReason(reason); sap.setLocation(location); switch (signType) { case SIGNTYPE_VISIBLE: sap.setVisibleSignature(rect, page, fieldName); break; case SIGNTYPE_FIELD: sap.setVisibleSignature(fieldName); break; default: break; } stp.close(); } }