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

Visual FoxPro
LOCAL lnSuccess
LOCAL loJson
LOCAL loJsonOut
LOCAL loInfo
LOCAL loPdf1
LOCAL loPdf2
LOCAL loPdf3

lnSuccess = 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

loJson = CreateObject('Chilkat.JsonObject')
loJsonOut = CreateObject('Chilkat.JsonObject')
loInfo = CreateObject('Chilkat.JsonObject')

*  AES-256, the default.  Saved as PDF 1.7 with Adobe extension level 8.
loPdf1 = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf1.LoadFile("qa_data/pdf/two_page_memo.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    CANCEL
ENDIF

loPdf1.UserPassword = "user-secret"
loPdf1.OwnerPassword = "owner-secret"
loJson.UpdateString("algorithmChoice","aes-256")
lnSuccess = loPdf1.Protection("encrypt",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    CANCEL
ENDIF

? "aes-256 will be saved as PDF " + loJsonOut.StringOf("pending.pdfVersion") + ", Adobe extension level " + STR(loJsonOut.IntOf("pending.adobeExtensionLevel"))
lnSuccess = loPdf1.WriteFile("qa_output/memo_aes256.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    CANCEL
ENDIF

lnSuccess = loPdf1.PreLoadCheck("qa_output/memo_aes256.pdf",loInfo)
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    CANCEL
ENDIF

? "  saved file: " + loInfo.StringOf("algorithm") + ", PDF " + loInfo.StringOf("pdfVersion")

*  AES-128, for readers that predate AES-256.  Saved as PDF 1.6.
loPdf2 = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf2.LoadFile("qa_data/pdf/two_page_memo.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

loPdf2.UserPassword = "user-secret"
loPdf2.OwnerPassword = "owner-secret"
loJson.UpdateString("algorithmChoice","aes-128")
lnSuccess = loPdf2.Protection("encrypt",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

? "aes-128 will be saved as PDF " + loJsonOut.StringOf("pending.pdfVersion")
lnSuccess = loPdf2.WriteFile("qa_output/memo_aes128.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

lnSuccess = loPdf2.PreLoadCheck("qa_output/memo_aes128.pdf",loInfo)
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

? "  saved file: " + loInfo.StringOf("algorithm") + ", PDF " + loInfo.StringOf("pdfVersion")

*  RC4-128, a broken cipher, only for readers too old for AES.  Saved as PDF 1.4.
loPdf3 = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf3.LoadFile("qa_data/pdf/two_page_memo.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

loPdf3.UserPassword = "user-secret"
loPdf3.OwnerPassword = "owner-secret"
loJson.UpdateString("algorithmChoice","rc4-128")
lnSuccess = loPdf3.Protection("encrypt",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

? "rc4-128 will be saved as PDF " + loJsonOut.StringOf("pending.pdfVersion")
lnSuccess = loPdf3.WriteFile("qa_output/memo_rc4_128.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

lnSuccess = loPdf3.PreLoadCheck("qa_output/memo_rc4_128.pdf",loInfo)
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loInfo
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

? "  saved file: " + loInfo.StringOf("algorithm") + ", PDF " + loInfo.StringOf("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

RELEASE loJson
RELEASE loJsonOut
RELEASE loInfo
RELEASE loPdf1
RELEASE loPdf2
RELEASE loPdf3