Сжатие PDF в Linux: целенаправленное применение QPDF и Ghostscript

В Linux можно структурно оптимизировать PDF в терминале с помощью документированной команды QPDF или создать его заново через Ghostscript pdfwrite. Только проверка сохранённого результата покажет, стал ли новый файл меньше и сохранилось ли всё, что тебе нужно.

Оптимизация структуры или создание заново: какой инструмент подходит?

Эти две программы работают принципиально по-разному. Команда QPDF на этой странице сохраняет содержимое страниц и лишь заново записывает объекты файла, по возможности компактно. Например, она объединяет объекты в потоки объектов и заново сжимает данные Flate. При этом она не снижает разрешение изображений и не перекодирует их в JPEG. Необязательная оптимизация изображений в QPDF — отдельный этап с потерями, кратко описанный в следующем разделе. Отдельные параметры описаны в документации QPDF.

Ghostscript работает иначе. С выходным устройством pdfwrite он считывает PDF и создаёт новый файл на основе инструкций отрисовки каждой страницы. Текст и векторная графика при этом, как правило, сохраняются в своём виде, то есть страницы не превращаются просто в изображения. Однако в зависимости от настроек Ghostscript может пересчитать изображения. Кроме того, может измениться всё, что не относится к видимому изображению страницы. Это объясняется в руководстве Ghostscript по pdfwrite.

Некоторые программы предлагают и третий способ: заново выводят каждую страницу как изображение. При этом обычно теряются собственно текст, поиск и интерактивные элементы. Ни одна из двух команд на этой странице так не работает.

Три способа уменьшить PDF и изменения, которые они вносят в документ
МетодЧто происходитИзображенияТекст и функции
QPDF, оптимизация структурыОбъекты и данные Flate сохраняются компактнееРазрешение не снижается. Необязательное перекодирование в JPEG может привести к потере деталей.Содержимое страниц не создаётся заново, но результат всё равно нужно проверить
Ghostscript pdfwrite, создание зановоСтраницы заново создаются из инструкций их отрисовкиРазрешение может снижаться в зависимости от профиляТекст и векторы обычно сохраняются. Ссылки, формы и метаданные могут измениться.
Вывод страниц как изображенийКаждая страница становится изображениемЗависят от выбранного разрешенияСобственно текст, поиск и интерактивные элементы обычно теряются

Ни один из этих методов не гарантирует уменьшения файла. Как общее правило: если PDF состоит главным образом из текста и векторной графики, начни с QPDF. Это относится и к случаям, когда изображения, ссылки или формы желательно изменить как можно меньше. Ghostscript может подойти, если основной объём занимают большие фотографии или сканы и ты готов ради уменьшения немного пожертвовать качеством изображений. Что именно означают сжатие без потерь и с потерями, объясняется в руководстве «Сжатие PDF без потери качества».

Программы с графическим интерфейсом используют те же подходы. По собственным сведениям PDFsam, в редакции Basic выполняется только оптимизация структуры, а в редакциях Visual и Enhanced предусмотрено отдельное сжатие изображений. Старые инструкции для скриптов файловых менеджеров или интерфейсов, вызывающих Ghostscript в фоновом режиме, отчасти относятся к прежним версиям Ubuntu. Поэтому не повторяй их шаги установки без проверки. По информации производителя, PDF24 Creator доступен только для Windows; версии для Linux он не предлагает.

Если ты не хочешь ничего устанавливать, можно использовать компрессор PDF в браузере. Он обрабатывает файл на твоём устройстве без загрузки на сервер. Однако в браузерах под Linux мы его отдельно не тестировали. Чем локальная обработка в браузере отличается от настоящей работы офлайн, рассказано в руководстве «Сжать PDF без загрузки на сервер».

Проверь версию и записывай результат в отдельный файл

Обзор команд

Выбери одну из шести команд этого руководства. Ты увидишь команду без изменений и узнаешь, что означает каждая её часть.

Команды взяты из официальных руководств QPDF и Ghostscript. Мы не запускали их самостоятельно ни в Ubuntu, ни в другом дистрибутиве. Установленные в твоей системе версии могут отличаться от версий, описанных в онлайн-документации.

Эта страница не выполняет команды и не показывает вывод терминала. Сообщения своей системы ты увидишь только после самостоятельного запуска команды.

Показать версию QPDF

Показывает установленную версию QPDF. Проверь её, прежде чем использовать остальные команды.

Показывает установленную версию QPDF.
qpdf --version

Ты также можешь выделить и скопировать команду прямо в поле кода.

Части команды
qpdfПрограмма
Вызывает программу командной строки QPDF.
--versionПоказать версию
Выводит версию QPDF, используемую в твоей системе.

Если командная оболочка сообщает, что команда не найдена, вероятно, QPDF не установлен. Название пакета и способ установки зависят от твоего дистрибутива.

Место в руководстве

Показать версию Ghostscript и устройства вывода

Показывает версию Ghostscript и доступные устройства вывода.

Показывает версию Ghostscript и доступные выходные устройства.
gs -h

Ты также можешь выделить и скопировать команду прямо в поле кода.

Части команды
gsПрограмма
Вызывает Ghostscript. В Unix программа называется gs.
-hСправка
Выводит версию, параметры, форматы, доступные устройства вывода и путь поиска.

Если командная оболочка сообщает, что команда не найдена, вероятно, Ghostscript не установлен. Запиши дистрибутив и версию, чтобы позже можно было разобраться в полученных результатах.

Место в руководстве

Сохранить структуру компактнее

Заново сохраняет объекты файла как можно компактнее. При этом разрешение изображений не уменьшается и они не перекодируются в JPEG.

Команда QPDF из документации: сохраняет структуру компактнее, не снижая разрешение изображений и не перекодируя их в JPEG.
qpdf "original.pdf" --object-streams=generate --compress-streams=y --decode-level=generalized --recompress-flate --compression-level=9 "optimiert-qpdf.pdf"

Ты также можешь выделить и скопировать команду прямо в поле кода.

Части команды
qpdfПрограмма
Вызывает программу командной строки QPDF.
"original.pdf"Входной файл
PDF, который считывается. Результат записывается в отдельный файл.
--object-streams=generateСоздать потоки объектов
Объединяет подходящие объекты в потоки объектов и сжимает их. Версия PDF выходного файла будет не ниже 1.5.
--compress-streams=yСжать потоки
Сжимает потоки с помощью Flate, если они ещё не сжаты другим способом.
--decode-level=generalizedДекодировать фильтры общего назначения
Декодирует данные с поддерживаемыми фильтрами общего назначения, такими как LZW, Flate, ASCII85 и ASCIIHex. Данные JPEG (DCT) при этом не декодируются.
--recompress-flateПовторно сжать Flate
Распаковывает существующие потоки Flate и сжимает их заново. Из-за этого запись может занять больше времени.
--compression-level=9Уровень сжатия
Выбирает для Flate наивысший уровень zlib в документированном диапазоне от 1 до 9. Более высокие уровни требуют больше времени. Это значение не связано с качеством JPEG.
"optimiert-qpdf.pdf"Выходной файл
Имя нового файла. В обеих командах проверки он используется как входной файл.

Только сравнение количества байт покажет, стал ли новый файл меньше. Отдельное имя выходного файла не защищает от перезаписи существующего файла с таким же именем. Поэтому выбери ещё не использованное имя. Команда не гарантирует сохранение действительности цифровой подписи.

Место в руководстве

Пересоздать PDF с помощью pdfwrite

Ghostscript считывает PDF и создаёт новый файл из инструкций отрисовки каждой страницы, в данном случае с предустановкой /ebook.

Пример Ghostscript с профилем /ebook. При этом детали изображений и функции документа могут измениться.
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sOutputFile="optimiert-gs.pdf" "original.pdf"

Ты также можешь выделить и скопировать команду прямо в поле кода.

Части команды
gsПрограмма
Вызывает Ghostscript.
-dSAFERКонтроль доступа
Ограничивает доступ к файлам и устройствам. Начиная с версии 9.50 это стандартное поведение. Общей гарантией безопасности оно не является.
-dBATCHЗавершить после обработки
Завершает Ghostscript после обработки указанных файлов, вместо перехода в интерактивный режим.
-dNOPAUSEБез пауз
Отключает запрос подтверждения и паузу в конце каждой страницы.
-sDEVICE=pdfwriteУстройство вывода
Выбирает pdfwrite, который создаёт новый PDF. Текст и векторная графика, как правило, сохраняются. Всё, что не относится к видимому изображению страницы, может измениться.
-dPDFSETTINGS=/ebookПредустановка
Задаёт набор отдельных параметров со средним разрешением изображений. Название описывает назначение, а не уровень качества и не гарантированное уменьшение размера.
-sOutputFile="optimiert-gs.pdf"Выходной файл
Задаёт имя нового файла.
"original.pdf"Входной файл
PDF, который считывает Ghostscript.

Детали изображений и функции документа могут измениться, даже если страницы выглядят одинаково. Определённый размер или качество не гарантируются. Проверь сохранённый результат и выбери ещё не использованное имя выходного файла.

Место в руководстве

Проверить структуру выходного файла

Проверяет синтаксис сохранённого выходного файла. Для результата Ghostscript замени имя файла.

Проверяет синтаксис сохранённого результата. Для результата Ghostscript замени имя файла.
qpdf "optimiert-qpdf.pdf" --check

Ты также можешь выделить и скопировать команду прямо в поле кода.

Части команды
qpdfПрограмма
Вызывает программу командной строки QPDF.
"optimiert-qpdf.pdf"Проверяемый файл
Ранее сохранённый результат команды QPDF.
--checkПроверить структуру
Проверяет структуру, шифрование, линеаризацию и кодирование потоков.

Код возврата 0 означает проверку без ошибок, 2 — ошибки, 3 — предупреждения. Проверяется только структура файла. Проверка не показывает, правильно ли он выглядит, работают ли формы и ссылки и безопасен ли файл.

Место в руководстве

Вывести количество страниц

Выводит количество страниц сохранённого выходного файла. Повторно запусти команду с именем оригинала и сравни оба числа.

Выводит число страниц сохранённого результата. Выполни команду ещё раз с именем оригинала и сравни.
qpdf "optimiert-qpdf.pdf" --show-npages

Ты также можешь выделить и скопировать команду прямо в поле кода.

Части команды
qpdfПрограмма
Вызывает программу командной строки QPDF.
"optimiert-qpdf.pdf"Файл для подсчёта страниц
Ранее сохранённый результат команды QPDF.
--show-npagesПодсчитать страницы
Выводит количество страниц указанного файла.

Одинаковое количество страниц не означает, что содержимое, изображения и функции остались без изменений. Просмотри страницы самостоятельно.

Место в руководстве

Кнопка записывает показанную команду в буфер обмена только после твоего нажатия. Она не читает буфер обмена, ничего не сохраняет и ничего не отправляет.

Команды на этой странице взяты из официальных руководств QPDF и Ghostscript. Мы сами не выполняли их в Ubuntu или другом дистрибутиве, поэтому это не протестированная инструкция для Ubuntu. Сначала проверь, какие версии установлены в твоей системе. Пакеты твоего дистрибутива могут отличаться от версий, описанных в актуальной онлайн-документации.

Показать установленные версии

Показывает установленную версию QPDF.
qpdf --version
Показывает версию Ghostscript и доступные выходные устройства.
gs -h

Если оболочка сообщает, что команда не найдена, программа, вероятно, не установлена. Название пакета и способ установки зависят от твоего дистрибутива. Запиши дистрибутив и версии, чтобы позже можно было установить, в каких условиях получен результат.

Основные правила для каждой попытки

  • Оставляй оригинал нетронутым. У входного и выходного файлов всегда должны быть разные имена.
  • Давай каждому результату новое, ещё не использованное имя, чтобы не перезаписать предыдущий файл.
  • Каждую следующую попытку начинай снова с оригинала, а не с результата предыдущего запуска.
  • Не используй параметры или скрипты, которые напрямую заменяют входной файл.

QPDF: оптимизация структуры хранения

Команда QPDF из документации: сохраняет структуру компактнее, не снижая разрешение изображений и не перекодируя их в JPEG.
qpdf "original.pdf" --object-streams=generate --compress-streams=y --decode-level=generalized --recompress-flate --compression-level=9 "optimiert-qpdf.pdf"

Команда читает original.pdf и записывает новый файл с именем optimiert-qpdf.pdf. Параметры обеспечивают объединение объектов в потоки объектов, сжатие потоков данных и повторное сжатие данных Flate с максимальной степенью. Пересчёт изображений при этом не выполняется. Для потоков объектов требуется PDF 1.5. Если получатель явно требует более старую версию PDF, эта команда не подойдёт без дополнительных изменений.

QPDF также может оптимизировать изображения и перекодировать данные JPEG с выбранным качеством. Параметр качества JPEG доступен начиная с версии 12.1. Обе операции выполняются с потерями и могут дополнительно ухудшить уже сжатые изображения JPEG. Используй их только в том случае, если затем целенаправленно проверишь изображения.

Ghostscript: перезапись PDF с использованием профиля

Пример Ghostscript с профилем /ebook. При этом детали изображений и функции документа могут измениться.
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sOutputFile="optimiert-gs.pdf" "original.pdf"

-sDEVICE=pdfwrite выбирает вывод в PDF, -sOutputFile задаёт имя нового файла, а входной файл указывается в конце. -dBATCH и -dNOPAUSE не позволяют Ghostscript ожидать ввода. -dSAFER в таком виде также используется в примерах руководства Ghostscript по командной строке. Профиль /ebook — лишь отправная точка, а не рекомендация для любого файла.

Как правильно понимать профили Ghostscript

С помощью -dPDFSETTINGS ты выбираешь сразу целый набор отдельных параметров. Название профиля описывает предполагаемое применение. Оно не обозначает ни уровень качества, ни определённую экономию размера.

Профили -dPDFSETTINGS согласно актуальному руководству Ghostscript (версия 10.09.0). Установленная у тебя версия может отличаться.
ПрофильПредполагаемое применениеСнижение разрешения цветных изображений и изображений в оттенках серого
/screenПросмотр на экране, низкое разрешениеВключено. Целевое значение 72 dpi, только для изображений с разрешением более чем в 1,5 раза выше него.
/ebookСреднее разрешениеВключено. Целевое значение 150 dpi, только для изображений с разрешением более чем в 1,5 раза выше него.
/printerПечатьПо умолчанию отключено
/prepressДопечатная подготовкаПо умолчанию отключено. Этот вариант не обязательно обеспечивает наибольшее соответствие оригиналу.
/defaultШирокое применениеПо умолчанию отключено

Значит ли это, что /prepress даёт лучшее качество? Нет. В руководстве прямо указано, что /prepress — не самая точная по отношению к оригиналу настройка. Без -dPDFSETTINGS результат может оставаться ближе к оригиналу. Самый маленький файл /prepress также не гарантирует.

Целевые значения /screen и /ebook не означают, что после обработки каждое изображение будет иметь ровно 72 или 150 dpi. Для изображений ниже порога разрешение не снижается и сохраняется прежним. Однако это не обязательно означает полное отсутствие изменений: остальные параметры профиля, например кодирование изображений или цвета, всё равно могут их изменить. Параметр -r не заменяет снижение разрешения. Он управляет разрешением только тогда, когда Ghostscript вынужден отрисовывать отдельные части вместо их обычной обработки, и не уменьшает встроенные изображения. Согласно руководству, часто лучше целенаправленно задавать отдельные параметры, чем полагаться на профиль.

Не используй один профиль для всех файлов. Текстовый документ, фотокаталог и скан реагируют по-разному. В случае сканов лучше начинать ещё на этапе сканирования. Как это сделать, объясняется в руководстве «Уменьшить отсканированный PDF».

Проверь текст, ссылки, формы и подписи

То, что PDF после сжатия выглядит так же, не доказывает сохранения всего содержимого файла. Ghostscript создаёт файл заново. Согласно объяснению Ghostscript об оптимизации PDF, за одинаковым внешним видом могут скрываться изменённые инструкции и метаданные. После QPDF также проверяй важные для тебя функции:

  • Выдели и скопируй текст, попробуй поиск.
  • Нажми на ссылки и закладки.
  • Если файл содержит форму, заполни её поля и попробуй сохранить.
  • Проверь такие сведения, как заголовок или автор, если получатель их учитывает.
  • Если требуется определённый стандарт, например PDF/A, проверь соответствие с помощью предназначенного для этого инструмента. Ни одна из приведённых здесь команд не гарантирует сохранения этого статуса.

PDF с цифровой подписью

Ни одна из двух команд не может гарантировать, что цифровая подпись останется действительной после перезаписи файла. Поэтому сжатие не является способом уменьшения PDF с цифровой подписью. Сохраняй подписанный оригинал без изменений. Если документ подписал кто-то другой и тебе нужна версия меньшего размера, получи неподписанный исходный файл или свяжись с подписавшим. Повторное подписание согласуй с выдавшей документ стороной или получателем. Дополнительные сведения приведены в материале Adobe об ограничениях PDF с цифровой подписью. Отсканированное видимое изображение подписи не является цифровой подписью.

Снятие защиты паролем или ограничений на редактирование не относится к уменьшению размера, и команд для этого здесь нет. Вместо этого попроси отправителя предоставить подходящую версию. Подробнее об обращении с такими документами рассказано в руководстве «Что нужно знать о подписях и формах».

Сравни размер результата и сохрани оригинал

Выполнение команды без сообщения об ошибке ещё ничего не говорит о результате. Сравни точный размер оригинала и выходного файла в байтах, а не только округлённые значения в MB. Сколько процентов удалось сэкономить, можно рассчитать с помощью калькулятора степени сжатия.

Проверка синтаксиса и числа страниц

Проверяет синтаксис сохранённого результата. Для результата Ghostscript замени имя файла.
qpdf "optimiert-qpdf.pdf" --check

Код возврата QPDF 0 означает проверку без ошибок, 2 — ошибки, а 3 — предупреждения. Проверка касается только структуры файла. Она не показывает, сохранили ли формы, ссылки и изображения прежние функции и внешний вид.

Выводит число страниц сохранённого результата. Выполни команду ещё раз с именем оригинала и сравни.
qpdf "optimiert-qpdf.pdf" --show-npages

Проверка в программе просмотра PDF

  1. Заново открой сохранённый выходной файл из его папки.
  2. Пролистай все страницы и сравни их формат и ориентацию с оригиналом.
  3. Рассмотри изображения, мелкий шрифт и тонкие линии при большом увеличении.
  4. Проверь поиск, ссылки и формы, как описано в предыдущем разделе.
  5. По возможности открой файл также во второй программе просмотра.

Больше, без изменений или пустой?

Ghostscript может и увеличить PDF. Файл создаётся заново и кодируется иначе, а новые инструкции иногда занимают больше места, чем прежние. От QPDF тоже не стоит ожидать большой экономии, если файл уже сохранён компактно.

Результат большего или почти такого же размера всё равно может быть корректным. Так ли это, покажут только те же проверки сохранённого файла, что и для любого другого результата: один лишь размер ничего не говорит об ошибках или потерянных функциях. В итоге оставь более подходящий файл; часто это просто оригинал. Иначе обстоит дело с пустым, нечитаемым или повреждённым результатом. Это неудачная попытка, а не особенно сильное сжатие. Не отправляй такой файл, прочитай сообщения в терминале и начни заново, используя оригинал и новое имя выходного файла.

Если PDF по-прежнему превышает лимит получателя, дальнейшие действия описаны в руководстве «PDF не уменьшается». В любом случае сохраняй оригинал, пока новая версия не будет доставлена и принята.

Настройки конфиденциальности

Выберите, разрешать ли необязательную аналитику и рекламу. В этой неопубликованной предварительной версии обе категории останутся отключёнными даже при вашем согласии. Инструменты для документов работают при любом выборе. Изменить выбор можно в любое время в нижней части страницы.

Необходимые настройки

Обязательно

Ваш выбор и цветовая тема сохраняются локально. Инструменты для документов доступны и без необязательных сервисов.

Неактивно

Необязательный сбор статистики использования. Сейчас неактивен: согласие сохраняет ваш выбор, но не включает аналитические сервисы в этой предварительной версии.

Неактивно

Необязательная реклама. Сейчас неактивна: согласие сохраняет ваш выбор, но не включает рекламные сервисы в этой предварительной версии.

Необязательная аналитика и реклама отключены.