Sample code for 30+ languages & platforms
PureBasic Requires Chilkat v11.7.0+

Choose the PDF Encryption Algorithm: AES-256, AES-128 or RC4

See more PDF Protection Examples

Demonstrates the algorithmChoice option of the encrypt operation. aes-256 is the default and the one to use unless an older reader must open the file. aes-128 is for readers that predate AES-256. rc4-128 and rc4-40 are broken ciphers kept only for very old readers. Each algorithm needs a minimum PDF version, and the file header is raised to it when the PDF is saved, never lowered. A PDF saved with RC4 is written with a classic cross-reference table so that those old readers can parse it.

Chilkat PureBasic Downloads

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

Procedure ChilkatExample()

    success.i = 0

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

    ;  The PDF used in this example is available at two_page_memo.pdf

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

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

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

    ;  AES-256, the default.  Saved as PDF 1.7 with Adobe extension level 8.
    pdf1.i = CkPdf::ckCreate()
    If pdf1.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPdf::ckLoadFile(pdf1,"qa_data/pdf/two_page_memo.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf1)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        ProcedureReturn
    EndIf

    CkPdf::setCkUserPassword(pdf1, "user-secret")
    CkPdf::setCkOwnerPassword(pdf1, "owner-secret")
    CkJsonObject::ckUpdateString(json,"algorithmChoice","aes-256")
    success = CkPdf::ckProtection(pdf1,"encrypt",json,jsonOut)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf1)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        ProcedureReturn
    EndIf

    Debug "aes-256 will be saved as PDF " + CkJsonObject::ckStringOf(jsonOut,"pending.pdfVersion") + ", Adobe extension level " + Str(CkJsonObject::ckIntOf(jsonOut,"pending.adobeExtensionLevel"))
    success = CkPdf::ckWriteFile(pdf1,"qa_output/memo_aes256.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf1)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        ProcedureReturn
    EndIf

    success = CkPdf::ckPreLoadCheck(pdf1,"qa_output/memo_aes256.pdf",info)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf1)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        ProcedureReturn
    EndIf

    Debug "  saved file: " + CkJsonObject::ckStringOf(info,"algorithm") + ", PDF " + CkJsonObject::ckStringOf(info,"pdfVersion")

    ;  AES-128, for readers that predate AES-256.  Saved as PDF 1.6.
    pdf2.i = CkPdf::ckCreate()
    If pdf2.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPdf::ckLoadFile(pdf2,"qa_data/pdf/two_page_memo.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf2)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        ProcedureReturn
    EndIf

    CkPdf::setCkUserPassword(pdf2, "user-secret")
    CkPdf::setCkOwnerPassword(pdf2, "owner-secret")
    CkJsonObject::ckUpdateString(json,"algorithmChoice","aes-128")
    success = CkPdf::ckProtection(pdf2,"encrypt",json,jsonOut)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf2)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        ProcedureReturn
    EndIf

    Debug "aes-128 will be saved as PDF " + CkJsonObject::ckStringOf(jsonOut,"pending.pdfVersion")
    success = CkPdf::ckWriteFile(pdf2,"qa_output/memo_aes128.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf2)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        ProcedureReturn
    EndIf

    success = CkPdf::ckPreLoadCheck(pdf2,"qa_output/memo_aes128.pdf",info)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf2)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        ProcedureReturn
    EndIf

    Debug "  saved file: " + CkJsonObject::ckStringOf(info,"algorithm") + ", PDF " + CkJsonObject::ckStringOf(info,"pdfVersion")

    ;  RC4-128, a broken cipher, only for readers too old for AES.  Saved as PDF 1.4.
    pdf3.i = CkPdf::ckCreate()
    If pdf3.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPdf::ckLoadFile(pdf3,"qa_data/pdf/two_page_memo.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf3)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        CkPdf::ckDispose(pdf3)
        ProcedureReturn
    EndIf

    CkPdf::setCkUserPassword(pdf3, "user-secret")
    CkPdf::setCkOwnerPassword(pdf3, "owner-secret")
    CkJsonObject::ckUpdateString(json,"algorithmChoice","rc4-128")
    success = CkPdf::ckProtection(pdf3,"encrypt",json,jsonOut)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf3)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        CkPdf::ckDispose(pdf3)
        ProcedureReturn
    EndIf

    Debug "rc4-128 will be saved as PDF " + CkJsonObject::ckStringOf(jsonOut,"pending.pdfVersion")
    success = CkPdf::ckWriteFile(pdf3,"qa_output/memo_rc4_128.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf3)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        CkPdf::ckDispose(pdf3)
        ProcedureReturn
    EndIf

    success = CkPdf::ckPreLoadCheck(pdf3,"qa_output/memo_rc4_128.pdf",info)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf3)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonOut)
        CkJsonObject::ckDispose(info)
        CkPdf::ckDispose(pdf1)
        CkPdf::ckDispose(pdf2)
        CkPdf::ckDispose(pdf3)
        ProcedureReturn
    EndIf

    Debug "  saved file: " + CkJsonObject::ckStringOf(info,"algorithm") + ", PDF " + CkJsonObject::ckStringOf(info,"pdfVersion")

    ;  Sample output:

    ;  aes-256 will be saved as PDF 1.7, Adobe extension level 8
    ;    saved file: aes-256, PDF 1.7
    ;  aes-128 will be saved as PDF 1.6
    ;    saved file: aes-128, PDF 1.6
    ;  rc4-128 will be saved as PDF 1.4
    ;    saved file: rc4-128, PDF 1.4


    CkJsonObject::ckDispose(json)
    CkJsonObject::ckDispose(jsonOut)
    CkJsonObject::ckDispose(info)
    CkPdf::ckDispose(pdf1)
    CkPdf::ckDispose(pdf2)
    CkPdf::ckDispose(pdf3)


    ProcedureReturn
EndProcedure