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

Encrypt a PDF for a Certificate Instead of a Password

See more PDF Protection Examples

Demonstrates certificate security, where a PDF is encrypted for one or more recipients and each opens it with their own certificate and private key. No password is involved. Only the public certificate of a recipient is needed to encrypt. Each recipient has its own permissions, and the changeSecurity permission gives a recipient owner rights. PreLoadCheck tells an application that a file is certificate-encrypted and which certificates can open it. A PDF that cannot be opened, because no matching certificate and private key were provided, fails to load.

Chilkat Perl Downloads

Chilkat2 Perl
use strict;
use warnings;
use Chilkat2;

# 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

# The recipient's certificate.  Only the public certificate is needed to encrypt.
my $recipient = Chilkat2::Cert->new;
my $success = $recipient->LoadFromFile('qa_data/certs/recipient.cer');
if (!$success) {
    print $recipient->LastErrorText, "\n";
    exit;
}

my $pdf = Chilkat2::Pdf->new;
$success = $pdf->LoadFile('qa_data/pdf/two_page_memo.pdf');
if (!$success) {
    print $pdf->LastErrorText, "\n";
    exit;
}

# Call AddEncryptCert once for each recipient.
$success = $pdf->AddEncryptCert($recipient);
if (!$success) {
    print $pdf->LastErrorText, "\n";
    exit;
}

# recipientPermissions[0] belongs to the first certificate added.  changeSecurity gives that
# recipient owner rights, so the file can be managed later.
my $json = Chilkat2::JsonObject->new;
$json->UpdateString('method', 'certificate');
$json->UpdateBool('recipientPermissions[0].changeSecurity', 1);

my $jsonOut = Chilkat2::JsonObject->new;
$success = $pdf->Protection('encrypt', $json, $jsonOut);
if (!$success) {
    print $pdf->LastErrorText, "\n";
    exit;
}

print 'method: ', $jsonOut->StringOf('pending.method'), "\n";
print 'algorithm: ', $jsonOut->StringOf('pending.algorithm'), "\n";
print 'recipients: ', $jsonOut->SizeOfArray('pending.recipients'), "\n";

$success = $pdf->WriteFile('qa_output/memo_for_recipient.pdf');
if (!$success) {
    print $pdf->LastErrorText, "\n";
    exit;
}

# PreLoadCheck says how the file is protected, without loading it.
my $reader = Chilkat2::Pdf->new;
my $info = Chilkat2::JsonObject->new;
$success = $reader->PreLoadCheck('qa_output/memo_for_recipient.pdf', $info);
if (!$success) {
    print $reader->LastErrorText, "\n";
    exit;
}

print 'saved file, method: ', $info->StringOf('method'), "\n";
print 'saved file, recipients: ', $info->SizeOfArray('recipients'), "\n";

# The recipient opens it with the certificate and its private key, here from a .pfx file.
# (On Windows, a certificate that is installed in the Windows certificate store with its private
# key is found automatically when the PDF is loaded, and SetDecryptCert is not needed for it.)
my $myCert = Chilkat2::Cert->new;
$success = $myCert->LoadPfxFile('qa_data/pfx/recipient.pfx', 'pfx-password');
if (!$success) {
    print $myCert->LastErrorText, "\n";
    exit;
}

$success = $reader->SetDecryptCert($myCert);
if (!$success) {
    print $reader->LastErrorText, "\n";
    exit;
}

$success = $reader->LoadFile('qa_output/memo_for_recipient.pdf');
if (!$success) {
    print $reader->LastErrorText, "\n";
    exit;
}

my $empty = Chilkat2::JsonObject->new;
my $loadedInfo = Chilkat2::JsonObject->new;
$success = $reader->Protection('getInfo', $empty, $loadedInfo);
if (!$success) {
    print $reader->LastErrorText, "\n";
    exit;
}

print 'opened with: ', $loadedInfo->StringOf('loaded.openedWith'), "\n";
print 'pages: ', $reader->NumPages, "\n";

# Sample output:

# method: certificate
# algorithm: aes-256
# recipients: 1
# saved file, method: certificate
# saved file, recipients: 1
# opened with: certificate
# pages: 2