Большие PDF-файлы медленно загружаются, упираются в лимиты почты и занимают лишнее место на сервере. В Linux есть несколько рабочих способов уменьшить их размер: от одной команды Ghostscript до графических утилит без терминала. Для большинства задач лучший старт это Ghostscript с пресетом /ebook.
С чего начать
Перед сжатием полезно понять, что именно раздувает файл. Сначала проверьте размер через du -sh, затем посмотрите сводку pdfinfo: количество страниц, размеры, версию PDF и признаки оптимизации. Если документ не оптимизирован и содержит много больших страниц, обычно помогает пересборка через Ghostscript. Если страниц немного, но файл всё равно тяжёлый, проблема чаще всего в картинках, шрифтах или метаданных.
pdfinfo input.pdfTitle: 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.pdfgs \
-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.pdfconvert -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 -versioncpdf -squeeze input.pdf -o output.pdfПотенциальная экономия здесь сильно зависит от того, чем именно раздут файл. Если в PDF много мусора после объединений, дублирующихся шрифтов и длинных метаданных, размер может заметно упасть. Если же документ состоит из сканов высокого разрешения и лишней структуры почти нет, эффект будет минимальным.
Способ 5: графические инструменты
Тем, кто не хочет работать в терминале, подходят PDF Arranger и LibreOffice Draw. PDF Arranger удобен для объединения, разделения, поворота и перестановки страниц. После экспорта он часто убирает дубликаты, которые появились после неаккуратных операций с документом. Если нужно ещё сильнее уменьшить файл, итоговый PDF можно потом прогнать через Ghostscript.
sudo apt install pdfarrangerflatpak 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.pdfgs \
-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.