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

Den*_*sMP 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

    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();
Run Code Online (Sandbox Code Playgroud)

我试过了:

    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();
Run Code Online (Sandbox Code Playgroud)

这是我希望签名进入第三页的地方. 这是我希望签名进入第三页的地方.

这是它在第一页上的位置. 这是它在第一页上的位置.

这些是表单中的字段名称. 这显示了字段名称.

Til*_*err 1

请参阅 SignPDF() 中的 CreateVisibleSignature.java 中的这一行(不包含在您的问题中,但属于您提到的 PDFBox 中的示例代码的一部分):

// options.setPage(signatureProperties.getPage());
Run Code Online (Sandbox Code Playgroud)

删除“//”,签名将出现在第 3 页上。

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

xAxis(0).yAxis(0)
Run Code Online (Sandbox Code Playgroud)

到其他坐标,例如:

xAxis(100).yAxis(715)
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

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