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


30

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

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

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

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


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

Я не хочу, чтобы это выглядело лучше, я хочу объединить без переработки. Это а) приведет к повышению качества (преобразования без потерь) и б) не приведет к потере часов процессорного времени при обработке моего документа на 1000 страниц.
Махмуд Аль-Кудси

1
Эй, вы не ответили на мой вопрос и не указали точную командную строку GS, которую вы используете. Это значит: вы не получите помощь в отношении GS, который вы ищете ...
Курт Пфайфл

Ответы:


44

Если вы просто хотите объединить два 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, он просто гарантирует, что внутренние номера объектов переставляются по мере необходимости и появляются в xrefструктуре PDF (которая в основном является своего рода PDF ToC для объекты).

Ghostscript:

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

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

Однако, как вы поняли, эта простая командная строка может испортить качество вашего изображения. Причина в том, что Ghostscript не 'dump' при обработке 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

,


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

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

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


3
(FYI) В моем случае, флаги dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagesпотому что выходной файл , чтобы стать намного более массивными. При их удалении размер файла изменился с 22 МБ до 3,1 МБ, и качество изображения выглядит точно так же, как при использовании этих флагов. Все уникальные флаги с I польза: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Дор

@Kurt Pfeifle Какие варианты разрешены -dColorImageFilter? Я могу только найти FlateEncodeи DCTEncode. DCT, кажется, делает JPEG (почему они это зашифровали?). Я думаю, что FLATE уже устарел для изображений, так как патент Bell Labs на LZW больше не является проблемой? Однако, потратив довольно много времени на поиск, я не могу найти, как использовать PNG (или что-то еще) ... Мои оригинальные изображения - PNG, и я хочу, чтобы они остались без изменений. Я попробовал опцию -c, но она дает мне -c can only be used in a built with POSTSCRIPT included....
Луи Сомерс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.