24

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

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

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

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

1 ответ1

39

Если вы просто хотите объединить два 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 изо всех сил пытается подражать всем этим ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .