Search in sources :

Example 1 with PdfSignatureAppearance

use of com.itextpdf.text.pdf.PdfSignatureAppearance in project spring-cloud-digital-sign by SpringForAll.

the class PkxSign method sign.

public static void sign() throws Exception {
    BouncyCastleProvider provider = new BouncyCastleProvider();
    Security.addProvider(provider);
    KeyStore ks = KeyStore.getInstance("PKCS12");
    ks.load(new FileInputStream(cert_path), cert_pwd.toCharArray());
    String alias = (String) ks.aliases().nextElement();
    // PrivateKey pk = (PrivateKey) ks.getKey(alias, cert_pwd.toCharArray());
    // KeyStore ks = KeyStore.getInstance("PKCS12");
    // ks.load(new FileInputStream(cert_path), cert_pwd.toCharArray());
    PkxSign sign = new PkxSign();
    PrivateKey pk = sign.GetPvkformPfx(cert_path, cert_pwd);
    Certificate[] chain = ks.getCertificateChain(alias);
    PdfReader reader = new PdfReader(source_pdf);
    FileOutputStream os = new FileOutputStream(output_pdf);
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
    // Creating the appearance
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setReason("digtal signature");
    appearance.setLocation("FuZhou");
    appearance.setVisibleSignature(new Rectangle(0, 300, 300, 109), 1, "sig");
// Creating the signature
// ExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, provider.getName());
// ExternalDigest digest = new BouncyCastleDigest();
// MakeSignature.signDetached(appearance, digest, pks, chain, null, null, null, 0, CryptoStandard.CMS);
}
Also used : Rectangle(com.itextpdf.text.Rectangle) PdfSignatureAppearance(com.itextpdf.text.pdf.PdfSignatureAppearance) PdfReader(com.itextpdf.text.pdf.PdfReader) PdfStamper(com.itextpdf.text.pdf.PdfStamper) BouncyCastleProvider(org.bouncycastle.jce.provider.BouncyCastleProvider) Certificate(java.security.cert.Certificate)

Example 2 with PdfSignatureAppearance

use of com.itextpdf.text.pdf.PdfSignatureAppearance in project spring-cloud-digital-sign by SpringForAll.

the class Sign method sign.

/**
 * 单多次签章通用
 * @param src string source pdf
 * @param target string target pdf
 * @param signatureInfos SignatureInfo
 */
public static void sign(String src, String target, SignatureInfo... signatureInfos) {
    InputStream inputStream = null;
    FileOutputStream outputStream = null;
    ByteArrayOutputStream result = new ByteArrayOutputStream();
    try {
        inputStream = new FileInputStream(src);
        for (SignatureInfo signatureInfo : signatureInfos) {
            ByteArrayOutputStream tempArrayOutputStream = new ByteArrayOutputStream();
            PdfReader reader = new PdfReader(inputStream);
            // 创建签章工具PdfStamper ,最后一个boolean参数是否允许被追加签名
            PdfStamper stamper = PdfStamper.createSignature(reader, tempArrayOutputStream, '\0', null, true);
            // 获取数字签章属性对象
            PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
            appearance.setReason(signatureInfo.getReason());
            appearance.setLocation(signatureInfo.getLocation());
            // 设置签名的签名域名称,多次追加签名的时候,签名预名称不能一样,图片大小受表单域大小影响(过小导致压缩)
            appearance.setVisibleSignature(signatureInfo.getFieldName());
            // 读取图章图片
            Image image = Image.getInstance(signatureInfo.getImagePath());
            appearance.setSignatureGraphic(image);
            appearance.setCertificationLevel(signatureInfo.getCertificationLevel());
            // 设置图章的显示方式,如下选择的是只显示图章(还有其他的模式,可以图章和签名描述一同显示)
            appearance.setRenderingMode(signatureInfo.getRenderingMode());
            /**
             * 粘贴图片
             */
            // PdfContentByte over = stamper.getOverContent(1);
            // image.setAbsolutePosition(0 , 0);
            // image.scaleToFit(300 , 109);
            // over.addImage(image);
            // 摘要算法
            ExternalDigest digest = new BouncyCastleDigest();
            // 签名算法
            ExternalSignature signature = new PrivateKeySignature(signatureInfo.getPk(), signatureInfo.getDigestAlgorithm(), null);
            // 调用itext签名方法完成pdf签章
            MakeSignature.signDetached(appearance, digest, signature, signatureInfo.getChain(), null, null, null, 0, signatureInfo.getSubfilter());
            // 定义输入流为生成的输出流内容,以完成多次签章的过程
            inputStream = new ByteArrayInputStream(tempArrayOutputStream.toByteArray());
            result = tempArrayOutputStream;
        }
        outputStream = new FileOutputStream(new File(target));
        outputStream.write(result.toByteArray());
        outputStream.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != outputStream) {
                outputStream.close();
            }
            if (null != inputStream) {
                inputStream.close();
            }
            if (null != result) {
                result.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Also used : PdfSignatureAppearance(com.itextpdf.text.pdf.PdfSignatureAppearance) PdfReader(com.itextpdf.text.pdf.PdfReader) Image(com.itextpdf.text.Image) PdfStamper(com.itextpdf.text.pdf.PdfStamper)

Aggregations

PdfReader (com.itextpdf.text.pdf.PdfReader)2 PdfSignatureAppearance (com.itextpdf.text.pdf.PdfSignatureAppearance)2 PdfStamper (com.itextpdf.text.pdf.PdfStamper)2 Image (com.itextpdf.text.Image)1 Rectangle (com.itextpdf.text.Rectangle)1 Certificate (java.security.cert.Certificate)1 BouncyCastleProvider (org.bouncycastle.jce.provider.BouncyCastleProvider)1