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

Библиотека .NET для подписания PDF-документов
Используйте библиотеку Docotic.Pdf для подписания PDF-документов в приложениях .NET Framework и .NET Core. Получите библиотеку и бесплатный лицензионный ключ с ограниченным сроком действия на странице Скачать C# .NET библиотеку PDF.
Docotic.Pdf может создавать цифровые подписи с использованием различных алгоритмов хеширования (SHA-1, SHA-256, SHA-384, SHA-512, RIPEMD-160) и различных форматов подписей (adbe.pkcs7.detached или ETSI.CAdES.detached). Библиотека также может проверять подписи PDF.
Добавление цифровой подписи в PDF в C#
Для подписи PDF-документа вам нужен цифровой сертификат PKCS#12 (.pfx или .p12), выданный действующим удостоверяющим центром (CA). Ниже приведен базовый пример, показывающий, как подписать 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" и "your_cert_password" на свой файл сертификата .p12 или .pfx и пароль. На 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.CreateImage("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);
// когда первое поле будет подписано, поля с именами "some_text_field" и
// "some_checkbox" будут заблокированы для редактирования
first.Lock = PdfSignatureFieldLock.CreateLockFields("some_text_field", "some_checkbox");
А следующий код показывает, как заблокировать все поля формы после подписания:
var second = page.AddSignatureField("second", 100, 200, 200, 50);
// когда второе поле будет подписано, все поля будут заблокированы для редактирования
second.Lock = PdfSignatureFieldLock.CreateLockAll();
Можно также заблокировать все поля формы в PDF-документе, кроме указанных полей. Для этого используйте метод PdfSignatureFieldLock.CreateLockAllExceptFields.
Скачайте и попробуйте полный пример подписания поля подписи с блокировкой на C# и VB.NET с GitHub.
Встраивание временной метки в цифровую подпись
Можно добавить дополнительную защиту к цифровой подписи, встроив временную метку. Для этого укажите URL службы Timestamp Authority в качестве одного из параметров подписания. При необходимости можно также указать имя пользователя и пароль.
При подписании библиотека получит временную метку от Timestamp Authority и встроит ее в подпись.
По соображениям совместимости мы рекомендуем использовать один из алгоритмов хеширования SHA для подписей с временной меткой.
// Замените следующий тестовый URL на ваш URL Timestamp Authority
options.Timestamp.AuthorityUrl = new Uri("http://tsa.starfieldtech.com/");
// Укажите имя пользователя и пароль, если Timestamp Authority требует аутентификации
options.Timestamp.Username = null;
options.Timestamp.Password = null;