Что такое линеаризация PDF
Линеаризация — это перекладка объектов внутри PDF так, чтобы первую страницу можно было показать, не скачав файл целиком. В обычном документе таблица перекрёстных ссылок лежит в самом конце, и просмотрщику сначала нужен хвост файла. В линеаризованном впереди стоят объекты первой страницы и таблица подсказок с байтовыми диапазонами остальных, поэтому чтение начинается с первого же куска.
Коротко о цифрах
- Где признак
- словарь /Linearized — первый объект, в пределах первых 1024 байт
- Как проверяем
- скан первых 2048 байт вместо второго разбора документа
- Команда
- qpdf --linearize, запись в два прохода
- Скорость
- 89 страниц и 6 МБ проходят примерно за 40 мс
- Предел загрузки
- 50 МБ — общий потолок серверных маршрутов qpdf
Где именно лежит признак
Стандарт требует, чтобы словарь /Linearized был первым объектом файла и целиком помещался в первые 1024 байта. Это и делает проверку дешёвой: просмотрщику достаточно первого пакета, чтобы решить, можно ли начинать показ, — без обращения к таблице ссылок в конце.
Мы проверяем то же самое байтовым сканом, а не командой qpdf: она означала бы второй полный разбор документа ради ответа «да или нет», который читается из заголовка. Сканируем при этом 2048 байт, а не 1024: проверка сигнатуры сознательно терпит до килобайта мусора перед %PDF- — BOM, почтовые преамбулы, вставки прокси, — и этот мусор выталкивает словарь за границу окна, ничуть не делая файл нелинеаризованным.
Что происходит при оптимизации
- Файл проверяется на сигнатуру PDF и на размер: потолок серверных маршрутов qpdf — 50 МБ.
- Читается первый килобайт с небольшим — уже линеаризованный документ виден сразу, до того как занято место в очереди обработки.
- Если очередь длиннее пяти задач, запрос честно отклоняется, вместо того чтобы копить ожидающих.
- Выполняется qpdf --linearize: запись в два прохода, объекты первой страницы уходят в начало, за ними — таблицы подсказок.
- Код возврата 3 означает, что по дороге qpdf ещё и починил структуру: в ответ добавляется отметка об этом, чтобы изменение формы файла не оказалось сюрпризом.
Когда выигрыш нулевой
- Файл открывают из папки на диске — читать по частям неоткуда, весь документ уже локально.
- Документ маленький: если он приходит одним пакетом, порядок объектов внутри роли не играет.
- Файл пересылают мессенджером, который сначала скачивает вложение целиком.
- Толк есть там, где многостраничный документ открывают по ссылке в браузере: первая страница появляется раньше, чем докачается остальное.
Частые вопросы
Станет ли файл меньше после линеаризации?
Заметного уменьшения ждать не стоит: задача операции — порядок объектов, а не их сжатие. Размер меняется на проценты в обе стороны, зато документ начинает открываться по сети с первой страницы.
Как понять, что PDF уже линеаризован?
По началу файла: словарь /Linearized обязан стоять первым объектом. Инструмент оптимизации читает этот кусок до начала работы, поэтому отвечает на вопрос сразу, не разбирая документ целиком.
Чем линеаризация отличается от сжатия?
Сжатие уменьшает объём, жертвуя качеством изображений или перепаковывая потоки. Линеаризация не трогает содержимое страниц вообще: она лишь перекладывает объекты в другом порядке и добавляет таблицы подсказок.
Почему инструмент сообщил, что заодно починил файл?
Потому что qpdf вернул код 3: по пути ему пришлось восстанавливать структуру документа. Файл при этом получен рабочим, но форма его изменилась сильнее, чем при простой перекладке объектов, и умалчивать об этом неправильно.