Используйте Ghostscript, но скажите, чтобы он не обрабатывал изображения?

У меня есть PDF-файл, в котором уже есть сжатые изображения с некоторыми артефактами, и я использую Ghostscript, чтобы добавить титульный лист к этому PDF-документу.

Тем не менее, я не могу найти способ сказать GS просто использовать существующие изображения как есть, без их повторной обработки, и теперь я чувствую, что это как-то связано с тем, как работает GS, то есть вы не можете перекомпилировать / связать PDF без обработки его изображений.. Это правда?

Я могу увеличить настройку DPI в GS, но она увеличится с 5 МБ до 60 МБ, но выглядит все еще хуже.

Есть ли лучшая альтернатива GS, которая будет делать то, что мне нужно (желательно, которая будет компилироваться на OS X)?

1 ответ

Решение

Если вы просто хотите объединить два файла PDF без какой-либо обработки его содержимого, pdftk для вас. (В Mac OS X это должно быть доступно через MacPorts или Fink, для Linux есть встроенные пакеты для всех основных дистрибутивов; для Windows посмотрите здесь.) Попробуйте это:

 pdftk title.pdf content.pdf cat output book.pdf

Это добавит title.pdf к content.pdf и запишет результат в book.pdf.

pdftk это "тупой", но очень быстрый способ объединения двух (или более) файлов PDF. "Тупой" в той степени, в которой pdftk никоим образом не интерпретирует поток данных PDF, он просто обеспечивает повторную перестановку внутренних номеров объектов и отображение их в PDF xref структура (которая в основном является своего рода PDF ToC для объектов).

Ghostscript:

Если вы хотите использовать Ghostscript, основная команда для объединения этих двух файлов:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

Однако, как вы поняли, эта простая командная строка может испортить качество вашего изображения. Причина в том, что Ghostscript не является "дампом" при обработке PDF-файлов: он полностью интерпретирует их при чтении и создает совершенно новый файл при записи результата. Для создания результата он будет автоматически использовать настройки по умолчанию для большого количества деталей в общей обработке. Эти значения по умолчанию будут применяться во всех случаях, когда его вызовы не указывали Ghostscript иначе.

Таким образом, метод Ghostscript для создания нового book.pdf гораздо более "умный" (но и гораздо более медленный), чем pdftk метод. (Это также причина, по которой Ghostscript во многих случаях способен - в пределах ограничений - "восстанавливать" b0rken-файлы PDF или встраивать шрифты в выходные PDF-файлы, которые не встроены во входные PDF-файлы, или удалять дублированные изображения, заменяя их просто ссылками и т. д. - и в целом создавал более мелкие, лучше оптимизированные файлы из раздутых входных PDF-файлов...)

Решение состоит в том, чтобы не позволить Ghostscript использовать его значения по умолчанию: добавляя дополнительные пользовательские параметры в командную строку.

Что значит "Ghostscript" интерпретирует "ввод PDF"?

Весь файл и его содержимое (объекты, потоки, шрифты, изображения и т. Д.) Считываются, проверяются и хранятся в своем собственном внутреннем представлении, прежде чем снова выплеснуть полученный PDF с его объектами PDF. Однако при "выплевывании" Ghostscript будет применять все свои внутренние настройки по умолчанию для сотен доступных параметров [*].

К сожалению, это вызывает вашу "повторную обработку" изображений в соответствии с этими настройками по умолчанию, чего можно избежать или переопределить, только добавив свои собственные (желательные) параметры командной строки.

Проблемы с изображениями могут быть вызваны необходимостью Ghostscript (из-за проблем с лицензированием) перекодировать изображения JPEG2000 в кодировку JPEG. Если вы хотите избежать этого, добавьте следующее в вашу командную строку:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

Другие связанные с изображением параметры командной строки, которые следует учитывать для включения:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

Итак, полная командная строка Ghostscript, которая может вас порадовать, должна выглядеть так:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

Вы также можете указать Ghostscript NOT сжимать изображения в выходном PDF-файле, используя следующую командную строку:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

,


[*]:
Если вам интересно узнать полный список настроек по умолчанию, которые использует устройство Ghostscript pdfwrite, выполните следующую команду. Возвращает вам полный список:

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

Чтобы получить объяснения о том, что именно означают все эти параметры, вам нужно прочитать в документации Adobe "Параметры дистиллятора". Ghostscript изо всех сил пытается подражать всем этим...

Другие вопросы по тегам