Длина является косвенным объектом, который следует за потоком. Очевидно, что длина может быть прочитана только после анализа потока.
То, что вы называете "очевидным", просто неправильно.
Поскольку анализ PDF с начала и определение объектов PDF на ходу не является рекомендуемым способом анализа PDF.
Хотя ISO 32000-1 здесь немного расплывчато и просто говорит
Соответствующие читатели должны прочитать файл PDF с конца.
(ISO 32000-1, раздел 7.5.5 File Trailer)
ISO 32000-2 четко определяет:
За исключением линеаризованных файлов PDF, все файлы PDF должны читаться с использованием трейлера и таблицы перекрестных ссылок , как описано в следующих подпунктах. Последовательное чтение нелинейного файла ненадежно из-за способа обработки объектов после инкрементного обновления. (См. 6.3.2, «Соответствие процессоров PDF».)
(ISO 32000-2, раздел 7.5 Структура файла)
Таким образом, в случае вашей выдержки PDF, обработчик PDF пытается прочитать объект 5 0
- ищет объект
5 0
в перекрестных ссылках и получает его смещение в файле,
- идет к этому смещению и начинает читать объект, сначала анализируя словарь потока,
- в ключевом слове
stream
распознает, что объект является потоком, и получает его значение Length , которое оказывается косвенной ссылкой на 6 0
,
- ищет объект
6 0
в перекрестных ссылках и получает его смещение в файле,
- идет к этому смещению и читает объект, число
30
,
- читает содержимое потока объекта потока
5 0
, зная, что его длина равна 30.
Такой подход, как ваш, явно считается "ненадежным".
Я думаю, что допускается, чтобы Length был косвенным объектом, который может быть разрешен только после того, как поток является дефектом проектирования.
Если бы не было перекрестных ссылок, вы были бы правы. Вот почему формат FDF (который не имеет обязательных перекрестных ссылок) определяет:
FDF основан на PDF; он использует тот же синтаксис и имеет практически одинаковую файловую структуру (7.5, «Файловая структура»). Тем не менее, он отличается от PDF следующими способами:
[...]
- Длина потока не должна указываться сторонним объектом.
(ISO 32000-2, раздел 12.7.8 Формат данных форм)
По поводу комментариев:
Так что я прав, что PDF не может быть проанализирован последовательно,
Хотя очень оригинальный дизайн PDF, вероятно, предназначался для последовательного анализа, он получил дальнейшее развитие с учетом только перекрестных ссылок. PDF просто больше не предназначен для последовательного анализа. И это уже тот случай, когда я начал работать с PDF в конце 90-х годов.
и единственная причина в том, что требуемая длина двоичных потоков может быть определена после потока.
Это далеко не единственная причина, есть и другие ситуации, требующие поиска перекрестных ссылок для правильного разбора.
Как указывало @mkl, парсер должен прочитать где-то перед концом файла PDF, чтобы получить startxref, надеясь, что он не начнет анализ в середине двоичного потока.
Это не правильно. PDF должен заканчиваться на «%% EOF» плюс необязательный конец строки. До этого должен быть конец строки, до этого число, до этого конец строки, до этого startxref.
Это уже четко выражено в ИСО 32000-1:
Последняя строка файла должна содержать только маркер конца файла, %% EOF .Две предыдущие строки должны содержать, по одной в строке и по порядку, ключевое слово startxref и смещение байта в декодированном потоке от начала файла до начала ключевого слова xref в последнем разделе перекрестных ссылок.
(ISO 32000-1, раздел 7.5.5 File Trailer)
Таким образом, нет опасности быть "всередина двоичного потока ", если PDF действителен.
Еще одна вещь, которая мне не нравится в формате PDF, заключается в следующем: при разработке синтаксического анализатора вы обычно создаете тестовые файлы с некоторыми элементами, которые выработа над.Этот подход, кажется, работает со всем, кроме потоков.Абсолютное расположение файлов в синтаксических элементах и требование множественного произвольного доступа усложняют эту задачу.
Вы, похоже, ошибочно полагаете, что формат PDF представляет собой текстовый формат с тегами, такой как HTML.Это не вариант.Несмотря на то, что многочисленные синтаксические элементы определены с использованием некоторого ключевого слова ASCII и есть «строки», PDF - это двоичный формат, таблицы перекрестных ссылок - не уловка, а центральный узел доступа к объектам, а оптимизация для произвольного доступа выполняется с помощью дизайна..