PureBasic Requires Chilkat v11.7.0+
PureBasic
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
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