package org.liuy.pdf.dao;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.GregorianCalendar;
import java.util.HashMap;
import org.liuy.pdf.service.SignWithBCService;
import org.liuy.pdf.service.impl.SignWithBCServiceImpl;
import org.liuy.security.Base64;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfDate;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfPKCS7;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignature;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfString;
public class SignWithBC {
public byte[] signPdf(byte[] inPdfByte)
throws Exception{
SignWithBCService sw=new SignWithBCServiceImpl();
Certificate[] chain=sw.getCertChain();
PdfReader reader = new PdfReader(inPdfByte);
ByteArrayOutputStream os=new ByteArrayOutputStream();
PdfStamper stp = PdfStamper.createSignature(reader, os, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
sap.setSignDate(new GregorianCalendar());
sap.setCrypto(null, chain, null, null);
sap.setAcro6Layers(true);
sap.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);
PdfSignature dic=null;
dic = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
dic.setDate(new PdfDate(sap.getSignDate()));
dic.setName(PdfPKCS7.getSubjectFields((X509Certificate)chain[0]).getField("CN"));
dic.setReason("111");
dic.setLocation("eee");
sap.setCryptoDictionary(dic);
int csize = 4000;
HashMap<PdfName,Integer> exc = new HashMap<PdfName,Integer>();
exc.put(PdfName.CONTENTS, new Integer(csize * 2 + 2));
sap.preClose(exc);
String B64sh1=sw.encodeSHA1(sap);
String sigV=sw.createPKCS7ByBC(Base64.decode(B64sh1));//��ȡp7ǩ����Ϣ
byte[] pk = Base64.decode(sigV);
byte[] outc = new byte[csize];
PdfDictionary dic2 = new PdfDictionary();
System.arraycopy(pk, 0, outc, 0, pk.length);
dic2.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true));
sap.close(dic2);
return os.toByteArray();
}
public static void main(String[] args) throws Exception{
SignWithBC sw=new SignWithBC();
String path="d:/1.pdf";
FileInputStream fi=new FileInputStream(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = -1;
while ((i = fi.read()) != -1) {
baos.write(i);
}
byte[] b=sw.signPdf(baos.toByteArray());
FileOutputStream fo=new FileOutputStream("d:/1_3.pdf");
fo.write(b);
fo.close();
}
}