Sample code for 30+ languages & platforms
PureBasic

PDF Sign Under Existing Signature

See more PDF Signatures Examples

This example explains how sign a previously-signed PDF and place the signature appearance below the existing signature.

Note: This example requires Chilkat v9.5.0.85 or greater.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCert.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkPdf.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    pdf.i = CkPdf::ckCreate()
    If pdf.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Load a PDF to be signed.
    success = CkPdf::ckLoadFile(pdf,"qa_data/pdf/sign_testing_4/hello_signed.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf)
        CkPdf::ckDispose(pdf)
        ProcedureReturn
    EndIf

    ; The PDF we'll be signing already has a signature added in Adobe Acrobat DC.
    ; It looks like this:
    ; (Notice the Adobe background logo, which is commonly what you'll see when a signature
    ; is created by Adobe Acrobat.  Chilkat (obviously) does not create signatures using the Adobe
    ; logo because it would be a copyright violation.)

    ; (image:https://example-code.com/images/signed_once_with_adobe_acrobat.jpg/endImage)

    ; Options for signing are specified in JSON.
    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; In most cases, the signingCertificateV2 and signingTime attributes are required.
    CkJsonObject::ckUpdateInt(json,"signingCertificateV2",1)
    CkJsonObject::ckUpdateInt(json,"signingTime",1)

    ; To put our new signature underneath the existing signature, we have to specify the page
    ; where the existing signature is found, and then we can specify "under" for the "appearance.y"
    CkJsonObject::ckUpdateInt(json,"page",1)
    CkJsonObject::ckUpdateString(json,"appearance.y","under")

    CkJsonObject::ckUpdateString(json,"appearance.fontScale","10.0")

    CkJsonObject::ckUpdateString(json,"appearance.text[0]","Reason: Agreement Accepted by John")
    CkJsonObject::ckUpdateString(json,"appearance.text[1]","Date: current_dt")

    ; Load the signing certificate. (Use your own certificate.)
    cert.i = CkCert::ckCreate()
    If cert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkCert::ckLoadPfxFile(cert,"qa_data/pfx/myPdfSigningCert.pfx","secret")
    If success = 0
        Debug CkCert::ckLastErrorText(cert)
        CkPdf::ckDispose(pdf)
        CkJsonObject::ckDispose(json)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ; Tell the pdf object to use the certificate for signing.
    success = CkPdf::ckSetSigningCert(pdf,cert)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf)
        CkPdf::ckDispose(pdf)
        CkJsonObject::ckDispose(json)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ; Note: When adding an additional signature to a PDF, the existing signatures
    ; are validated, and this includes validating the certificates previously used to 
    ; create the existing signatures.  (A signature typically embeds the signing certs.)
    ; In some cases, the certificates and/or certs in the chain of authentication for 
    ; existing signatures are not present, and are not available on the current system.
    ; In this case, you can skip the validation by setting this keyword in UncommonOptions:
    CkPdf::setCkUncommonOptions(pdf, "NO_VERIFY_CERT_SIGNATURES")

    success = CkPdf::ckSignPdf(pdf,json,"qa_output/hello_signed.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf)
        CkPdf::ckDispose(pdf)
        CkJsonObject::ckDispose(json)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    Debug "The PDF has been successfully cryptographically signed."

    ; Here's a screenshot of the 2nd signature positioned under the 1st in Adobe Acrobat:

    ; (image:https://example-code.com/images/signed_under_existing_signature.jpg/endImage)


    CkPdf::ckDispose(pdf)
    CkJsonObject::ckDispose(json)
    CkCert::ckDispose(cert)


    ProcedureReturn
EndProcedure