Простой способ реализовать подписание PDF с помощью iText 5.5.x с использованием внешней службы подписи или устройства - использовать реализацию IExternalSignature
или IExternalSignatureContainer
, в которой соответствующий метод Sign
вызывает службу внешней подписи иликод для подписи этим устройством для данных из его аргумента и возврата сигнатуры результата.
Для простоты давайте предположим, что ваша служба подписи / устройство могут использоваться для возврата полноценного контейнера сигнатур CMS.В этом случае можно использовать реализацию IExternalSignatureContainer
, подобную этой:
PdfReader reader = new PdfReader(SRC);
FileStream os = new FileStream(DEST, FileMode.Create);
PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0');
// Creating the appearance
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
appearance.Reason = "For a reason surely";
appearance.Location = "Positively somewhere";
appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
IExternalSignatureContainer externalSignatureContainer = new ExternalServiceContainerSigner();
// Creating the signature
MakeSignature.SignExternalContainer(appearance, externalSignatureContainer, 8192);
с
class ExternalServiceContainerSigner : IExternalSignatureContainer
{
public void ModifySigningDictionary(PdfDictionary signDic)
{
signDic.Put(PdfName.FILTER, PdfName.ADOBE_PPKLITE);
signDic.Put(PdfName.SUBFILTER, PdfName.ADBE_PKCS7_DETACHED);
}
public byte[] Sign(Stream data)
{
String hashAlgorithm = "SHA256";
byte[] hash = DigestAlgorithms.Digest(data, hashAlgorithm);
// call your external signature service to create a CMS signature
// container for the given document hash and return the bytes of
// that signature container.
return CALL_YOUR_EXTERNAL_SIGNATURE_SERVICE_TO_CREATE_A_CMS_SIGNATURE_CONTAINER_FOR(hash);
}
}
Если ваша служба подписи / устройство не предлагает создать контейнер подписи CMS, а вместо этоготолько голые байты подписи или подпись в стиле PKCS # 1, вы можете либо
- заменить вызов
CALL_YOUR_EXTERNAL_SIGNATURE_SERVICE_TO_CREATE_A_CMS_SIGNATURE_CONTAINER_FOR
, приведенный выше, своим собственным кодом, подготавливая и подписывая контейнер подписи для хэша данного документа, используя внешнюю службу/ device или - использует реализацию
IExternalSignature
, вызывающую вашу службу, и MakeSignature.SignDetached
, чтобы использовать эту реализацию.