Sample code for 30+ languages & platforms
DataFlex 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 DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Variant vJson
    Handle hoJson
    Variant vJsonOut
    Handle hoJsonOut
    Variant vInfo
    Handle hoInfo
    Handle hoPdf1
    Handle hoPdf2
    Handle hoPdf3
    String sTemp1
    String sTemp2
    Integer iTemp1

    Move False To iSuccess

    //  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

    Get Create (RefClass(cComChilkatJsonObject)) To hoJson
    If (Not(IsComObjectCreated(hoJson))) Begin
        Send CreateComObject of hoJson
    End
    Get Create (RefClass(cComChilkatJsonObject)) To hoJsonOut
    If (Not(IsComObjectCreated(hoJsonOut))) Begin
        Send CreateComObject of hoJsonOut
    End
    Get Create (RefClass(cComChilkatJsonObject)) To hoInfo
    If (Not(IsComObjectCreated(hoInfo))) Begin
        Send CreateComObject of hoInfo
    End

    //  AES-256, the default.  Saved as PDF 1.7 with Adobe extension level 8.
    Get Create (RefClass(cComChilkatPdf)) To hoPdf1
    If (Not(IsComObjectCreated(hoPdf1))) Begin
        Send CreateComObject of hoPdf1
    End
    Get ComLoadFile Of hoPdf1 "qa_data/pdf/two_page_memo.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComUserPassword Of hoPdf1 To "user-secret"
    Set ComOwnerPassword Of hoPdf1 To "owner-secret"
    Get ComUpdateString Of hoJson "algorithmChoice" "aes-256" To iSuccess
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoJsonOut to vJsonOut
    Get ComProtection Of hoPdf1 "encrypt" vJson vJsonOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoJsonOut "pending.pdfVersion" To sTemp1
    Get ComIntOf Of hoJsonOut "pending.adobeExtensionLevel" To iTemp1
    Showln "aes-256 will be saved as PDF " sTemp1 ", Adobe extension level " iTemp1
    Get ComWriteFile Of hoPdf1 "qa_output/memo_aes256.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get pvComObject of hoInfo to vInfo
    Get ComPreLoadCheck Of hoPdf1 "qa_output/memo_aes256.pdf" vInfo To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoInfo "algorithm" To sTemp1
    Get ComStringOf Of hoInfo "pdfVersion" To sTemp2
    Showln "  saved file: " sTemp1 ", PDF " sTemp2

    //  AES-128, for readers that predate AES-256.  Saved as PDF 1.6.
    Get Create (RefClass(cComChilkatPdf)) To hoPdf2
    If (Not(IsComObjectCreated(hoPdf2))) Begin
        Send CreateComObject of hoPdf2
    End
    Get ComLoadFile Of hoPdf2 "qa_data/pdf/two_page_memo.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComUserPassword Of hoPdf2 To "user-secret"
    Set ComOwnerPassword Of hoPdf2 To "owner-secret"
    Get ComUpdateString Of hoJson "algorithmChoice" "aes-128" To iSuccess
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoJsonOut to vJsonOut
    Get ComProtection Of hoPdf2 "encrypt" vJson vJsonOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoJsonOut "pending.pdfVersion" To sTemp1
    Showln "aes-128 will be saved as PDF " sTemp1
    Get ComWriteFile Of hoPdf2 "qa_output/memo_aes128.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get pvComObject of hoInfo to vInfo
    Get ComPreLoadCheck Of hoPdf2 "qa_output/memo_aes128.pdf" vInfo To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoInfo "algorithm" To sTemp1
    Get ComStringOf Of hoInfo "pdfVersion" To sTemp2
    Showln "  saved file: " sTemp1 ", PDF " sTemp2

    //  RC4-128, a broken cipher, only for readers too old for AES.  Saved as PDF 1.4.
    Get Create (RefClass(cComChilkatPdf)) To hoPdf3
    If (Not(IsComObjectCreated(hoPdf3))) Begin
        Send CreateComObject of hoPdf3
    End
    Get ComLoadFile Of hoPdf3 "qa_data/pdf/two_page_memo.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComUserPassword Of hoPdf3 To "user-secret"
    Set ComOwnerPassword Of hoPdf3 To "owner-secret"
    Get ComUpdateString Of hoJson "algorithmChoice" "rc4-128" To iSuccess
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoJsonOut to vJsonOut
    Get ComProtection Of hoPdf3 "encrypt" vJson vJsonOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoJsonOut "pending.pdfVersion" To sTemp1
    Showln "rc4-128 will be saved as PDF " sTemp1
    Get ComWriteFile Of hoPdf3 "qa_output/memo_rc4_128.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get pvComObject of hoInfo to vInfo
    Get ComPreLoadCheck Of hoPdf3 "qa_output/memo_rc4_128.pdf" vInfo To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoInfo "algorithm" To sTemp1
    Get ComStringOf Of hoInfo "pdfVersion" To sTemp2
    Showln "  saved file: " sTemp1 ", PDF " sTemp2

    //  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


End_Procedure