Links
developers   about

Signing a pdf file with javasign



Following an example of use of javasign api to sign a pdf file. It's necessary to have the itext library in classpath.
////////////////////////////////////////////////////
////////////////////////////////////////////////////
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.cert.Certificate;

import org.javasign.operators.CryptokiGenerator;

import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfDictionary;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.pdf.PdfPKCS7;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfSignatureAppearance;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfString;

/*
 * Created on 20-may-2009
 */

/**
 * @author raffaello bindi
 */
public class JavaSignSigner {



public static void main(String[] args) {




	String driver="incryptoki2.dll";
	//String driver="bit4opki.dll";


	String KEY_LABEL="DSPrivateKey#0";
	//String KEY_LABEL="Firma_CNS";

	String PIN="123456";
	String SIGN_PIN="000000";



	try {


		CryptokiGenerator p7genSC = new CryptokiGenerator(driver,KEY_LABEL,PIN,SIGN_PIN);


		Certificate[] certs = new Certificate[1];

		//BelpicCard scd = new BelpicCard("");


		//certs[0] = scd.getNonRepudiationCertificate();
		certs[0] = p7genSC.getCertificate();


		PdfReader reader = new PdfReader("unsigned.pdf");

		FileOutputStream fout = new FileOutputStream("signed.pdf");
		PdfStamper stamper = PdfStamper.createSignature(reader, fout, '\0');
		PdfSignatureAppearance sap = stamper.getSignatureAppearance();
		sap.setCrypto(
		null, certs, null, PdfSignatureAppearance.SELF_SIGNED);

		sap.setReason("How to use iText and Javasign with an Italian smart card");
		sap.setLocation("Italy");
		sap.setVisibleSignature(new Rectangle(30, 750, 500, 565), 1, null);
		sap.setExternalDigest(new byte[128], new byte[20], "RSA");
		sap.preClose();

		PdfPKCS7 sig = sap.getSigStandard().getSigner();

		byte[] content = streamToByteArray(sap.getRangeStream());

		//byte[] hash = MessageDigest.getInstance("SHA-1").digest(content);

		//byte[] signatureBytes = scd.generateNonRepudiationSignature(hash);
		byte[] signatureBytes =p7genSC.buildSignature(content);

		sig.setExternalDigest(signatureBytes, null, "RSA");
		PdfDictionary dic = new PdfDictionary();
		dic.put(PdfName.CONTENTS,
		new PdfString(sig.getEncodedPKCS1()).setHexWriting(true));
		sap.close(dic);



	} catch (Exception e) {

		e.printStackTrace();
	}


}
public static byte[] streamToByteArray(InputStream is) throws IOException{

	byte[] buff = new byte[512];
	int read=-1;
	ByteArrayOutputStream bos = new ByteArrayOutputStream();

	while((read=is.read(buff))>=0){

		bos.write(buff,0,read);
	}
	bos.close();

	return bos.toByteArray();
}
}