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

Подписать PDF-документы на C# и VB.NET

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

  • Не изменялся с момента подписания.
  • Был подписан цифровой подписью конкретного человека.

Добавление цифровой подписи в PDF в C# и VB.NET

Библиотека .NET для подписывания PDF-документов

Используйте библиотеку Docotic.Pdf для подписи PDF-документов в приложениях для .NET Framework и .NET Core. Вы можете скачать бинарные файлы библиотеки или использовать ее пакет NuGet. Чтобы попробовать библиотеку без ограничения режима ознакомительной версии, вы можете получить бесплатный лицензионный ключ с ограниченным сроком действия здесь.

Docotic.Pdf может создавать цифровые подписи, используя различные алгоритмы дайджеста (SHA-1, SHA-256, SHA-384, SHA-512, RIPEMD-160) и различные форматы подписей (adbe.pkcs7.detached или ETSI.CAdES.detached). Библиотека также может проверять подписи PDF.

Добавить цифровую подпись в PDF на C#

Вам необходим цифровой сертификат PKCS#12 (файл .pfx или .p12), выданный действительным центром сертификации, чтобы подписать PDF-документ. Вот базовый пример, показывающий, как подписать PDF-документ на C#:

using BitMiracle.Docotic.Pdf;

using (var pdf = new PdfDocument("document_to_sign.pdf"))
{
    var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.Pkcs7Detached,
        Reason = "Testing digital signatures",
        Location = "My workplace",
        ContactInfo = "support@example.com"
    };

    pdf.SignAndSave(options, "signed.pdf");
}

Замените "your_cert.p12" собственным файлом сертификата .p12 или .pfx и "your_cert_password" собственным паролем. На GitHub вы можете загрузить и попробовать полную версию примера Подписать PDF-документ. на C# и VB.NET.

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

Для указанных случаев есть примеры Подписать уже подписанный PDF-документ и Подписать PDF-форму несколькими людьми на C# и VB.NET.

Приведенный выше код неявно добавляет в PDF-документ невидимое поле для подписи и использует это поле для подписания. Давайте посмотрим, как добавлять и настраивать поля для подписи в PDF.

Подписать PDF-документ изображением рукописной подписи

Помимо цифровой подписи часто требуется добавить в PDF-файл изображение рукописной подписи. Этот пример показывает, как добавить цифровую подпись с изображением в C#:

using (var pdf = new PdfDocument("document_to_sign.pdf"))
{
    var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.Pkcs7Detached,
    };

    PdfSignatureField field = pdf.Pages[0].AddSignatureField(20, 20, 100, 50);
    options.Field = field;

    PdfImage image = pdf.AddImage("your_signature.jpg");
    options.Appearance.Image = image;
    options.Appearance.HideAllText();

    pdf.SignAndSave(options, "signed.pdf");
}

Этот код добавляет поле для подписи, связывает это поле с параметрами подписи и настраивает внешний вид поля. Вы можете отображать текст, изображение или и то, и другое в полях подписи. Посмотрите на класс PdfSignatureAppearanceOptions и пример Подписать поле подписи с использованием пользовательского стиля для более подробной информации.

Заблокировать поля PDF-формы от редактирования с помощью поля подписи

Поле подписи можно использовать для блокировки полей формы PDF после подписания. В этом примере показано, как заблокировать определенные поля формы после подписывания в C#:

var first = page.AddSignatureField("first", 100, 100, 200, 50);

// когда поле first ьудет подписано, поля с названиями "some_text_field" и
// "some_checkbox" будут заблокированы для редактирования
first.Lock = PdfSignatureFieldLock.CreateLockFields("some_text_field", "some_checkbox");

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

var second = page.AddSignatureField("second", 100, 200, 200, 50);

// когда поле second будет подписано, все поля будут заблокированы для редактирования
second.Lock = PdfSignatureFieldLock.CreateLockAll();

Вы также можете заблокировать все поля формы в PDF-документе, кроме определенных полей. Используйте метод PdfSignatureFieldLock.CreateLockAllExceptFields для этого.

Загрузите и попробуйте полную версию примера Подписать поле подписи с блокировкой на C# и VB.NET с GitHub.

Встроить временную метку в цифровую подпись

Вы можете повысить безопасность цифровой подписи, встроив временную метку. Для этого укажите URL-адрес органа, уполномоченного на выпуск временных меток (Timestamp Authority URL) в качестве одного из параметров подписи. Вы также можете указать имя пользователя и пароль, если требуется.

При подписании библиотека получит временную метку от Timestamp Authority и встроит ее в подпись.

По соображениям совместимости мы рекомендуем использовать один из алгоритмов дайджеста SHA для подписей с временными метками.

// Замените следующий тестовый URL-адрес адресом вашего Timestamp Authority
options.Timestamp.AuthorityUrl = new Uri("http://tsa.starfieldtech.com/");

// Укажите имя пользователя и пароль, если ваш центр временных меток требует аутентификации
options.Timestamp.Username = null;
options.Timestamp.Password = null;