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