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

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

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

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

Расшифровать PDF, удалить пароль из PDF в C# и VB.NET

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

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

Библиотека Docotic.Pdf 9.3.17014-dev Регрессионные тесты 14,645 прошло Всего загрузок NuGet 4,172,488

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

var info = PdfDocument.GetEncryptionInfo(fileName);
if (info == null)
    Console.WriteLine("Не зашифрован");
else if (info is PdfStandardEncryptionInfo standardInfo)
    Console.WriteLine("Зашифрован паролем");
else if (info is PdfPublicKeyEncryptionInfo publicKeyInfo)
    Console.WriteLine("Зашифрован цифровым сертификатом(ами)");

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

if (standardInfo.RequiresPasswordToOpen)
    Console.WriteLine("Без пароля невозможно открыть");
else
    Console.WriteLine("Не требует пароля");

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

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

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

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

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

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

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

using (var document = new PdfDocument(fileName, new PdfStandardDecryptionHandler("password")))
{
    // do something with the decrypted document
}

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))
{
    // do something with the decrypted document
}

Снять защиту с PDF-файлов

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

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

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

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

Проверить разрешения PDF в .NET

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

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

// create a new or open an existing document
using (PdfDocument document = ...)
{
    Console.WriteLine("Document permissions = {0}", document.GrantedPermissions);
}