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