Я хотел бы знать, как получить исходный контент из подписанного PDF-документа, используя библиотеку iText java или другую.
благодаря
ОБНОВЛЕНИЕ 1:
Возможный пример:
PdfReader reader = new PdfReader(PATH_TO_PDF);
AcroFields fields = reader.getAcroFields();
ArrayList<String> signatures = fields.getSignatureNames();
for (String signature : signatures)
{
// Start revision extraction
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte bb[] = new byte[8192];
InputStream ip = fields.extractRevision(signature);
int n = 0;
while ((n = ip.read(bb)) > 0)
out.write(bb, 0, n);
out.close();
ip.close();
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] resum = md.digest(out.toByteArray());
// End revision extraction
}
Примечание 1: В этом примере все признаки достигаются при наличии нескольких знаков.
Примечание 2: Хэш не совпадает с исходным хеш-документом (неподписанным документом)
Пожалуйста, взгляните на следующее изображение:
В этом случае у вас есть файл PDF (начиная с %PDF-1.
и заканчивая %%EOF
), и цифровая подпись является частью самого документа. Это значение ключа /Contents
в словаре подписи, которое, в свою очередь, является значением записи /V
в словаре поля подписи.
Невозможно получить исходный PDF так, как это было раньше, потому что исходный PDF был изменен: объекты перенумерованы, поле подписи было добавлено или "заполнено", добавив словарь подписи.
Вы можете удалить подпись, но это не даст вам оригинальный PDF файл.
PdfReader reader = new PdfReader(SIGNED);
AcroFields acroFields = reader.getAcroFields();
acroFields.removeField("sig");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(UNSIGNED));
stamper.close();
reader.close();
В этом случае SIGNED
- это путь к файлу с подписями под названием "sig"
. Мы удаляем полную подпись (включая поле подписи). Путь к результирующему файлу UNSIGNED
и файл, в котором больше нет следа поля подписи "sig"
. Это уже не оригинальный PDF файл, который был подписан.
Теперь посмотрим на следующее изображение:
Это показывает PDF с тремя сигнатурами. Первая подпись была добавлена так, как я ранее описал: вы больше не можете получить исходный документ.
Однако вторая и третья подписи были добавлены в режиме добавления. Это единственный способ добавить дополнительные подписи, поскольку изменение версии 1 приведет к поломке первой подписи.
Если у вас есть версия 3 (с пометкой Rev3), очень легко получить ревизию 1 и 3 (Rev1 и Rev2). Это показано в примере подписи:
PdfReader reader = new PdfReader(SIGNED);
AcroFields af = reader.getAcroFields();
FileOutputStream os = new FileOutputStream(REVISION);
byte bb[] = new byte[1028];
InputStream ip = af.extractRevision("first");
int n = 0;
while ((n = ip.read(bb)) > 0)
os.write(bb, 0, n);
os.close();
ip.close();
В этом примере "first"
- это имя поля подписи, SIGNED
- это путь к файлу с сигнатурой, а REVISION
- это путь к пересмотру, который является результатом этой операции.