Уменьшение размера файла 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. Шаг 1: преобразование цветной страницы PDF (например,этой) на страницу PDF в оттенках серого, используя Ghostscript pdfwrite устройство и настройки
    -dColorConversionStrategy=/Gray и
    -dProcessColorModel=/DeviceGray.
  2. Шаг 2: преобразуйте страницу PDF в оттенках серого в PNG, используя Ghostscript pngalpha устройство с разрешением 300 dpi (-r300 в командной строке GS).

это уменьшает его начальный размер файла 1.4 MB до 0.7 MB.

но этот рабочий процесс имеет следующий недостаток:

  • он теряет всю информацию о цвете, не экономя много места на диске по сравнению с цвета вывод, написанный с тем же разрешением, непосредственно из PDF!

есть 2 альтернативы ДНК рабочий процесс:

  1. одношаговое преобразование (цвет) PDF - > (цвет) PNG, используя Ghostscript pngalpha устройство с оригинальным PDF в качестве ввода (те же настройки разрешения 300 dpi). Это имело бы такое преимущество:

    • он сохранит информацию о цвете в выводе PNG, требуя только немного больше места на диске!
  2. одношаговое преобразование (цвет) 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...