Sign in

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

37076

Введение

VFS Global не принимает больше 5 МБ на пачку, выбранную за раз. Скан всех страниц паспорта в оригинальном качестве легко весит под сотню мегабайт, жать приходится в десятки раз.

26983

Чем жать

Инструменты равноценны по результату, выбирают по тому, что уже стоит на машине.

2489

macOS

Через Preview (Просмотр):

  1. Открыть PDF.
  2. File → Export.
  3. В выпадающем списке Quartz Filter выбрать Reduce File Size.
  4. Сохранить.

Иногда жмёт слишком сильно и текст размывает. Для большего контроля есть кастомные Quartz фильтры: в Интернете лежат готовые имя.qfilter файлы с разным уровнем качества (их кладут в ~/Library/Filters).

Через «Print to PDF»:

Встроенная в macOS печать в PDF с опцией «Reduce File Size» или пониженным разрешением (cmd+P → PDF → Save as PDF).

2490

Windows

Через PDF-XChange Editor (бесплатный в базовой версии):

  • Открыть PDF.
  • File → Save As Optimized.
  • Настроить качество изображений отдельно для каждой страницы. Пустые страницы паспорта можно жать жёстко, страницы со штампами мягче.

Через Adobe Acrobat (платный):

  • File → Save As → Reduced Size PDF.
  • Или File → Save As Other → Optimized PDF.

Через печать в Microsoft Print to PDF:

  • Ctrl+P → Microsoft Print to PDF.
2491

Командная строка (ghostscript)

Ghostscript жмёт быстро и предсказуемо. Доступен на macOS (brew install ghostscript), Linux (apt install ghostscript) и Windows.

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

Профили PDFSETTINGS по степени сжатия от сильного к слабому:

  • /screen: 72 dpi, самое сильное из четырёх, но мелкий текст может размылиться.
  • /ebook: 150 dpi, баланс размера и читаемости. Подходит для визовых документов.
  • /printer: 300 dpi.
  • /prepress: 300 dpi с сохранением цветов и шрифтов.
51066

Картинки, объявленные как 72 dpi, профили не трогают вовсе

Фотографии страниц, собранные в PDF, часто лежат внутри с объявленными 72 dpi при реальных полутора тысячах пикселей по ширине. Ghostscript считает такую картинку и так низкой и не пересчитывает её ни при каких настройках качества: /ebook и /screen на одном и том же скане дают файл одного размера с точностью до байта, голый -dColorImageResolution=50 отличается от них на десятую часть, и ни в одном из трёх случаев ширина в пикселях не меняется. Помогает порог пересчёта и цель ниже 72:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH \
   -dDownsampleColorImages=true -dColorImageDownsampleType=/Bicubic \
   -dColorImageResolution=50 -dColorImageDownsampleThreshold=1.0 \
   -dDownsampleGrayImages=true -dGrayImageDownsampleType=/Bicubic \
   -dGrayImageResolution=50 -dGrayImageDownsampleThreshold=1.0 \
   -dAutoFilterColorImages=false -dColorImageFilter=/DCTEncode -dJPEGQ=72 \
   -sOutputFile=out.pdf in.pdf

Итоговая ширина считается как исходная × цель ÷ объявленный ppi. Страница шириной 1711 пикселей при объявленных 72 ppi при цели 50 выходит 1189 пикселями, при цели 44 её же 1046.

Замер на 15-страничном скане паспорта, снятом телефоном: 92 МБ исходных превращаются в 7,6 МБ профилем /ebook, в 3,3 МБ при цели 50 и в 2,6 МБ при цели 44, причём номера виз, даты, MRZ и штампы остаются читаемыми. На другом файле цифры будут свои, порядок тот же.

Что внутри на самом деле, показывает pdfimages -list файл.pdf из пакета poppler (brew install poppler, apt install poppler-utils): колонки width, height и x-ppi сразу говорят, есть ли что понижать.

Если сжатый файл оказался нечитаемым, ход назад один: поднять цель (44 → 50 → 72) и грузить полученные файлы поодиночке.

2492

Онлайн

  • iLovePDF: популярный и бесплатный для одиночных файлов, выбор из трёх уровней сжатия.
  • Smallpdf: аналогично, в бесплатной версии лимит в два файла в день.
  • PDF24 Tools: без жёстких лимитов.

Caution

Через онлайн-сервисы не жалко жать паспорт, он и так идёт на консульский сервер. Но справки из банка с персональными номерами счетов лучше жать локально (Preview, PDF-XChange, ghostscript), чтобы не отдавать банковские данные стороннему сервису.

2493

Когда файл не жмётся

Цифровые подписи в PDF блокируют сжатие. Частый кейс: PDF-выписки от Райффайзена по ИП, которые приходят на почту. Файл весит 8-15 МБ и обычными сжимателями не уменьшается. Помогает пересборка файла заново: печать в новый PDF (cmd+P / Ctrl+P → сохранить как PDF) или прогон через ghostscript. Пересборка снимает подпись, после чего файл жмётся нормально: подписанная справка Райфа на 172 КБ после ghostscript весит 86 КБ, и ByteRange в ней не остаётся.

Разбить на несколько файлов. Паспорт легко разбивается пополам или по разворотам любым PDF-редактором, и в одну категорию их влезает сколько угодно. Но лимит VFS считается на пачку, выбранную за раз, поэтому разбиение спасает только вместе с загрузкой по одному файлу.

Сканы с телефона. Как источник встроенный сканер iPhone (Notes, Files) хорош и сам по себе сжимает: пересканировать на нём разумнее, чем бороться с готовыми сканами на 600 dpi. Но его PDF онлайн-сжиматели часто не берут, и такой файл проще пересохранить печатью в новый PDF.

26984

Когда портал не принимает файл, уже влезший в лимит

Это другая беда, не сжатие: файл может весить 80 КБ и всё равно отлетать. Сайт VFS иногда отказывается принимать текстовые PDF (страховки, банковские выписки). Формулировка вводит в заблуждение, потому что говорит про шифрование, которого в файле нет:

"The file … is having either password protection or encryption or having a security header which could be either potentially malicious or prevent further processing of the file. It is recommended to create valid file pdf with tools such as 'Microsoft Print to PDF'"

«Файл … защищён паролем, зашифрован либо содержит заголовок безопасности, который может быть вредоносным или помешать дальнейшей обработке. Рекомендуется создать корректный PDF средствами вроде Microsoft Print to PDF.»

Печать в PDF, которую советует сама ошибка, здесь помогает хуже, чем против плохого сжатия. На банковских уведомлениях Райффайзена она не сработала ни через Chrome, ни через ghostscript, хотя шифрования в файле не было и qpdf --show-encryption его не находил (единичный случай).

Сработала полная растеризация: страница рендерится в JPEG, и уже картинка собирается обратно в PDF. Внутри не остаётся ни текстового слоя, ни ссылок, ни полей формы:

gs -q -dNOPAUSE -dBATCH -sDEVICE=jpeg -r200 -dJPEGQ=88 \
   -sOutputFile=page-%02d.jpg in.pdf

Шаблон %02d в имени обязателен: без него каждая следующая страница молча перезаписывает предыдущую и на диске остаётся только последняя.

Альтернатива проще: VFS принимает JPG и PNG наравне с PDF, так что полученную картинку можно грузить без обратной сборки.

26985

Перед загрузкой открыть сжатый файл и прочитать

Текст должен читаться, печати и подписи быть видны. Слишком сильное сжатие делает документ нечитаемым, и офицер просто не учтёт такой файл.