Уменьшение размера файла PDF с помощью Ghostscript в Linux не сработало
у меня есть около 50-60 pdf-файлов (изображений) размером 1,5 МБ каждый. Теперь я не хочу, чтобы в моей диссертации были такие большие pdf-файлы, как загрузка, чтение и печать боли в спине. Поэтому я попытался использовать ghostscript для следующего:
gs
-dNOPAUSE -dBATCH
-sDEVICE=pdfwrite
-dCompatibilityLevel=1.4
-dPDFSETTINGS="/screen"
-sOutputFile=output.pdf
L_2lambda_max_1wl_E0_1_zg.pdf
однако теперь мой 1.4 MB pdf-это 1.5 MB большой.
что я сделал не так? Есть ли способ проверить разрешение файла pdf? Мне просто нужны изображения 300dpi, поэтому кто-нибудь предложит использовать convert
в измените разрешение или есть способ изменить разрешение изображения (уменьшить его) с помощью gs
, так как изображение очень зернистое, когда я использую convert
как я использую convert:
convert
-units PixelsPerInch
~/Desktop/L_2lambda_max_1wl_E0_1_zg.pdf
-density 600
~/Desktop/output.pdf
Пример Файла
http://dl.dropbox.com/u/13223318/L_2lambda_max_1wl_E0_1_zg.pdf
2 ответов
если вы запустите Ghostscript -dPDFSETTINGS=/screen
это просто ярлык. На самом деле вы получите (неявно) целую кучу используемых настроек, которые вы можете запросить со следующей командой:
gs \
-dNODISPLAY \
-c ".distillersettings {exch ==only ( ) print ===} forall quit" \
| grep '/screen'
на моем Ghostscript (v9.06prerelease) я получаю следующий вывод (слегка отредактированный для повышения читаемости):
/screen
<< /DoThumbnails false
/MonoImageResolution 300
/ColorImageDownsampleType /Average
/PreserveEPSInfo false
/ColorConversionStrategy /sRGB
/GrayImageDownsampleType /Average
/EmbedAllFonts true
/CannotEmbedFontPolicy /Warning
/PreserveOPIComments false
/GrayImageResolution 72
/GrayACSImageDict <<
/ColorTransform 1
/QFactor 0.76
/Blend 1
/HSamples [2 1 1 2]
/VSamples [2 1 1 2]
>>
/ColorImageResolution 72
/PreserveOverprintSettings false
/CreateJobTicket false
/AutoRotatePages /PageByPage
/MonoImageDownsampleType /Average
/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]
/ColorACSImageDict <<
/ColorTransform 1
/QFactor 0.76
/Blend 1
/HSamples [2 1 1 2]
/VSamples [2 1 1 2] >>
/CompatibilityLevel 1.3
/UCRandBGInfo /Remove
>>
мне интересно, являются ли ваши PDF-файлы тяжелыми для изображений, и если такое преобразование делает неприятные вещи (f.e. повторная выборка изображений с "неправильным" параметры), которые увеличивают размер файла...
если это так (image-heavy PDF), скажите так, и я обновлю этот ответ несколькими предложениями....
обновление
Я взглянул на файл образцов, предоставленный ДНК. Интересный...
нет, это не не содержат изображения.
вместо этого он содержит один большой поток (сжатый с помощью /FlateDecode
), который состоит примерно из 700.000+ (!!) операции, в основном операции с одним вектором на языке PDF, такие как:m
(moveto),l
(концы lineto),d
(setdash),w
(setlinewidth),S
(инсульт),s
(closepath и инсульта),W*
(eoclip),rg
и RG
(setrgbcolor)
и еще несколько.
(этот PDF-код очень неэффективно написан AFAICS (но выполняет свою работу), потому что он объединяет многие короткие штрихи вместо "длинных", и почти каждый штрих снова определяет цвет (даже если он такой же, как и раньше), и имеет все остальные накладные расходы (начальный ход, конечный ход,...).
Ghostscript -dPDFSETTINGS=/screen
нет любой эффект здесь (нет изображений для downsample, например). Увеличенный размер файла (+48 кбайт, если быть точным), вероятно, связан с Ghostscript, повторно организующим некоторые внутренние поглаживания и т. д. команды в другом порядке когда он интерпретирует файл.
таким образом, вы не так много можете сделать с размером файла PDF ...
- ...если вы не конвертируете каждую из этих страниц PDF в реальные изображения, такие как PNG:
gs \ -o out72.png \ -sDEVICE=pngalpha \ L_2lambda_max_1wl_E0_1_zg.pdf
(я использовал pngalpha
выход для получения прозрачного фона.) Размеры изображения ' out.png' are 259x213px
, размер файла теперь составляет 70 кбайт. Но я уверен, что вы не как качество : -)
качество вывода "плохое", потому что Ghostscript использует разрешение по умолчанию 72 dpi.
поскольку вы сказали, что хотели бы иметь 300dpi, команда становится такой:
gs \
-o out300.png \
-sDEVICE=pngalpha \
-r300 \
L_2lambda_max_1wl_E0_1_zg.pdf
размер файла теперь составляет 750 кбайт, размеры изображения 1080x889
пикселей.
обновление 2
С любопытство в моде в эти дни... :-) ...Я попытался уменьшить размер файла с помощью Adobe Acrobat X Pro на Mac.
вы хотите знать результаты?
выполняя Сохранить как... (PDF с уменьшенным размером)' -- что для меня в прошлом всегда давала очень хорошие результаты! -- создан 1,8++ MByte файл (+29%). Я думаю, это определенно ставит производительность Ghostscript (увеличение размера файла +3%) в реалистичную перспективу !
ДНК решил пойти на оттенки серого PNGs. Он создает их в два этапа:--11-->
-
Шаг 1: преобразование цветной страницы PDF (например,этой) на страницу PDF в оттенках серого, используя Ghostscript
pdfwrite
устройство и настройки-dColorConversionStrategy=/Gray
и-dProcessColorModel=/DeviceGray
. -
Шаг 2: преобразуйте страницу PDF в оттенках серого в PNG, используя Ghostscript
pngalpha
устройство с разрешением 300 dpi (-r300
в командной строке GS).
это уменьшает его начальный размер файла 1.4 MB до 0.7 MB.
но этот рабочий процесс имеет следующий недостаток:
- он теряет всю информацию о цвете, не экономя много места на диске по сравнению с цвета вывод, написанный с тем же разрешением, непосредственно из PDF!
есть 2 альтернативы ДНК рабочий процесс:
-
одношаговое преобразование (цвет) PDF - > (цвет) PNG, используя Ghostscript
pngalpha
устройство с оригинальным PDF в качестве ввода (те же настройки разрешения 300 dpi). Это имело бы такое преимущество:- он сохранит информацию о цвете в выводе PNG, требуя только немного больше места на диске!
-
одношаговое преобразование (цвет) PDF - > оттенки серого PNG, используя устройство с оригинальным PDF в качестве ввода (те же настройки разрешения 300 dpi), с этим сочетанием преимуществ / недостатков:
- это потеряет информацию о цвете в выводе PNG.
- это потеряет прозрачный фон, который был сохранен в рабочем процессе ДНК.
- это спасет много дискового пространства, потому что размер файла снизится примерно до 20% вывод из рабочего процесса ДНК.
таким образом, вы можете принять решение и увидеть выходные размеры и качество бок о бок, вот сценарий оболочки, чтобы продемонстрировать различия:
#!/bin/bash # # Copywrite (c) 2012 <kurt.pfeifle@gmail.com> # License: Creative Commons (CC BY-SA 3.0) function echo_do() { echo echo "Command: ${*}" echo "--------" echo "${@}" } [ -d out ] || mkdir out echo echo " We assume all PDF pages are 1-page PDFs!" echo " (otherwise we'd have to include something like '%03d'" echo " into the output filenames in order to get paged output)" echo echo ' # Convert Color PDF to Grayscale PDF. # If PDF has transparent background (most do), # this will remain transparent in output.) # ATTENTION: since we don't use a resolution, # pdfwrite will use its default value of '-r720'. # (However, this setting will only affect raster objects...) ' for i in *.pdf do echo_do gs \ -o "out/${i}---pdfwrite-devicegray-gs.pdf" \ -sDEVICE=pdfwrite \ -dColorConversionStrategy=/Gray \ -dProcessColorModel=/DeviceGray \ -dCompatibilityLevel=1.4 \ "${i}" done echo ' # Convert (previously generated) grayscale PDF to PNG using Alpha channel # (Alpha channel can make backgrounds transparent) ' for i in out/*pdfwrite-devicegray*.pdf do echo_do gs \ -o "out/$(basename "${i}")---pngalpha-from-pdfwrite-devicegray-gs.png" \ -sDEVICE=pngalpha \ -r300 \ "${i}" done echo ' # Convert (color) PDF to grayscale PNG using Alpha channel # (Alpha channel can make backgrounds transparent) ' for i in *.pdf do # Following only required for 'pdfwrite' output device, not for 'pngalpha'! # -dProcessColorModel=/DeviceGray echo_do gs \ -o "out/${i}---pngalphagray_gs.png" \ -sDEVICE=pngalpha \ -dColorConversionStrategy=/Gray \ -r300 \ "${i}" done echo ' # Convert (color) PDF to (color) PNG using Alpha channel # (Alpha channel can make backgrounds transparent) ' for i in *.pdf do echo_do gs \ -o "out/${i}---pngalphacolor_gs.png" \ -sDEVICE=pngalpha \ -r300 \ "${i}" done echo ' # Convert (color) PDF to grayscale PNG # (no Alpha channel here, therefor [mostly] white backgrounds) ' for i in *.pdf do echo_do gs \ -o "out/${i}---pnggray_gs.png" \ -sDEVICE=pnggray \ -r300 \ "${i}" done echo " All output to be found in ./out/ ..." echo
запустите этот скрипт и сравните различные выходы бок о бок.
да, "direct-grayscale-PNG-from-color-PDF-using-pnggray-device" может выглядеть немного хуже (и это не спорт прозрачный фон), чем другой-это всего 20% от ее размера. С другой стороны, если вы хотите купить немного больше качества, пожертвовав немного места на диске-вы можете использовать -r400
вместо -r300
...