Эта страница может содержать автоматически переведенный текст.

Расшифровка PDF-документов в C# и VB.NET

PDF-документ может быть защищен паролями, сертификатами или не быть защищен.

Существуют разные подходы к открытию PDF-документов. Рекомендуемый способ — сначала проверить, защищен ли PDF-файл. Альтернатива — попытаться открыть любой PDF-документ, не проверяя сначала, зашифрован он или нет. Библиотека Docotic.Pdf выбрасывает исключения CannotDecryptPdfException для документов, которые требуют пароль или сертификат.

Расшифровка PDF, удаление пароля из PDF в C# и VB.NET

Проверка, защищен ли PDF-документ

Библиотека предоставляет методы GetEncryptionInfo для проверки, зашифрован ли PDF-документ. Эти методы также предоставляют сведения об используемом обработчике шифрования.

Следующий фрагмент кода C# показывает, как проверить, зашифрован ли PDF-файл:

var info = PdfDocument.GetEncryptionInfo(fileName);
if (info == null)
    Console.WriteLine("Is not encrypted");
else if (info is PdfStandardEncryptionInfo standardInfo)
    Console.WriteLine("Is encrypted with a password");
else if (info is PdfPublicKeyEncryptionInfo publicKeyInfo)
    Console.WriteLine("Is encrypted with a digital certificate(s)");

Многие PDF-документы, зашифрованные с помощью паролей, не требуют пароль для открытия. Для таких PDF-файлов пароль требуется только для режима "owner" (без ограничений).

if (standardInfo.RequiresPasswordToOpen)
    Console.WriteLine("Can not be opened without a password");
else
    Console.WriteLine("Does not require a password");

Для PDF-документа, зашифрованного сертификатами, можно получить сведения о его получателях. Иными словами, можно проверить, какие сертификаты могут разблокировать PDF-документ. Обратите внимание, что разрешения документа зависят от фактически использованного сертификата для расшифровки PDF-файла.

// свойство Recipients содержит сведения о сертификатах
// которые можно использовать для расшифровки PDF-документа
foreach (var recipient in publicKeyInfo.Recipients)
    Console.WriteLine(recipient.SerialNumber);

Открытие зашифрованных PDF-документов в .NET

PDF-документ, зашифрованный с использованием паролей, может как требовать, так и не требовать пароль для открытия. В любом случае используйте конструктор PdfDocument для открытия документа.

Если PDF-файл не требует пароль, используйте конструктор без параметра обработчика расшифровки. Библиотека Docotic.Pdf откроет документ с правами "user" (с ограничениями).

Если PDF-документ требует пароль для открытия, используйте конструктор с обработчиком типа PdfStandardDecryptionHandler. Используйте тот же конструктор, если хотите открыть защищенный PDF-файл с правами "owner" (без ограничений).

Следующий фрагмент кода показывает, как открыть защищенный паролем PDF-файл в C#:

using var document = new PdfDocument(fileName, new PdfStandardDecryptionHandler("password"));
// что-то сделать с расшифрованным документом

PDF-документы, зашифрованные с использованием сертификатов, требуют соответствующий сертификат для открытия. Для одного PDF-файла может существовать более одного подходящего сертификата. Автор зашифрованного PDF-документа может предоставить разные разрешения для разных подходящих сертификатов.

Если в хранилище сертификатов X.509 текущего пользователя установлен подходящий сертификат, используйте конструктор PdfDocument без параметра обработчика расшифровки. Библиотека Docotic.Pdf использует первый подходящий сертификат из хранилища сертификатов и применит его для открытия документа.

Если в хранилище сертификатов X.509 текущего пользователя нет подходящего или нужного сертификата, создайте экземпляр PdfPublicKeyDecryptionHandler и используйте его с конструктором PdfDocument. Обработчик можно создать с помощью сертификата, хранилища ключей или хранилища сертификатов.

Следующий фрагмент кода C# создает обработчик расшифровки с открытым ключом с сертификатом из хранилища ключей. Затем обработчик используется для открытия PDF-файла, защищенного сертификатом:

var handler = new PdfPublicKeyDecryptionHandler("key-store.p12", "password");
using var document = new PdfDocument(fileName, handler);
// что-то сделать с расшифрованным документом

Удаление защиты из PDF-файлов

Чтобы удалить защиту из PDF-документа, выполните следующие шаги:

  • откройте PDF с помощью конструктора PdfDocument с подходящим обработчиком расшифровки
  • не настраивайте никакой обработчик шифрования в параметрах сохранения
  • сохраните PDF-документ

Без обработчика шифрования библиотека сохранит PDF-документ незашифрованным.

Чтобы удалить пароли из PDF, откройте документ с обработчиком типа PdfStandardDecryptionHandler. Для документов, защищенных сертификатом, используйте обработчик типа PdfPublicKeyDecryptionHandler.

Проверка разрешений PDF в .NET

Чтобы проверить разрешения, предоставленные для PDF-документа, сначала потребуется создать или открыть документ. Не имеет значения, открываете ли вы зашифрованный PDF-файл или файл без защиты.

Этот фрагмент кода показывает, как проверить разрешения PDF в C#:

// создайте новый документ или откройте существующий
using var document = new PdfDocument(fileName);
Console.WriteLine("Document permissions = {0}", document.GrantedPermissions);