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