Delphi DLL Requires Chilkat v11.7.0+
Delphi DLL
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 Delphi DLL Downloads
var
success: Boolean;
json: HCkJsonObject;
jsonOut: HCkJsonObject;
info: HCkJsonObject;
pdf1: HCkPdf;
pdf2: HCkPdf;
pdf3: HCkPdf;
begin
success := False;
// 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 := CkJsonObject_Create();
jsonOut := CkJsonObject_Create();
info := CkJsonObject_Create();
// AES-256, the default. Saved as PDF 1.7 with Adobe extension level 8.
pdf1 := CkPdf_Create();
success := CkPdf_LoadFile(pdf1,'qa_data/pdf/two_page_memo.pdf');
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf1));
Exit;
end;
CkPdf_putUserPassword(pdf1,'user-secret');
CkPdf_putOwnerPassword(pdf1,'owner-secret');
CkJsonObject_UpdateString(json,'algorithmChoice','aes-256');
success := CkPdf_Protection(pdf1,'encrypt',json,jsonOut);
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf1));
Exit;
end;
Memo1.Lines.Add('aes-256 will be saved as PDF ' + CkJsonObject__stringOf(jsonOut,'pending.pdfVersion') + ', Adobe extension level ' + IntToStr(CkJsonObject_IntOf(jsonOut,'pending.adobeExtensionLevel')));
success := CkPdf_WriteFile(pdf1,'qa_output/memo_aes256.pdf');
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf1));
Exit;
end;
success := CkPdf_PreLoadCheck(pdf1,'qa_output/memo_aes256.pdf',info);
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf1));
Exit;
end;
Memo1.Lines.Add(' saved file: ' + CkJsonObject__stringOf(info,'algorithm') + ', PDF ' + CkJsonObject__stringOf(info,'pdfVersion'));
// AES-128, for readers that predate AES-256. Saved as PDF 1.6.
pdf2 := CkPdf_Create();
success := CkPdf_LoadFile(pdf2,'qa_data/pdf/two_page_memo.pdf');
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf2));
Exit;
end;
CkPdf_putUserPassword(pdf2,'user-secret');
CkPdf_putOwnerPassword(pdf2,'owner-secret');
CkJsonObject_UpdateString(json,'algorithmChoice','aes-128');
success := CkPdf_Protection(pdf2,'encrypt',json,jsonOut);
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf2));
Exit;
end;
Memo1.Lines.Add('aes-128 will be saved as PDF ' + CkJsonObject__stringOf(jsonOut,'pending.pdfVersion'));
success := CkPdf_WriteFile(pdf2,'qa_output/memo_aes128.pdf');
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf2));
Exit;
end;
success := CkPdf_PreLoadCheck(pdf2,'qa_output/memo_aes128.pdf',info);
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf2));
Exit;
end;
Memo1.Lines.Add(' saved file: ' + CkJsonObject__stringOf(info,'algorithm') + ', PDF ' + CkJsonObject__stringOf(info,'pdfVersion'));
// RC4-128, a broken cipher, only for readers too old for AES. Saved as PDF 1.4.
pdf3 := CkPdf_Create();
success := CkPdf_LoadFile(pdf3,'qa_data/pdf/two_page_memo.pdf');
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf3));
Exit;
end;
CkPdf_putUserPassword(pdf3,'user-secret');
CkPdf_putOwnerPassword(pdf3,'owner-secret');
CkJsonObject_UpdateString(json,'algorithmChoice','rc4-128');
success := CkPdf_Protection(pdf3,'encrypt',json,jsonOut);
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf3));
Exit;
end;
Memo1.Lines.Add('rc4-128 will be saved as PDF ' + CkJsonObject__stringOf(jsonOut,'pending.pdfVersion'));
success := CkPdf_WriteFile(pdf3,'qa_output/memo_rc4_128.pdf');
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf3));
Exit;
end;
success := CkPdf_PreLoadCheck(pdf3,'qa_output/memo_rc4_128.pdf',info);
if (success = False) then
begin
Memo1.Lines.Add(CkPdf__lastErrorText(pdf3));
Exit;
end;
Memo1.Lines.Add(' saved file: ' + CkJsonObject__stringOf(info,'algorithm') + ', PDF ' + CkJsonObject__stringOf(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_Dispose(json);
CkJsonObject_Dispose(jsonOut);
CkJsonObject_Dispose(info);
CkPdf_Dispose(pdf1);
CkPdf_Dispose(pdf2);
CkPdf_Dispose(pdf3);