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

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

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

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

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

Есть ли опция Ghostscript, чтобы просто скопировать страницы по мере их слияния без сжатия?

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

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

  • Query (ваш собственный) 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 о том, чтобы использовать как можно больший проходный режим, чем возможно, для ввода 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).