使用CoSign并在多个签名的情况下,如何使用SOAP API指定要使用的签名?

时间:2014-09-22 09:46:06

标签: cosign-api

我使用的是CoSign开发者帐户,我创建了几个图形签名。我使用示例代码签署pdf文件并且它可以工作,我能够枚举签名,但我无法弄清楚如何指定在帐户的签名列表中使用哪个签名。

使用的代码示例:

package trial;

import com.arx.sapiws.dss._1.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;

import oasis.names.tc.dss._1_0.core.schema.DocumentType.Base64Data;
import oasis.names.tc.dss._1_0.core.schema.*;
import oasis.names.tc.saml._1_0.assertion.*;

public class MultipeSignatures {

    public static void main(String[] args) throws Exception {

        String fileName = "D:/demo - Copy.pdf";
        String signerUsername = "";
        String signerPassword = "";

        if (!checkFile(fileName)) {
            System.out.println("Cannot find '" + fileName + "' or it is read/write protected. Aborting.");
            return;
        }

        // Get all user's graphical signatures
        List<GraphicImageType> gSignatures = listGraphicalSignatures(signerUsername, " ", signerPassword);
        for (GraphicImageType image : gSignatures) {
            System.out.println("image: " + image.getGraphicImageName());
        }

        SignPDF(fileName, signerUsername, signerPassword);
    }

    private static void SignPDF(String fileName, String signerUsername, String signerPassword) {
        System.out.println("Trying to sign '" + fileName + "' by '" + signerUsername + "' with password '" + signerPassword + "' ...");

        byte[] fileBytes = getPDFBytes(fileName);
        Base64Data corePDFBytes = new Base64Data();
        corePDFBytes.setValue(fileBytes);
        corePDFBytes.setMimeType("application/pdf");
        DocumentType myDoc = new DocumentType();
        myDoc.setBase64Data(corePDFBytes);

        // set signer - USERNAME/DOMAIN
        NameIdentifierType cosignUserProps = new NameIdentifierType();
        cosignUserProps.setValue(signerUsername);
        cosignUserProps.setNameQualifier(" ");

        // set signer - PASSWORD
        CoSignAuthDataType cosignPassword = new CoSignAuthDataType();
        cosignPassword.setLogonPassword(signerPassword);

        // set signer - USERNAME+PASSWORD
        ClaimedIdentity cosignUser = new ClaimedIdentity();
        cosignUser.setName(cosignUserProps);
        cosignUser.setSupportingInfo(cosignPassword);

        //set signature field settings
        SAPISigFieldSettingsType sigFieldSettings = new SAPISigFieldSettingsType();
        sigFieldSettings.setName("SigField");
        sigFieldSettings.setInvisible(Boolean.FALSE);
        sigFieldSettings.setX(150);
        sigFieldSettings.setY(110);
        sigFieldSettings.setWidth(150);
        sigFieldSettings.setHeight(50);
        sigFieldSettings.setDependencyMode(DependencyModeEnum.INDEPENDENT);
        sigFieldSettings.setSignatureType(SignatureTypeEnum.DIGITAL);
        sigFieldSettings.setEmptyFieldLabel("");
        sigFieldSettings.setPage(1);

        //initiate request components
        RequestBaseType.InputDocuments inputs = new RequestBaseType.InputDocuments();
        inputs.getOtherOrDocumentHashOrTransformedData().add(myDoc);

        RequestBaseType.OptionalInputs optInputs = new RequestBaseType.OptionalInputs();
        optInputs.setSignatureType("http://arx.com/SAPIWS/DSS/1.0/signature-field-create-sign");
        optInputs.setClaimedIdentity(cosignUser);
        optInputs.setSAPISigFieldSettings(sigFieldSettings);
        optInputs.setReturnPDFTailOnly(Boolean.TRUE);

        //initiate connection to COSign SAPI service
        DSS service = new DSS();
        DSSSoap port = service.getDSSSoap12();

        //initiate request
        SignRequest request = new SignRequest();
        request.setOptionalInputs(optInputs);
        request.setInputDocuments(inputs);
        request.setRequestID("DummyRequestId");

        //make the call
        DssSignResult result = port.dssSign(request);

        //CHECK RESULT:
        ResponseBaseType.Result rc = result.getResult();
        String errmsg = "" + rc.getResultMajor();
        if (errmsg.compareTo("urn:oasis:names:tc:dss:1.0:resultmajor:Success") != 0) {
            System.out.println("Cannot sign '" + fileName + "' got: " + rc.getResultMessage().getValue());
            return;
        }

        System.out.println("Trying to append signature to '" + fileName + "' ('" + signerUsername + "') ...");

        // IF OK Get the signature:
        DssSignResult.SignatureObject sig = result.getSignatureObject();
        DssSignResult.SignatureObject.Base64Signature B64Sig = sig.getBase64Signature();

        try {
            FileOutputStream fos = new FileOutputStream(fileName, true);
            fos.write(B64Sig.getValue());
            fos.close();
        } catch (Exception e) {
            System.out.println("Error writing to PDF file: " + e.getMessage());
            return;
        }

        System.out.println("Signature of '" + signerUsername + "' appended to '" + fileName + "'.");
    }

    private static List<GraphicImageType> listGraphicalSignatures(String username, String domain, String password) throws Exception {
        System.out.println("Retrieving list of graphical signatures for user: " + username);

        DssSignResult result;
        try {
            //initiate connection to COSign SAPI service
            DSS service = new DSS();
            DSSSoap port = service.getDSSSoap12();

            SignRequest request = new SignRequest();

            RequestBaseType.OptionalInputs optInputs = new RequestBaseType.OptionalInputs();

            // SET SIGNATURE TYPE (enumerate graphical signatures)
            optInputs.setSignatureType("http://arx.com/SAPIWS/DSS/1.0/enum-graphic-images");

            // SET USERNAME / PASSWORD
            ClaimedIdentity cosignUser = new ClaimedIdentity();
            NameIdentifierType userName = new NameIdentifierType();
            userName.setValue(username);
            userName.setNameQualifier(domain);
            cosignUser.setName(userName);

            CoSignAuthDataType userPass = new CoSignAuthDataType();
            userPass.setLogonPassword(password);
            cosignUser.setSupportingInfo(userPass);
            optInputs.setClaimedIdentity(cosignUser);

            // SET FLAGS
            optInputs.setFlags(Long.parseLong("00FF0000", 16));

            // ALL DONE, MAKE A CALL:
            request.setOptionalInputs(optInputs);
            request.setInputDocuments(null);
            result = port.dssSign(request);

            // CHECK RESULT:
            ResponseBaseType.Result rc = result.getResult();

            String errmsg = "" + rc.getResultMajor();
            if (errmsg.compareTo("urn:oasis:names:tc:dss:1.0:resultmajor:Success") == 0) {
                return result.getOptionalOutputs().getAvailableGraphicSignature();
            } else {
                throw new Exception(rc.getResultMessage().getValue());
            }
        } catch (java.rmi.RemoteException e) {
            throw e;
        } catch (Exception e) {
            throw e;
        }
    }

    private static byte[] getPDFBytes(String fileName) {
        byte[] pdf;
        // READ THE FILE INTO BUFFER
        try {
            File file = new File(fileName);

            if (!file.canRead()) {
                return null;
            }

            if (!file.canWrite()) {
                return null;
            }

            pdf = new byte[(int) file.length()];
            FileInputStream fos = new FileInputStream(file);
            fos.read(pdf, 0, (int) file.length());
            fos.close();
        } catch (Exception e) {
            return null;
        }
        return pdf;
    }

    private static boolean checkFile(String fileName) {
        try {
            File file = new File(fileName);

            if (!file.canRead()) {
                return false;
            }

            if (!file.canWrite()) {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

只需获取首选图形签名的名称,然后按照我对previous question的回答中的说明进行设置。