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


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

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

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

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

есть ли опция на Ghostscript, чтобы просто скопировать страницы, как они появляются при слиянии без какого-либо сжатия?

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

2   51   2011-11-17 00:59:28

2 ответа:

вот дополнительные опции что вы можете пройти при использовании 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

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

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

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

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

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

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

теперь что это /default PDFSETTINGS?! У вас есть два варианта узнать:

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

  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).