Удаление PDFID в PDF
Я использую iText для конвертации HTML в PDF. После этого я создаю контрольную сумму md5 созданного pdf для хранения только новых / измененных файлов.
каждый созданный файл содержит PdfID0 и PdfID1, которые выглядят как хэши.
Для чего нужны эти "хеши"? и как я могу их удалить?
я использую следующий код из пакета iText для изменения метаинфоса:
com.lowagie.text.pdf.PdfReader reader = new PdfReader(pdfPath);
com.lowagie.text.pdf.PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(tempFile));
HashMap<String, String> hMap = reader.getInfo();
hMap.put("Title", "MyTitle");
hMap.put("Subject", "Subject");
hMap.put("Keywords", "Key, words, here");
hMap.put("Creator", "me");
hMap.put("Author", "me");
hMap.put("Producer", "me");
hMap.put("CreationDate", null);
hMap.put("ModDate", null);
hMap.put("DocChecksum", null);
stamper.setMoreInfo(hMap);
stamper.close();
и извлеченные метасные файлы, используя pdftk:
InfoKey: Creator
InfoValue: me
InfoKey: Title
InfoValue: MyTitle
InfoKey: Author
InfoValue: me
InfoKey: Producer
InfoValue: me
InfoKey: Keywords
InfoValue: Key, words, here
InfoKey: Subject
InfoValue: Subject
PdfID0: 28c71a8d7790a4d3e85ce879a90dec0
PdfID1: 4c5865d36c7a381e6166d5e362d0aafc
NumberOfPages: 1
спасибо за любые подсказки
2 ответа
Что касается идентификаторов... Спецификация PDF говорит:
Идентификаторы файла должны определяться необязательной записью идентификатора в словаре трейлера файла PDF (см. 7.5.5, "Трейлер файла"). Запись идентификатора необязательна, но ее следует использовать. Значение этой записи должно быть массивом двухбайтовых строк. Первая байтовая строка должна быть постоянным идентификатором, основанным на содержимом файла в момент его создания, и не должна изменяться при постепенном обновлении файла. Вторая байтовая строка должна быть изменяющим идентификатором, основанным на содержимом файла во время его последнего обновления. Когда файл впервые записывается, оба идентификатора должны быть установлены на одно и то же значение. Если оба идентификатора совпадают при разрешении ссылки на файл, весьма вероятно, что найден правильный и неизмененный файл. Если совпадает только первый идентификатор, найдена другая версия правильного файла.
Это, идентификаторы не являются обязательными, но рекомендуется.
IText автоматически вставляет и обновляет идентификаторы. Конечно, вы можете изменить iText (в конце концов, он с открытым исходным кодом), чтобы не делать этого.
То, что вы видите, помечено как PdfID0
а также PdfID1
от pdftk
дамп метаданных является частью следующего PDF trailer
код в конце соответствующего файла PDF (пример):
trailer
<< /Size 32
/Root 24 R
/Info 19 R
/ID [
<28c71a8d7790a4d3e85ce879a90dec0>
<4c5865d36c7a381e6166d5e362d0aafc>
]
>> startxref
81799
%%EOF
/ID
запись в словаре трейлера требуется только в том случае, если Encrypt
запись присутствует; в противном случае это необязательный ключ.
Он описывается спецификацией PDF как:
"Массив из двух байтовых строк, составляющих идентификатор файла (см. 14.4, " Идентификаторы файла ") для файла. Если есть запись Encrypt, этот массив и две байтовые строки должны быть прямыми объектами и должны быть незашифрованными".
и, кроме того:
"Первая байтовая строка должна быть постоянным идентификатором, основанным на содержимом файла во время его первоначального создания, и не должна изменяться при постепенном обновлении файла. Вторая байтовая строка должна быть изменяющимся идентификатором на основе содержимого файла в время его последнего обновления. Когда файл впервые записывается, оба идентификатора должны быть установлены на одно и то же значение. Если оба идентификатора совпадают при разрешении ссылки на файл, весьма вероятно, что найден правильный и неизмененный файл. совпадает только первый идентификатор, найдена другая версия правильного файла."
И это НЕ обязательно хэш. Вот что предлагает спецификация ISO PDF (не "предписывает"):
"Чтобы обеспечить уникальность идентификаторов файлов, их следует вычислять с помощью алгоритма дайджеста сообщений, такого как MD5 (описан в Internet RFC 1321, Алгоритм дайджеста сообщений MD5; см. Библиографию), используя следующую информацию:
- Текущее время
- Строковое представление местоположения файла, обычно путь
- Размер файла в байтах
- Значения всех записей в информационном словаре документа файла (см. 14.3.3, "Информационный словарь документа")
В сгенерированных файлах PDF есть еще несколько мест, которые могут меняться при каждом новом запуске. Эти ключи в информационном словаре документа (/Info
запись указана в трейлере)
/CreationDate
/ModDate
может обновляться каждый раз, когда вы создаете или изменяете PDF.
Следовательно, использование вашей собственной контрольной суммы MD5 для созданного PDF-файла для проверки наличия новых / измененных файлов не будет работать, если только вы не убедитесь, что хотя бы "нормализовали" /CreationDate
а также /ModDate
так же хорошо как /ID
записи перед созданием хэша MD5.
Обновление: Как правильно заметил пользователь mkl в комментарии к этому ответу, /CreationDate
а также /ModDate
ключи /Info
словарь (а также /ID
info) обычно содержат эквивалентные фрагменты информации, содержащиеся в метаданных XML, встроенных в PDF. Вы можете отобразить полные метаданные XML с помощью pdfinfo
утилита вроде так:
pdfinfo -meta your.pdf