Sample code for 30+ languages & platforms
Java

Sign PDF for ICP-Brasil

See more PDF Signatures Examples

Sign a PDF to create a signed PDF compliant with the ICP-Brasil Digital Signature Standard Conformity Checker. (Verificador de Conformidade do PadrĂ£o de Assinatura Digital ICP-Brasil)

Chilkat Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.Cert;
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.JsonObject;
import com.chilkatsoft.chilkat2.Pdf;

public class ChilkatExample {

    public static void main(String[] args) {
        // This example requires the Chilkat API to have been previously unlocked.
        // See Global Unlock Sample for sample code.

        // The signed PDF produced by this example should be verifiable at https://validar.iti.gov.br/
        Pdf pdf = new Pdf();

        // Load a PDF to be signed.
        // The "hello.pdf" is available at https://chilkatsoft.com/hello.pdf
        try {
            pdf.loadFile("qa_data/pdf/hello.pdf");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        JsonObject json = new JsonObject();

        // Define the appearance and location of the signature.
        json.updateInt("page", 1);
        json.updateString("appearance.y", "bottom");
        json.updateString("appearance.x", "middle");
        json.updateString("appearance.fontScale", "9.0");
        json.updateString("appearance.text[0]", "Digitally signed by: cert_cn");
        json.updateString("appearance.text[1]", "current_dt");
        json.updateString("appearance.image", "document-accepted");
        json.updateString("appearance.imagePlacement", "left");
        json.updateString("appearance.imageOpacity", "100");

        // Add the CMS options required for ICP-Brasil
        json.updateInt("contentType", 1);
        json.updateInt("messageDigest", 1);
        json.updateInt("signingCertificateV2", 1);
        json.updateBool("ltvOcsp", true);

        // Listed here are the currently existing profiles. (Chilkat will add additional ICP Brasil policy profiles in future versions as new ones are created.)
        // See https://www.gov.br/iti/pt-br/assuntos/repositorio/artefatos-de-assinatura-digital for more information.
        //
        // PA_AD_RA_v1_1 --> 2.16.76.1.7.1.5.1.1
        // PA_AD_RA_v1_2 --> 2.16.76.1.7.1.5.1.2
        // PA_AD_RA_v2_0 --> 2.16.76.1.7.1.5.2
        // PA_AD_RA_v2_1 --> 2.16.76.1.7.1.5.2.1
        // PA_AD_RA_v2_2 --> 2.16.76.1.7.1.5.2.2
        // PA_AD_RA_v2_3 --> 2.16.76.1.7.1.5.2.3
        // PA_AD_RA_v2_4 --> 2.16.76.1.7.1.5.2.4

        // PA_AD_RB_v1_1 --> 2.16.76.1.7.1.1.1.1
        // PA_AD_RB_v2_0 --> 2.16.76.1.7.1.1.2
        // PA_AD_RB_v2_1 --> 2.16.76.1.7.1.1.2.1
        // PA_AD_RB_v2_2 --> 2.16.76.1.7.1.1.2.2
        // PA_AD_RB_v2_3 --> 2.16.76.1.7.1.1.2.3

        // PA_AD_RC_v1_1 --> 2.16.76.1.7.1.4.1.1
        // PA_AD_RC_v2_0 --> 2.16.76.1.7.1.4.2
        // PA_AD_RC_v2_1 --> 2.16.76.1.7.1.4.2.1
        // PA_AD_RC_v2_2 --> 2.16.76.1.7.1.4.2.2
        // PA_AD_RC_v2_3 --> 2.16.76.1.7.1.4.2.3

        // PA_AD_RT_v1_1 --> 2.16.76.1.7.1.2.1.1
        // PA_AD_RT_v2_0 --> 2.16.76.1.7.1.2.2
        // PA_AD_RT_v2_1 --> 2.16.76.1.7.1.2.2.1
        // PA_AD_RT_v2_2 --> 2.16.76.1.7.1.2.2.2
        // PA_AD_RT_v2_3 --> 2.16.76.1.7.1.2.2.3

        // PA_AD_RV_v1_1 --> 2.16.76.1.7.1.3.1.1
        // PA_AD_RV_v2_0 --> 2.16.76.1.7.1.3.2
        // PA_AD_RV_v2_1 --> 2.16.76.1.7.1.3.2.1
        // PA_AD_RV_v2_2 --> 2.16.76.1.7.1.3.2.2
        // PA_AD_RV_v2_3 --> 2.16.76.1.7.1.3.2.3

        // PA_PAdES_AD_RA_v1_0 --> 2.16.76.1.7.1.14.1
        // PA_PAdES_AD_RA_v1_1 --> 2.16.76.1.7.1.14.1.1
        // PA_PAdES_AD_RA_v1_2 --> 2.16.76.1.7.1.14.1.2
        // PA_PAdES_AD_RB_v1_0 --> 2.16.76.1.7.1.11.1
        // PA_PAdES_AD_RB_v1_1 --> 2.16.76.1.7.1.11.1.1
        // PA_PAdES_AD_RC_v1_0 --> 2.16.76.1.7.1.13.1
        // PA_PAdES_AD_RC_v1_1 --> 2.16.76.1.7.1.13.1.1
        // PA_PAdES_AD_RC_v1_2 --> 2.16.76.1.7.1.13.1.2
        // PA_PAdES_AD_RT_v1_0 --> 2.16.76.1.7.1.12.1
        // PA_PAdES_AD_RT_v1_1 --> 2.16.76.1.7.1.12.1.1

        // Set the policy profile name
        // ---------------------------------------------------
        // Note: On 24-May-2024, I was informed that adding the "policyId.profile"
        // causes the PDF signature to fail validation at https://validar.iti.gov.br/
        // Perhaps something changed in the years since this example was originally written and tested to be working.
        // You may need to omit the "policyId.profile".
        // ---------------------------------------------------
        json.updateString("policyId.profile", "PA_PAdES_AD_RB_v1_1");

        // Load the signing certificate. (Use your own certificate.)
        // Note: If loading from a smart card, call LoadFromSmartcard instead, and make sure to use Chilkat v9.5.0.88 or later.
        Cert cert = new Cert();
        try {
            cert.loadPfxFile("qa_data/pfx/myPdfSigningCert.pfx", "pfx_password");

            // Tell the pdf object to use the certificate for signing.
            pdf.setSigningCert(cert);

            pdf.signPdf(json, "qa_output/hello_signed.pdf");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        System.out.println("The PDF has been successfully cryptographically signed.");
    }
}