如何让PDVisibleSigProperties将3页上的签名写入签名框

时间:2015-07-22 18:21:24

标签: java digital-signature pdfbox

我正在使用pdfbox示例签名CreateVisableSignature,我希望代码将签名的图像写入名为" ApplicantSignature"在第三页。

有人能说明为什么它会在第一页的左上角写下签名吗?

以下是代码:

    public static void main(String[] args) throws KeyStoreException,
        NoSuchAlgorithmException, CertificateException,
        FileNotFoundException, IOException, COSVisitorException,
        SignatureException {

    if (args.length != 4) {
        usage();
        System.exit(1);
    } else {
        File ksFile = new File(args[0]);
        KeyStore keystore = KeyStore.getInstance("PKCS12", provider);
        char[] pin = args[1].toCharArray();
        keystore.load(new FileInputStream(ksFile), pin);
        File document = new File(args[2]);
        CreateVisibleSignature signing = new CreateVisibleSignature(
                keystore, pin.clone());
        String jpgFile = CreateVisibleSignature.convertPngToJpeg( args[3] );
        FileInputStream image = new FileInputStream( jpgFile );
        PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
                args[2], image, 1);
        visibleSig.xAxis(0).yAxis(0).zoom(-75)
                .signatureFieldName("ApplicantSignature");
        PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
        signatureProperties.signerName("name").signerLocation("location")
                .signatureReason("Security").preferredSize(0).page(3)
                .visualSignEnabled(true).setPdVisibleSignature(visibleSig)
                .buildSignature();
        signing.signPDF(document, signatureProperties);
    }
}

我也尝试过:

    PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
                args[2], image, 3);
        visibleSig.xAxis(0).yAxis(0).zoom(-75)
                .signatureFieldName("ApplicantSignature");
        PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
        signatureProperties.signerName("name").signerLocation("location")
                .signatureReason("Security").preferredSize(0).page(1)
                .visualSignEnabled(true).setPdVisibleSignature(visibleSig)
                .buildSignature();

我试过了:

    PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
                args[2], image, 3);
        visibleSig.xAxis(0).yAxis(0).zoom(-75)
                .signatureFieldName("ApplicantSignature");
        PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
        signatureProperties.signerName("name").signerLocation("location")
                .signatureReason("Security").preferredSize(0).page(3)
                .visualSignEnabled(true).setPdVisibleSignature(visibleSig)
                .buildSignature();

这是我希望签名在第三页上的位置。 This is where I want the signature to go on the third page.

这是它在第一页上的位置。 This is where it is going on the first page.

这些是表单中的字段名称。 This shows the field names.

2 个答案:

答案 0 :(得分:1)

根据回答我问题的人给我的页面设置,我发布了一个答案,基于我目前对pdfbox中签名如何工作的了解。

首先,我正在使用的预先存在的表单,至少从pdfbox的角度来看,似乎只有一个页面。当我使用adobe DC pro来显示坐标时,它只显示坐标直到第二页的中间。因此,即使我将X,Y坐标设置为100,715,签名图像也会显示在第一页的底部,而不是第3页。

如果我错了,请纠正我,但我相信pdfbox只允许您签署整个文档,而不是文档中已存在的单个签名字段。预先存在的签名字段不受pdfbox的影响,因为pdfbox似乎无法引用它们。

如果您在adobe dc pro上显示pdf并单击签名面板,您可以看到pdf是由pdfbox签名的,但预先存在的签名字段仍然表明它们需要签名。

我在这一点上猜测,pdfbox会将它签名的签名添加到预先存在的文档中。

我还注意到pdfbox签名是不可见的,即使已经设置了" who"," location"," reason"和date,以及您放置在pdfbox签名的签名中的图像是唯一在生成的输出pdf中实际可见的图像。如果没有图像,则硬拷贝打印输出不会显示文档已签名。

如果我错了,请随时纠正我。

答案 1 :(得分:0)

在signPDF()中的CreateVisibleSignature.java中查看此行(未包含在您的问题中,但您提到的PDFBox中的示例代码的一部分):

// options.setPage(signatureProperties.getPage());

删除" //"签名出现在第3页。

重新定位,更改代码的这一部分

xAxis(0).yAxis(0)

到其他坐标,例如这些:

xAxis(100).yAxis(715)

现在关于问题中哪些代码是正确的问题 - 最后一个是:

PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(args[2], image, 3);
visibleSig.xAxis(0).yAxis(0).zoom(-75).signatureFieldName("ApplicantSignature");
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName("name").signerLocation("location")
    .signatureReason("Security").preferredSize(0).page(3)
    .visualSignEnabled(true).setPdVisibleSignature(visibleSig)
    .buildSignature();

PDVisibleSignDesigner中的3是选择页面的大小。第二个是存储页面的编号以供日后使用。这里的页码是从1开始的。