2015-10-23 1 views
1

Я пытаюсь проанализировать идентификатор конкретного pdf (this) с помощью iTextSharp, как указано в this answer. Но я получаю нулевой массив для ID, тогда как я вижу, что другой pdfReader (pdf.js) может читать id как 77a2a5c4fc17dc3a91a072c46fe69ec0. Почему это поведение отличается? Должен ли я читать поле ID из какого-либо места, кроме трейлера?Разница между идентификатором PDF, прочитанным из iTextSharp и pdf.js

ответ

2

Открыть обычный PDF с ID в текстовом редакторе, например так:

enter image description here

Прямо перед тем, где он говорит startxref, вы видите словарь (он начинается с <<). Это трейлер словарь PDF. Одна из (необязательных) записей - это /ID, которая представляет собой массив, содержащий две строки PDF.

Если ваш PDF-адрес имеет такую ​​запись, ответ на вопрос Extract ID of a PDF document using iTextSharp не будет возвращен null.

Теперь откройте PDF в текстовом редакторе:

enter image description here

Опять вы видите словарь (прицеп справочник) перед startxref. Однако в этом случае словарь содержит только три записи: /Size (количество объектов в таблице перекрестных ссылок), /Info (ссылка на словарь, содержащий метаданные) и /Root (ссылка на словарь каталога).

Нет записи /ID, поэтому iText (и iTextSharp) должны возвращать null (и вы подтвердили, что они это делают).

Теперь найдите значение 77a2a5c4fc17dc3a91a072c46fe69ec0 в формате PDF, который вы открыли в текстовом редакторе. Вы не найдете этого значения где-нибудь , потому что его просто нет!

Обобщенная: ваш вопрос Am Я ожидал прочитать поле идентификатора с некоторого места, кроме трейлера? ошибочно. Вы спрашиваете, как читать то, чего там нет. Ваш вопрос должен быть: Почему pdf.js создает идентификатор для PDF-файлов, у которых его нет, и как его получить? Ответ на первую часть является разумным: даже iText пытается создать /ID при манипулировании PDF-документами, потому что для PDF-файла хорошая идентификация. Ответ на вторую часть: посмотрите в трейлере (но вы уже это знали).

Вывод: Основываясь на отзывах в комментариях, оказывается, что OP использует метод fingerprint() в pdf.js. Этот метод возвращает первый элемент идентификатора if и ID. Если идентификатор не найден, возвращается хеш MD5. См. source code метода fingerprint() в pdf.js.

+0

* Прямо перед тем, где указано startxref, вы видите словарь (он начинается с '<<'). Это * Каталог * или * коренной словарь * PDF * - ehem, no. это словарь * трейлера *, словарь * Catalog/root * - это тот, который содержит ссылки на ** Root **. – mkl

+1

Er ... Было раннее утро после напряженного дня в Силиконовой долине. Спасибо, что исправили меня, mkl и @rhens. –

+0

Итак, вы предполагаете, что идентификатор просто отсутствует в документе, а pdf.js либо дает какое-то случайное значение, либо генерирует его, используя некоторую логику? – labyrinth

Смежные вопросы