Что на самом деле происходит при сжатии PDF
PDF123 Compress пережимает потоки и упаковывает объекты через qpdf, но не уменьшает разрешение изображений, не перекодирует растры в JPEG с потерями и не подрезает шрифты. Линеаризация размер файла почти не меняет.

Два PDF могут выглядеть на экране одинаково, а различаться на три порядка: 50 KB против 50 MB. Разрыв почти никогда не сидит в текстовых операторах. В договоре на двадцать страниц эти операторы занимают обычно несколько десятков килобайт, а всё остальное — это отсчёты изображений, целиком встроенный шрифт и то, насколько плотно упакованы потоки и объекты.
Отсюда вывод, который стоит сделать сразу: «сжать PDF» — не одно действие, а четыре. Они уменьшают разное и стоят по-разному, и если смешать их в одно, опыт получается противоречивым: файл сжали, а он не уменьшился, или уменьшился, но страницы поплыли.
Размер задают изображения, шрифты и упаковка
Большинство случаев «почему этот PDF такой огромный?» начинаются со скана или фотографии высокого разрешения, встроенных в исходном размере. Арифметику стоит проделать один раз: страница формата Letter 8,5 × 11 дюйма при 300 DPI — это примерно 2550 × 3300 пикселей, а при трёх байтах на пиксель получается около 25 MB без сжатия. Двадцать таких страниц часто весят 60–80 MB ещё до того, как кто-то возьмётся за сжатие.
Второй источник — шрифты. PDF может встроить целую шрифтовую программу, чтобы текст одинаково отображался на любой машине, и цена зависит от размера таблиц глифов, а не от того, сколько текста реально прочитано. Поэтому подрезание шрифтов — отдельный рычаг размера.
Третий — сама упаковка. Один и тот же контент можно хранить с расточительными настройками сжатия, а объекты могут быть разбросаны по файлу, каждый со своими служебными расходами. Это не меняет ни пикселя, ни глифа, и именно до этой части добирается пережатие потоков.
«Сжатие» — это четыре разных рычага
На размер действуют четыре рычага; они работают на разных уровнях, а их цена почти не пересекается. Выбрать не тот — самая частая причина, по которой сжатие как будто ничего не делает.
| Рычаг | Что затрагивает | Выигрыш в размере | Цена |
|---|---|---|---|
| Пережатие потоков и объектные потоки | Как сжаты потоки контента, как хранятся и упакованы объекты | Зависит от того, насколько рыхлым был оригинал | Внешний вид страниц не меняется |
| Уменьшение разрешения изображений | Число пикселей, то есть разрешение | Большой | Разрешение снижается безвозвратно |
| Перекодирование изображений с потерями | Байтовое представление растра | Большой | Качество изображения снижается |
| Подрезание шрифтов | Встроенные таблицы глифов | Умеренный | Неиспользованные глифы больше нельзя редактировать |
| Линеаризация | Порядок объектов | Почти нулевой | Взамен даёт время загрузки первой страницы |
Первые четыре строки обычно огульно называют «сжатием», но только первая не трогает содержимое. У неё же легче всего недооценить отдачу: в скане, чей размер — это в основном необработанные отсчёты изображения, ей почти нечего устранять, а существенно сократить его могли бы уменьшение разрешения и перекодирование с потерями, ценой безвозвратной потери разрешения и качества.
Какой из четырёх рычагов использует PDF123 Compress
Сжать PDF (POST /api/v1/misc/compress-pdf) делает только первую строку. Он запускает qpdf со сжатием несжатых потоков (--compress-streams=y), повторным проходом по уже сжатым Flate потокам (--recompress-flate) и упаковкой объектов в объектные потоки (--object-streams=generate).
Он не уменьшает разрешение изображений, не перекодирует растры в JPEG более низкого качества и не подрезает шрифты. Страницы должны выглядеть так же, а экономия берётся из пережатия Flate и упаковки объектов.
Условие отказа заслуживает такой же ясности. Если размер файла — это в основном уже сжатые данные JPEG, Flate нечего сжимать, потому что эти байты лежат вне зоны действия трёх ключей выше. Поэтому пакет сканов может вернуться меньше всего на несколько процентов, тогда как текстовый PDF похожего размера выигрывает заметно больше.
Обратный путь — Decompress PDF: он разворачивает потоки для проверки (--qdf, объектные потоки отключены) и точно так же не меняет внешний вид страниц.
Когда нужен другой путь, а не Compress
| Что вам нужно | Какой путь выбрать |
|---|---|
| Идентичный внешний вид, только убрать накладные расходы упаковки | Compress |
| Пакет сканов действительно слишком велик и потеря качества допустима | Уменьшение разрешения или перекодирование с потерями, но не этот Compress |
| Нужна возможность редактировать, но очередной символ не печатается | Другие настройки экспорта или исходный файл, см. подрезание шрифтов |
| Браузер должен показать первую страницу раньше | Линеаризация решает первую отрисовку, а не размер |
| Файл вообще не открывается | Repair, это структурная проблема, а не проблема размера |
В последней строке прячется ловушка: Линеаризовать PDF здесь не отдельная реализация, а псевдоним Compress. Оба указывают на одну операцию, канонический id — misc/compress-pdf, а linearize-pdf лишь псевдоним; портал для этого инструмента всегда отправляет linearize=true и optimizeLevel=1, сервер не читает ни то ни другое поле, а qpdf никогда не получает --linearize. Линеаризует файл та операция, которая его шифрует, — Protect.
Итак, если вам нужен тот же внешний вид в файле меньшего размера, Compress — это весь ответ. Если нужна потеря качества изображений или подрезание шрифтов, этот путь — не тот рычаг. Файл возвращается сразу, без учётной записи. А чтобы увидеть, где на самом деле живут объекты, потоки и таблица перекрёстных ссылок, читайте Что внутри PDF.