Как уменьшить размер PDF в Linux

Большие PDF-файлы медленно загружаются, упираются в лимиты почты и занимают лишнее место на сервере. В Linux есть несколько рабочих способов уменьшить их размер: от одной команды Ghostscript до графических утилит без терминала. Для большинства задач лучший старт это Ghostscript с пресетом /ebook.

С чего начать

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

pdfinfo input.pdf
Title:           Q3 Report
Pages:           42
Page size:       595.28 x 841.89 pts (A4)
File size:       76534291 bytes
Optimized:       no
PDF version:     1.6

Когда PDF раздувают изображения

Частая причина большого размера это встроенные изображения с высоким разрешением. Презентация, экспортированная для печати, или отчёт с фотографиями легко уходит в сотни мегабайт. Чтобы увидеть, какие изображения внутри PDF и с каким разрешением, ставят poppler-utils и запускают pdfimages -list. Если картинки идут с плотностью около 300 dpi и документ нужен только для экрана, уменьшение до 150 dpi обычно сильно снижает размер без заметной потери читаемости.

sudo apt install poppler-utils
pdfimages -list input.pdf

Когда PDF получен сканированием

Сканированный PDF это по сути набор полноразмерных растровых страниц без текстового слоя. У таких файлов размер растёт вместе с разрешением, а компрессия шрифтов почти не помогает. Если исходник чёрно-белый или почти монохромный, перевод в оттенки серого и снижение эффективного DPI дают заметный выигрыш. Чтобы отличить сканы от обычных PDF, снова удобно смотреть pdfimages -list.

Когда виноваты шрифты и метаданные

PDF может разрастаться из-за дублирующихся шрифтов, лишних цветовых профилей, подробных XMP-метаданных и следов инкрементальных правок. Всё это не видно на экране, но занимает место. Если одно лишь уменьшение картинок не даёт нужного эффекта, помогает структурная очистка через cpdf -squeeze или повторная пересборка через Ghostscript.

Способ 1: Ghostscript

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

Установка Ghostscript

sudo apt install ghostscript
gs --version

Базовая команда

gs \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS=/ebook \
  -dNOPAUSE \
  -dQUIET \
  -dBATCH \
  -sOutputFile=output.pdf \
  input.pdf

Здесь -sDEVICE=pdfwrite выбирает PDF-вывод, -dCompatibilityLevel=1.4 задаёт совместимость с PDF 1.4, а -dPDFSETTINGS=/ebook включает режим с целевым разрешением около 150 dpi. -dNOPAUSE, -dQUIET и -dBATCH убирают паузы, лишний вывод и завершают обработку после выполнения. Выходной файл обязательно нужно писать в новый путь, а не поверх исходника.

Пресеты -dPDFSETTINGS

Ghostscript поддерживает несколько предустановок. /screen даёт самый маленький размер, но сильнее всего режет качество. /ebook подходит для обычной пересылки и чтения с экрана. /printer больше ориентирован на печать. /prepress сохраняет больше качества для профессиональной допечатной подготовки. /default может вообще не уменьшить файл заметно, а иногда даже увеличить его. Если после одного из пресетов PDF стал больше, а не меньше, структурная очистка через cpdf -squeeze может дать лучший результат без изменения качества изображений.

Пример до и после

ls -lh input.pdf
-rw-r--r-- 1 user user 73M Jan 10 09:00 input.pdf
gs \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS=/ebook \
  -dNOPAUSE \
  -dQUIET \
  -dBATCH \
  -sOutputFile=output.pdf \
  input.pdf

ls -lh output.pdf
-rw-r--r-- 1 user user 14M Jan 10 09:01 output.pdf

В этом случае файл уменьшился с 73 МБ до 14 МБ, то есть примерно на 81%. После сжатия стоит открыть результат и проверить, что текст читается, а картинки не стали слишком грубыми. Если качество оказалось недостаточным, можно повторить обработку с /printer вместо /ebook.

Способ 2: ps2pdf и pdf2ps

Если нужен тот же движок Ghostscript, но в более коротком варианте, удобно использовать ps2pdf. По сути это более компактная форма той же обработки, поэтому для стандартных офисных файлов результат обычно совпадает с прямым вызовом gs при одинаковом пресете. pdf2ps при этом сначала переводит PDF в PostScript, а затем ps2pdf снова собирает его в PDF, но чаще всего ps2pdf вызывают сразу с нужным пресетом, без промежуточного файла.

ps2pdf -dPDFSETTINGS=/ebook input.pdf output.pdf

Этот способ удобен, когда нужен короткий и понятный one-liner. Для более тонкого контроля над цветом, шрифтами и фильтрами изображений лучше использовать полноценный gs. У метода есть и ограничения: сложная прозрачность, слои, формы, JavaScript и мультимедийные аннотации могут вести себя не так, как в исходнике.

Способ 3: ImageMagick

ImageMagick полезен, когда PDF уже почти целиком состоит из изображений, а вы привыкли мыслить через DPI и JPEG-качество. В этом случае страницы можно растрировать с нужной плотностью и пересобрать в более компактный PDF. На Debian и Ubuntu есть отдельный нюанс: по умолчанию политика безопасности часто запрещает чтение и запись PDF, поэтому в policy.xml приходится менять права для PDF-coder с none на read|write. В ImageMagick 7 бинарник convert может быть заменён на magick convert.

convert -density 150 input.pdf -quality 85 output.pdf
convert -density 100 input.pdf -quality 60 output.pdf

-density 150 задаёт разрешение при растрировании страниц, а -quality 85 определяет JPEG-качество внутри итогового PDF. Чем ниже качество и плотность, тем меньше файл, но тем заметнее артефакты. Этот путь особенно удобен для image-only PDF, но для смешанных документов Ghostscript обычно предсказуемее и аккуратнее сохраняет текст и векторные элементы.

Способ 4: cpdf

cpdf нужен тогда, когда размер хочется уменьшить без изменения качества картинок. Он убирает лишние объекты, дублирующиеся потоки и избыточные метаданные, но не пересэмплирует изображения и не трогает их пиксели. Это коммерческий инструмент с бесплатной community edition; Linux-сборку можно взять из официального дерева бинарников и положить в PATH.

wget https://github.com/coherentgraphics/cpdf-binaries/raw/master/Linux-Intel-64bit/cpdf
chmod +x cpdf
sudo mv cpdf /usr/local/bin/
cpdf -version
cpdf -squeeze input.pdf -o output.pdf

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

Способ 5: графические инструменты

Тем, кто не хочет работать в терминале, подходят PDF Arranger и LibreOffice Draw. PDF Arranger удобен для объединения, разделения, поворота и перестановки страниц. После экспорта он часто убирает дубликаты, которые появились после неаккуратных операций с документом. Если нужно ещё сильнее уменьшить файл, итоговый PDF можно потом прогнать через Ghostscript.

sudo apt install pdfarranger
flatpak install flathub com.github.jeromerobert.pdfarranger
flatpak run com.github.jeromerobert.pdfarranger

В LibreOffice Draw PDF открывается как редактируемый документ. При экспорте как PDF можно снизить качество до 60–70%, включить JPEG-сжатие и, если это допустимо, не встраивать стандартные шрифты. Для типичных офисных документов это часто даёт сокращение размера на 30–60% без заметной потери качества при обычном масштабе просмотра. Для чистых сканов такой способ слабее, чем Ghostscript с /ebook.

Как сжать сканированный PDF

Для большинства сканов хорошая отправная точка всё тот же Ghostscript с /ebook. Этот пресет ориентирован примерно на 150 dpi и нормально подходит для чтения с экрана и обычной проверки документов. Если нужен минимальный размер, можно попробовать /screen, а если требуется точнее управлять результатом, задать DPI вручную или перевести страницы в градации серого.

gs \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS=/ebook \
  -dNOPAUSE \
  -dQUIET \
  -dBATCH \
  -sOutputFile=output_scanned.pdf \
  scanned_input.pdf

Если нужно жёстко зафиксировать разрешение на уровне 150 dpi, используйте -r150. Для чёрно-белых или почти чёрно-белых страниц можно добавить перевод в серый цвет, чтобы убрать цветовой оверхед. На таких документах это часто даёт ещё одно заметное уменьшение размера.

gs \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -r150 \
  -dNOPAUSE \
  -dQUIET \
  -dBATCH \
  -sOutputFile=output_150dpi.pdf \
  scanned_input.pdf
gs \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS=/ebook \
  -sColorConversionStrategy=Gray \
  -dProcessColorModel=/DeviceGray \
  -dNOPAUSE \
  -dQUIET \
  -dBATCH \
  -sOutputFile=output_gray.pdf \
  scanned_input.pdf

Пакетное сжатие нескольких PDF

Если файлов много, удобнее всего автоматизировать обработку через Bash-скрипт. Скрипт ниже проходит по всем PDF в текущей папке, сохраняет результат в отдельный каталог и выводит размер до и после. Это безопаснее, чем перезаписывать исходники на месте.

#!/bin/bash
# batch_compress_pdf.sh
# Compresses all PDF files in the current directory using Ghostscript.
# Usage: ./batch_compress_pdf.sh [output_directory]

PRESET="/ebook"
OUTPUT_DIR="${1:-./compressed}"

mkdir -p "$OUTPUT_DIR"

for input_file in ./*.pdf; do
    [ -f "$input_file" ] || continue

    filename="$(basename "$input_file")"
    output_file="$OUTPUT_DIR/$filename"
    original_size=$(du -sh "$input_file" | cut -f1)

    gs \
      -sDEVICE=pdfwrite \
      -dCompatibilityLevel=1.4 \
      -dPDFSETTINGS="$PRESET" \
      -dNOPAUSE \
      -dQUIET \
      -dBATCH \
      -sOutputFile="$output_file" \
      "$input_file"

    compressed_size=$(du -sh "$output_file" | cut -f1)
    echo "Compressed: $filename | Before: $original_size | After: $compressed_size"
done

echo "Done. Compressed files saved to $OUTPUT_DIR"
chmod +x batch_compress_pdf.sh
./batch_compress_pdf.sh
./batch_compress_pdf.sh /home/user/pdf_output

Какой способ выбрать

Если PDF текстовый или смешанный, почти всегда стоит начать с Ghostscript. Если нужен короткий вызов, подойдёт ps2pdf. Если файл почти целиком состоит из картинок, можно попробовать ImageMagick. Когда надо убрать только лишнюю структуру, не трогая изображения, лучше выбрать cpdf -squeeze. Для разовых действий на рабочем столе подойдут PDF Arranger и LibreOffice Draw.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Как создать нового пользователя в MySQL и выдать ему права

Подробное руководство по созданию пользователей в MySQL и управлению их правами доступа. В статье разобраны команды CREATE USER, GRANT, REVOKE, примеры настройки аутентификации и типичные ошибки при работе с правами.

Что можно автоматизировать с помощью Bash: реальные сценарии и примеры

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

Как работать с MongoDB Shell (mongosh)

Руководство по работе с оболочкой MongoDB Shell (mongosh). В статье разобраны подключение к серверу, базовые команды, вставка и просмотр данных, а также возможности автодополнения и встроенной справки.