该页面可以包含自动翻译的文本。

在 C# 和 VB.NET 中加密 PDF 文档

借助 Docotic.Pdf 库,您可以使用密码或证书加密 PDF 文档。

该库使用您选择的加密算法加密受保护的文档。该库支持 RC4 40 位、RC4 128 位、AES 128 位和 AES 256 位加密算法。您可以决定要授予受保护 PDF 文件用户哪些权限。

在 C# 和 VB.NET 中加密 PDF 文档

使用密码保护 PDF

受密码保护的 PDF 文档具有所有者密码,并且可选地具有用户密码。当有人使用所有者密码打开受密码保护的 PDF 文件时,会授予所有 PDF 权限。如果使用用户密码打开 PDF 文档,或者根本不输入密码,则仅授予“用户”权限。例如,加密 PDF 文件的作者可以禁止“用户”打印,但“所有者”仍然可以打印文档。

要生成受密码保护的 PDF 文档,请创建 PdfStandardEncryptionHandler 类的实例,并根据需要进行设置。然后将该对象赋给文档保存选项中的 EncryptionHandler 属性。库会在保存 PDF 文档时使用该处理程序对其加密。

下面的代码片段演示了如何在 C# 中创建受密码保护的 PDF 文件:

using var document = new PdfDocument();

var handler = new PdfStandardEncryptionHandler("owner", "user");
handler.UserPermissions.Flags = PdfPermissionFlags.ModifyContents;

var saveOptions = new PdfSaveOptions { EncryptionHandler = handler };
document.Save(outputFileName, saveOptions);

上述代码将 owner 用作所有者密码,将 user 用作用户密码。PDF 查看器将需要密码才能打开受保护的 PDF 文件。这是因为用户密码既不是 null 也不是空字符串。

如果您希望 PDF 文件受到保护,但允许任何人无需密码即可打开它,请将用户密码设为 null 或空字符串。

在 .NET 中使用证书保护 PDF

任何受证书保护的 PDF 文档都有一个收件人集合。该集合可以包含任意数量的项。每个收件人都描述了一个可用于解密受保护 PDF 文档的证书。为每个收件人都指定了 PDF 访问权限。解密后的 PDF 文档所获得的权限取决于用于解除保护文档的证书。

某些访问权限允许对解密后的 PDF 文件执行所有操作。在 Docotic.Pdf 库中,具有此类权限的收件人称为所有者。普通收件人对解密后的 PDF 文档拥有受限权限。

要创建受证书保护的文档,请先创建 PdfPublicKeyEncryptionHandler 类的实例。不带 permissions 参数的构造函数会创建带有所有者收件人的对象。使用带 permissions 参数的构造函数可获取带有普通收件人的加密处理程序。

可以使用 AddOwner 方法添加更多所有者收件人。使用 AddRecipient 方法添加普通收件人。您可以根据需要向加密处理程序添加任意数量的所有者和普通收件人。

然后指示库在保存文档时使用该处理程序。为此,请将该对象赋给文档保存选项中的 EncryptionHandler 属性。

下面的代码演示了如何在 C# 中创建受证书保护的 PDF 文件。该代码准备了一个包含所有者和普通收件人的处理程序。在这两种情况下,收件人的证书都来自提供的密钥存储。

using var document = new PdfDocument();

var handler = new PdfPublicKeyEncryptionHandler("owner-key-store.p12", "password");
var permissions = new PdfPermissions();
permissions.Flags = PdfPermissionFlags.FillFormFields | PdfPermissionFlags.PrintDocument;
handler.AddRecipient("recipient-key-store.p12", "password", permissions);

var saveOptions = new PdfSaveOptions { EncryptionHandler = handler };
document.Save(outputFileName, saveOptions);

限制 PDF 文件的编辑

在加密 PDF 文档时,需要为文件用户设置权限。换句话说,必须指定要授予通过用户密码或与普通收件人匹配的证书打开的文档的 PDF 权限。

Docotic.Pdf 库提供 PdfPermissions 类用于用户权限。该类提供两种设置权限的方式。您可以使用 Flags 属性一次性设置所有权限。另一种方式是为每种可能的权限分别使用单独的属性。

创建 PdfStandardEncryptionHandler 对象时,请使用 UserPermissions 属性访问权限。对于 PdfPublicKeyEncryptionHandler 对象,请使用 PdfPermissions 构造函数。其余设置相同。

下面的代码演示了如何在 C# 中设置 PDF 权限:

// 默认情况下,权限对象允许所有操作。

// 您可以使用 Flags 属性仅授予特定权限。
var permisssions1 = new PdfPermissions
{
    Flags = PdfPermissionFlags.FillFormFields | PdfPermissionFlags.ModifyAnnotations
};

// 或者,您可以只禁用希望拒绝的权限。 
var permisssions2 = new PdfPermissions
{
    AssembleDocument = false,
    CopyContents = false,
    ExtractContents = false,
    ModifyContents = false,
    PrintDocument = false,
    PrintFaithfulCopy = false
};

// 或者,您可以先禁用所有权限,然后仅启用希望允许的权限。
var permisssions3 = new PdfPermissions
{
    AllowEverything = false,
    FillFormFields = true,
    ModifyAnnotations = true
};

// 目前 permisssions1、permisssions2 和 permisssions3 对象描述的是
// 相同的权限。

在 .NET 中使用 AES-256 加密 PDF

Docotic.Pdf 可以使用 AES-256 加密 PDF 文档。这是该库支持的最强加密算法。请注意,并非所有 PDF 阅读器都支持该算法。

创建 PdfStandardEncryptionHandlerPdfPublicKeyEncryptionHandler 对象后,使用 Algorithm 属性设置加密算法。

下面的 C# 代码演示了如何使用密码保护 PDF 文档并用 AES-256 对其加密:

using var pdf = new PdfDocument();
// ....

var handler = new PdfStandardEncryptionHandler("owner", "user");
handler.Algorithm = PdfEncryptionAlgorithm.Aes256Bit;

var saveOptions = new PdfSaveOptions { EncryptionHandler = handler };
pdf.Save("encrypted", saveOptions);

加密与 PDF/A

不允许加密 PDF/A 文件。当您尝试设置加密处理程序并在文档保存选项中启用生成 PDF/A 的选项时,库会抛出 PdfException 类型的异常。

PDF/A 简明指南 对如何保护 PDF/A 文件提供了建议:

希望保护其 PDF/A 文件的用户必须保护这些文件的存储位置。例如,可以通过为文件夹或驱动器实现密码保护来实现这一点。