Оптимизатор сжатия изображений PDF из командной строки

Это не обязательно должен быть CMD, но я бы предпочел его. При этом он должен быть бесплатным.

Я пробовал много разных, но все они, похоже, оптимизируют некоторые битовые данные в PDF-файлах и даже не касаются сжатия изображений, что мне и нужно, поскольку это основной виновник размера в моих PDF-файлах, созданных из Документов Google.

«Я пробовал много разных». Какие?

Ответы (1)

Я не уверен, что именно вы имеете в виду под «оптимизатором сжатия»:

  1. Вы можете оставить каждый отдельный объект PDF, который может иметь отношение к визуализируемым страницам, «как есть» и просто применить максимально возможное сжатие без потерь к потокам объектов, которые еще не сжаты или сжаты/закодированы с не-сжатием. настолько эффективный метод сжатия.

  2. Вы можете принять, помимо параметров, перечисленных в «1.», некоторые другие изменения в файле PDF:

    • Понижение разрешения изображения.
    • Подмножество шрифтов, которые полностью встроены.
    • Извлечение полностью встроенных шрифтов, если они относятся к шрифтам Base 14 PDF.
    • Преобразование цветов CMYK в цвета RGB.
    • Преобразование цветных изображений в изображения в градациях серого.
    • Удалите большую часть метаданных PDF.
    • Выбросьте неиспользуемые предметы.
    • Если окончательная версия документа PDF является результатом добавочных обновлений , уменьшите ее до этой окончательной версии (отбросив все предыдущие версии, «сохранившиеся внутри»).
    • Выбросьте любые потенциально встроенные профили ICC.

В этом может помочь достаточно сложная длинная командная строка Ghostscript. Он выполнит преобразование PDF в PDF:

gs                                         \
  -o smaller-downsampled+gray.pdf          \
  -sDEVICE=pdfwrite                        \
  -dCompressPages=true                     \
  -dCompressFonts=true                     \
  -dDownsampleColorImages=true             \
  -dDownsampleGrayImages=true              \
  -dDownsampleMonoImages=true              \
  -dColorImageResolution=72                \
  -dGrayImageResolution=72                 \
  -dMonoImageResolution=72                 \
  -dColorImageDownsampleThreshold=1.0      \
  -dGrayImageDownsampleThreshold=1.0       \
  -dMonoImageDownsampleThreshold=1.0       \
  -dProcessColorModel=/DeviceGray          \
  -dColorConversionStrategy=/Gray          \
  -dColorConversionStrategyForImages=/Gray \
  -dCompatibilityLevel=1.4                 \
  -dEmbedAllFonts=false                    \
  -c ".setpdfwrite <</AlwaysEmbed [ ] /NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats] /ColorImageFilter /DCTEncode /GrayImageFilter /DCTEncode /MonoImageFilter /CCITTFaxEncode /OutputICCProfile (None)>> setdistillerparams" \
  -f big.pdf

(Для Windows измените gsна gswin32c.exeили gswin64c.exeи измените все маркеры продолжения строки \на ^...) Приведенная выше команда изменит следующее:

  1. Преобразование всех изображений в цветовое пространство в оттенках серого.
  2. Отключите все шрифты Helvetica, Courier, Times, Symbol и ZapfDingbats («Base 14» для PDF).
  3. Уменьшите разрешение всех изображений до 72 PPI, если текущее разрешение соответствующего изображения выше 72 PPI.
  4. Если возможно, измените сжатие всех изображений на сжатие JPEG ( /DCTEncode).
  5. Выбросьте встроенные выходные профили ICC, если это возможно.

Обновление/исправление

В моей первоначальной команде примера была опечатка. Он содержал эти строки, которые неверны :

 -sProcessColorModel=/DeviceGray          \
 -sColorConversionStrategy=/Gray          \
 -sColorConversionStrategyForImages=/Gray \

Есть два разных способа правильно выразить эти параметры :

  1. Использование -d для этих параметров. /В этом случае для значений параметровдолжна быть косая черта

    -dProcessColorModel=/DeviceGray          \
    -dColorConversionStrategy=/Gray          \
    -dColorConversionStrategyForImages=/Gray \
    
  2. Использование -s для этих параметров. В этом случае косая черта/для значений параметров должна быть пропущена:

    -sProcessColorModel=DeviceGray          \
    -sColorConversionStrategy=Gray          \
    -sColorConversionStrategyForImages=Gray \
    

(Однако нет общего правила, которое можно было бы вывести из этого примера для всех параметров Ghostscript, оно применяется только к определенному подмножеству параметров, где -s...или -d...может использоваться альтернативно таким образом.)

Так что я понял это совершенно неправильно. Извините за путаницу, которую это вызвало!

В любом случае, модифицированная команда теперь работает для связанных ОП big.pdf. Это сбивает

  • исходный размер 2,5 МБ для 1-страничного PDF-файла, содержащего цветное изображение для
  • новый размер 53 кБ для PDF, содержащего изображение в градациях серого.

Данные для исходного изображения внутри big.pdf:

$ pdfimages -list big.pdf

  page num  type width height color comp bpc  enc interp objID x-ppi y-ppi size ratio
  -----------------------------------------------------------------------------------
     1   0 image  1600  1071  rgb     3   8  image  no     7 0   142   142 2502K  50%  

Данные для нового изображения внутри smaller-downsampled+gray.pdf:

$ pdfimages -list smaller-downsampled+gray.pdf

  page num  type width height color comp bpc  enc interp objID x-ppi y-ppi size ratio
  -----------------------------------------------------------------------------------
     1   0 image   800   535  gray    1   8  jpeg   no    12 0    71    71 48.5K  12%
Извините за невежество, но мне нужно немного объяснений, так как я никогда раньше не использовал ghostscript. Я скачал и поместил его в одну папку на диске, я также поместил pdf с именем grey.pdf в тот же каталог и сделал пакет, в котором я скопировал все вышеперечисленное, но изменил gs на gswin64.exe, и он показывает некоторые ошибки, поэтому Я удалил все "\", но все равно ничего.
@FateTrader: в файле Windows *.bat вам также нужно изменить окончания строк на ^. И, возможно, удалите пробелы в начале строк. (Я думал, что кто-то, явно запрашивающий инструмент командной строки, знает это.)
О, и "big.pdf", очевидно, является входным файлом , а файл small-downsampled+gray.pdf - выходным файлом.
Я изменил все «/» на «^» и удалил пробелы перед строками и между командами конца строки и «^», и все равно ничего. Смотрите скриншот oi60.tinypic.com/20r0l09.jpg
@FateTrader: я НЕ говорил о замене /- я говорил о замене \ в качестве маркеров продолжения строки! Я также НЕ рекламировал удаление пробелов в конце строк перед (новыми) ^знаками (должен оставаться хотя бы 1 пробел!).
Эх... @FateTrader : Кроме того, я не рекомендовал использоватьgswin64.exeдля Windows, но я рекомендовалgswin64c.exe(обратите внимание наcперед.exe?!?)
@FateTrader: вы должны предоставить (ссылку на) образец 'big.pdf' для тестирования...
Извините, я имел в виду «\», во всяком случае, я пробовал с «gswin64c.exe», и все равно не повезло. Я загрузил все файлы здесь mediafire.com/?37yjemt3eo28obq и использовал летучую мышь run2.bat.
@FateTrader: Плохо! Я сделал ошибку, записывая исходную команду. Смотрите мой исправленный ответ выше. Извините, что вызвал путаницу с этим.
Хм.. @KenS говорит, что просто нет *ColorConversionStrategyForImagesпереключателя ( 1 , 2 , 3 , 4 ). (И такой строки в коде нет.)