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