Вопрос по ghostscript, linux, debian, pdf – Оптимизация файлов PDF (с помощью Ghostscript или других)

44

Является ли Ghostscript лучшим вариантом, если вы хотите оптимизировать PDF-файл и уменьшить его размер?

Мне нужно хранить много файлов PDF, и поэтому мне нужно максимально оптимизировать и уменьшить размер файла

У кого-нибудь есть опыт работы с Ghostscript и / или другим?

command line
<code>exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
</code>
У вас есть идея, какие объекты в ваших PDF-файлах занимают больше всего места? Шрифты? Привет разрешением изображения? Kurt Pfeifle
Вы ищете только бесплатное или бесплатное программное обеспечение? Или частная оплата также вариант? Kurt Pfeifle

Ваш Ответ

7   ответов
73

Ghostscript, безусловно, ваш лучший выбор. Тем не менее, его не всегда легко использовать - некоторые из его (очень мощных) вариантов обработки не так легко найти документированными.

Посмотрите на этот ответ, который объясняет, как выполнить более детальный контроль над уменьшением разрешения изображения, чем общий-dPDFSETTINGS=/screen делает (это определяет несколько общих значений по умолчанию, которые вы можете переопределить):

How to downsample images within pdf file?

В основном, он говорит вам, как заставить Ghostscript уменьшить частоту дискретизации всех изображений до разрешения 72 dpi (это значение-dPDFSETTINGS=/screen использует - вы можете пойти еще ниже):

-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \

Если вы хотите попробовать, может ли Ghostscript также «un-embed» apos; используемые шрифты (иногда это работает, иногда нет - в зависимости от сложности встроенного шрифта, а такжеon the font type used), вы можете попробовать добавить следующее в вашу команду gs:

gs \
  -o output.pdf \
   [...other options...] \
  -dEmbedAllFonts=false \
  -dSubsetFonts=true \
  -dConvertCMYKImagesToRGB=true \
  -dCompressFonts=true \
  -c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \
  -c ".setpdfwrite <</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 /Arial]>> setdistillerparams" \
  -f input.pdf

Note: Имейте в виду, что разрешение изображения с понижением дискретизации, несомненно, приведет к снижению качества (необратимо), а удаление шрифтов затруднит или сделает невозможным отображение и печать PDF-файлов, если на компьютере не установлены одинаковые шрифты ....

Update

Один вариант, который я упустил в своем первоначальном ответе, это добавить

-dDetectDuplicateImages=true

в командной строке. Этот параметр заставляет Ghostscript пытаться обнаружить любые изображения, которые встроены в PDF несколько раз. Это может произойти, если вы используете изображение в качестве логотипа или фона страницы, и если программное обеспечение для создания PDF не оптимизировано для этой ситуации. Раньше это было в случае со старыми версиями OpenOffice / LibreOffice (я протестировал последний выпуск LibreOffice, v4.3.5.2, и он больше не делает такие глупые вещи).

Это также происходит, если вы объединяете PDF-файлы с помощьюpdftk, Чтобы показать вам эффект и то, как вы можете его обнаружить, давайте посмотрим на пример файла PDF:

pdfinfo p1.pdf

 Producer:       libtiff / tiff2pdf - 20120922
 CreationDate:   Tue Jan  6 19:36:34 2015
 ModDate:        Tue Jan  6 19:36:34 2015
 Tagged:         no
 UserProperties: no
 Suspects:       no
 Form:           none
 JavaScript:     no
 Pages:          1
 Encrypted:      no
 Page size:      595 x 842 pts (A4)
 Page rot:       0
 File size:      20983 bytes
 Optimized:      no
 PDF version:    1.1

Последние версии Попплераpdfimages Утилита добавила поддержку для-list параметр, который может перечислить все изображения, включенные в файл PDF:

pdfimages -list p1.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image    423   600   rgb    3   8 jpeg     no     7  0    52    52 19.2K 2.6%

Этот образец PDF представляет собой одностраничный документ, содержащий изображение, сжатое с использованием JPEG-сжатия, шириной 423 пикселя и высотой 600 пикселей, которое визуализируется с разрешением 52 PPI на странице.

Если мы объединяем 3 копии этого файла с помощьюpdftk вот так:

pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf

тогда результат показывает эти свойства изображения черезpdfimages -list:

pdfimages -list p3.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no     4  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no     8  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    12  0    52    52 19.2K 2.6%

Это показывает, что есть 3 идентичных объекта PDF (с идентификаторами 4, 8 и 12), которые встроены вp3.pdf сейчас.p3.pdf состоит из 3 страниц:

pdfinfo p3.pdf | grep Pages:

 Pages:          3
Optimize PDF by replacing duplicate images with references

Теперь мы можем применить вышеупомянутую оптимизацию с помощью Ghostscript.

 gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf

Проверка:

 pdfimages -list p3-optim.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%

На каждой странице по-прежнему одно изображение, но идентификатор объекта PDF теперь всегда один и тот же: 10.

 ls -ltrh p1.pdf p3.pdf p3-optim.pdf

   [email protected] 1 kp  staff    20K Jan  6 19:36 p1.pdf
   -rw-r--r--  1 kp  staff    60K Jan  6 19:37 p3.pdf
   -rw-r--r--  1 kp  staff    16K Jan  6 19:40 p3-optim.pdf

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

Самые последние версии Ghostscript могут даже применять-dDetectDuplicateImages по умолчанию.(AFAIR, v9.02, which introduced it for the first time, didn't use it by default.)

спасибо за ответ :) проверили его, но когда вы установите dpi в72 вручную качество ниже при настройке/screen установлен, и размер файла все еще меньше с/screen :) clarkk
Для полноты, список параметров, которые можно использовать для преобразования PDF-файлов с помощью GhostScript / ps2pdf, доступен здесь:ghostscript.com/doc/current/Ps2pdf.htm
@clarkk: Мне было бы интересно посмотреть образец PDF, в котором показано, что это происходит. Можете ли вы предоставить его (или это нарушает чью-то конфиденциальность)?
Вотdynaccount.com/tmp/35.pdf и здесьdynaccount.com/tmp/36.pdf.. Посмотрите на логотип в верхней части документа .. 35.pdf (44,81 КБ - вручную dpi) и 36.pdf (44,73 КБ - / экран) clarkk
что я имел ввиду .. Качество как лучше с/screen и размер файла ниже по сравнению с настройкой dpi вручную72 clarkk
7

Вот.

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Обратите внимание, что, хотя этот обычно работает нормально, он не сможет правильно работать с заполняемыми PDF-файлами.
3

pdfopt а такжеps2pdf14, И то, и другое можно использовать для оптимизации файлов PDF, но в некоторых случаях размер «оптимизирован» файл может быть больше оригинала.

ps2pdf14 input.pdf output.pdf сделал так же, какgs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf, Для чистого текста содержимое файла ouput.pdf составляет 25% от размера файла input.file.
pdfopt больше не поставляется с ghostscript
pdfopt произвел больший выход
24

переведя из PDF в Postscript, а затем обратно в PDF, используя

pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf

Значение аргумента-dPDFSETTINGS определяет качество изображений в результирующем PDF. Возможны варианты от низкого до высокого качества:/screen, /default, /ebook, /printer, /prepress, увидетьhttp://milan.kupcevic.net/ghostscript-ps-pdf/ для справки.

Файл Postscript может стать довольно большим, но результаты того стоят. Я перешел с PDF-файла объемом 60 МБ в файл Postscript объемом 140 МБ, но в итоге получил оптимизированный PDF-файл объемом 1,1 МБ.

Любая причина, почему это приведет к меньшим файлам, чем просто использованиеgs с подходящими настройками? Кроме того, выполнение этого приведет к некоторым проблемам, вызванным отсутствием некоторых возможностей Postscript (например, альфа-прозрачность, градиенты, профили ICC).
Первый шаг не нужен. ps2pdf будет принимать входные файлы PDF.
Я не знаю, просто сообщаю о том, что хорошо сработало в моем случае, надеясь, что другие тоже могут извлечь из этого пользу. Не стесняйтесь опубликовать лучшее решение или помочь улучшить существующие.
Было бы здорово получить некоторую помощь, как это сделать в среде Windows ...
@frabjous Для меня преобразование в ps имеет огромное значение. Это с версией 9.26 из ps2pdf и pdf2ps
5

convert может оказаться полезным & # xA0 ;:

convert original.pdf reduced.pdf

(Я только что преобразовал файл размером 126 & # xA0; МБ в файл размером 14 & # xA0; МБ один & # x2026;)

Смотрите такжеэта почта для связанных вариантов.

@yms: Я думаю, вы, конечно, правы в отношении векторных PDF-файлов, но я считаю, что это имеет смысл для любого типа растровых изображений, из которых отсканированные изображения представляют собой лишь небольшую часть. В моем случае документ был сделан из простых цифровых фотографий.
Да, конечно, я имел в виду отсканированные изображения в качестве наиболее распространенного варианта использования файлов PDF, содержащих только растровые изображения (и, возможно, некоторый прозрачный текст из OCR) внутри. Я просто хотел добавить этот комментарий как замечание для тех, кто хочет использовать ваше решение.
Это имеет смысл только для файлов PDF, основанных на отсканированных изображениях, в противном случае ImageMagick преобразует ваш векторный PDF в растровое изображение, и результирующий файл может фактически быть больше оригинала.
5

pdftocairo (отPoppler) может создавать меньшие PDF-файлы, но имейте в виду, что некоторые функции (например, гиперссылки) будут удалены.

Спасибо, я обнаружил, что ps2pdf14 иногда меняет вывод, и в этом случае pdftocairo сделал PDF-файл меньше (от 500K до 110K), но обрезался, поэтому я добавил явное поле в Inkscape перед сохранением в PDF,then пробежалpdftocairo а такжеthen черезpdfcrop (от Te & # x3C7;) сжимая его до 90K.
2

Конвертируйте ваш PDF в PS (это создает большой файл

pdf2ps large.pdf very_large.ps

Преобразовать новый PS обратно в PDF

ps2pdf very_large.ps small.pdf

Источник: https://pandemoniumillusion.wordpress.com/2008/05/07/compress-a-pdf-with-pdftk/

Похожие вопросы