Ошибка при цифровом пении на нескольких страницах в pdf с помощью python endesive
Я пытаюсь подписать pdf документ цифровой подписью с помощью USB-токена Class 3 путем поиска определенного текста 'Authorised Signatory' на странице, это работает совершенно нормально, когда мне нужно подписать pdf один раз. Но в одном из моих сценариев я столкнулся с многостраничным документом, в котором я должен подписать каждую страницу, После подписания pdf, когда я попытался проверить подписи в Adobe pdf reader, он подтвердил только мою первую подпись, как показано на скриншоте ниже
И я не смог увидеть аннотации второй и третьей страницы.
Вот мой код,
Дополнительно код класса подписчика выглядит следующим образом:
class Signer(hsm.HSM):
def certificate(self):
self.login("Token", "password")
keyid = [0x5e, 0x9a, 0x33, 0x44, 0x8b, 0xc3, 0xa1, 0x35, 0x33, 0xc7, 0xc2, 0x02, 0xf6, 0x9b, 0xde, 0x55, 0xfe, 0x83, 0x7b, 0xde]
keyid = bytes(keyid)
try:
pk11objects = self.session.findObjects([(PK11.CKA_CLASS, PK11.CKO_CERTIFICATE)])
all_attributes = [
PK11.CKA_VALUE,
PK11.CKA_ID,
]
for pk11object in pk11objects:
try:
attributes = self.session.getAttributeValue(pk11object, all_attributes)
except PK11.PyKCS11Error as e:
continue
attrDict = dict(list(zip(all_attributes, attributes)))
cert = bytes(attrDict[PK11.CKA_VALUE])
return bytes(attrDict[PK11.CKA_ID]), cert
finally:
self.logout()
return None, None
def sign(self, keyid, data, mech):
self.login("Token", "password")
try:
privKey = self.session.findObjects([(PK11.CKA_CLASS, PK11.CKO_PRIVATE_KEY)])[0]
mech = getattr(PK11, 'CKM_%s_RSA_PKCS' % mech.upper())
sig = self.session.sign(privKey, data, PK11.Mechanism(mech, None))
return bytes(sig)
finally:
self.logout()
Пожалуйста, помогите мне понять, где я делаю ошибку, а также как я могу ее исправить.
Заранее спасибо.
Я не endesive пользователь, и я не понимаю часть:
# Reload the PDF document to avoid xref table issues
signed_pdf_data = pdf_data
Каждая подпись добавляет новую версию PDF к PDF-файлу.
Я думаю, что pdf_data
не перечитывается, поэтому вторая подпись, которая должна подписывать вторую версию PDF, подписывает только данные первой версии PDF.
Прочитав исходный код endesive, кажется, что он добавляет "pdf-аннотацию" с помощью строки:
if box is not None:
self.addAnnotation(cert, udct, box, page0ref, obj13, obj13ref, new_13)
Аннотация - это нечто визуальное, что добавляется к PDF-файлу и отображается программами чтения PDF, накладываясь на оригинальные страницы.
Хорошо было бы, если бы endesive мог создавать несколько аннотаций к одной подписи (несколько квадратиков), тогда нужно было бы подписывать только один раз, но, похоже, что это невозможно. Вы можете попробовать добавить несколько аннотаций вручную.
Если использовать подход "одна подпись на страницу", придется каждый раз начинать процесс подписания (перечитывая новый PDF).