Ghostscript для объединения PDF-файлов сжимает результат - PullRequest
58 голосов
/ 17 ноября 2011

Я нашел эту аккуратную команду для объединения нескольких PDF в один, используя Ghostscript:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf

Полученный размер меньше, чем объединенный размер двух PDF-файлов.

Выполнение командыс одним файлом в качестве входных данных по-прежнему получается выходной файл меньшего размера.

Есть ли опция в Ghostscript, позволяющая просто копировать страницы по мере их появления при объединении без какого-либо сжатия?

Если нетВозможно ли, что сжатие Ghostscript будет настолько хорошим, что оно не приведет к снижению качества?

Ответы [ 2 ]

63 голосов
/ 17 ноября 2011

Вот некоторые дополнительные опции , которые вы можете передать при использовании pdfwrite в качестве устройства. Согласно этой странице, если вы ничего не передаете, то -dPDFSETTINGS устанавливается на что-то близкое к /screen, хотя и не становится более конкретным. Вы можете попробовать установить его на -dPDFSETTINGS=/prepress, что должно сжимать только значения выше 300 dpi.

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=out.pdf in1.pdf in2.pdf

Другая альтернатива - pdftk :

pdftk in1.pdf in2.pdf cat output out.pdf
31 голосов
/ 04 сентября 2012

Некоторые из наблюдаемых вами оптимизаций размера могут быть связаны с очисткой Ghostscript неиспользуемых объектов, недавно приобретенными улучшениями оптимизации шрифтов (вы используете самую последнюю версию GS?!?) И, возможно, повторной / понижающей дискретизацией изображений что могло случиться.

Ghostscript, если используется для PDF -> PDF преобразований, в основном работает так:

  1. Считайте во входном файле (ах) все его объекты и преобразуйте их во внутренний формат для графического представления страницы.
  2. Выполните манипуляции , запрошенные в командной строке для содержимого страницы во внутреннем формате.
  3. Выпишите совершенно новый PDF.

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

По умолчанию Ghostscript также сжимает любые потоки объектов, которые были распакованы в исходном файле (но это сжатие без потерь).

Теперь для вашей очень упрощенной командной строки , которая не содержит никаких пожеланий для манипуляций , Ghostscript предполагает , что вы хотите использовать -dPDFSETTINGS=/default, устанавливает этот параметр неявно и работает соответственно.

Теперь Какие являются /default PDFSETTINGS ?! У вас есть два варианта, чтобы узнать:

  1. Прочтите руководство . Большая таблица в середине этого раздела дает обзор. Вы можете видеть, что этот -dPDFSETTINGS=/default сам по себе является сокращением для нескольких десятков других более специфических настроек, которые он представляет. Ссылка на приведенную документацию предназначена для текущей HEAD кода разработки , и ваша фактически используемая версия может, конечно, отличаться .

  2. Запрос (ваш собственный) Ghostscript для подробного значения этого параметра. Мои ответы на вопрос 'Запрос Ghostscript для параметров / настроек по умолчанию для устройства вывода. .. ' и вопрос ' Что такое словари PostScript и как к ним можно получить доступ (через Ghostscript)? ' уточните немного подробнее об этом. Короче говоря, чтобы запросить Ghostscript для получения подробных сведений о /default PDFSETTINGS, выполните следующую команду:

     gs \
       -q \
       -dNODISPLAY \
       -c ".distillersettings /default get {exch ==only ( ) print ===} forall quit"
    

    Вы должны получить результат, очень похожий на этот:

      /Optimize false
      /DoThumbnails false
      /PreserveEPSInfo true
      /ColorConversionStrategy /LeaveColorUnchanged
      /DownsampleMonoImages false
      /EmbedAllFonts true
      /CannotEmbedFontPolicy /Warning
      /PreserveOPIComments true
      /GrayACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >>
      /DownsampleColorImages false
      /PreserveOverprintSettings true
      /CreateJobTicket false
      /AutoRotatePages /PageByPage
      /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 << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >>
      /DownsampleGrayImages false
      /UCRandBGInfo /Preserve
    

    Единственное, что выделяется из этих: вы можете изменить /AutoRotagePages с /PageByPage на /None. В командной строке вы должны поставить его как -dAutoRotatePages=/None.

    Чтобы дать вам полный список параметров, которые бы указывали Ghostscript использовать как можно больше режима passthrough для входного PDF, добавив следующие параметры:

      -dAntiAliasColorImage=false \
      -dAntiAliasGrayImage=false \
      -dAntiAliasMonoImage=false \
      -dAutoFilterColorImages=false \
      -dAutoFilterGrayImages=false \
      -dDownsampleColorImages=false \
      -dDownsampleGrayImages=false \
      -dDownsampleMonoImages=false \
      -dColorConversionStrategy=/LeaveColorUnchanged \
      -dConvertCMYKImagesToRGB=false \
      -dConvertImagesToIndexed=false \
      -dUCRandBGInfo=/Preserve \
      -dPreserveHalftoneInfo=true \
      -dPreserveOPIComments=true \
      -dPreserveOverprintSettings=true \
    

Так что вы можете попробовать эту команду:

gs                                              \
 -o output.pdf                                  \
 -sDEVICE=pdfwrite                              \
 -dAntiAliasColorImage=false                    \
 -dAntiAliasGrayImage=false                     \
 -dAntiAliasMonoImage=false                     \
 -dAutoFilterColorImages=false                  \
 -dAutoFilterGrayImages=false                   \
 -dDownsampleColorImages=false                  \
 -dDownsampleGrayImages=false                   \
 -dDownsampleMonoImages=false                   \
 -dColorConversionStrategy=/LeaveColorUnchanged \
 -dConvertCMYKImagesToRGB=false                 \
 -dConvertImagesToIndexed=false                 \
 -dUCRandBGInfo=/Preserve                       \
 -dPreserveHalftoneInfo=true                    \
 -dPreserveOPIComments=true                     \
 -dPreserveOverprintSettings=true               \
  input1.pdf                                    \
  input2.pdf

Наконец , как уже намекал Крис Хаас: вы также можете использовать pdftk, если вы специально не хотите никакой оптимизации , которую Ghostscript применяет по умолчанию. pdftk просто не может делать такие вещи, и вы сравнительно немного наберете скорость за его относительную глупость работы (но, возможно, также гораздо больший размер выходного файла, чем из Ghostscript).

...