Подтвердить что ты не робот

Оптимизация файлов PDF (с помощью Ghostscript или других)

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

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

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

командная строка

exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
4b9b3361

Ответ 1

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

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

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

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

Если вы хотите попробовать, если Ghostscript сможет также "вставлять" используемые шрифты (иногда это работает, иногда нет - в зависимости от сложности встроенного шрифта, а также в используемом типе шрифта), вы можете попробовать добавить в команду 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

Примечание.. Помните, что разрешение изображения с понижающим дискретизатором, несомненно, уменьшит качество (необратимо), а шрифты с помехами затруднят или невозможны для отображения и печати 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

В последних версиях утилиты Poppler 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

Оптимизировать PDF, заменив дубликаты изображений ссылками

Теперь мы можем применить вышеупомянутую оптимизацию с помощью 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, который представил его в первый раз, по умолчанию не использовал его.)

Ответ 2

Вы можете получить хорошие результаты, перейдя из 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 может стать довольно большим, но результаты его заслуживают. Я перешел от 60 МБ PDF к 140 МБ Postscript файла, но в итоге получил оптимизированный PDF файл 1,1 МБ.

Ответ 3

Я использую Ghostscript со следующими параметрами, взятыми отсюда.

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

Ответ 4

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

Ответ 5

Вы потеряете в качестве, но если это не проблема, то convert ImageMagick может оказаться полезным:

convert original.pdf reduced.pdf

Обратите внимание, что это не всегда работает: однажды я с помощью этой команды преобразовал файл размером 126 МБ в файл размером 14 МБ, но в другой раз он удвоил размер файла 350 Ко.

В любом случае, стоит попробовать...

Как упоминалось в комментариях, конечно, нет смысла применять эту команду к векторному PDF, она будет полезна только для растровых изображений.

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

Ответ 6

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