Некоторые из наблюдаемых вами оптимизаций размера могут быть связаны с очисткой Ghostscript неиспользуемых объектов, недавно приобретенными улучшениями оптимизации шрифтов (вы используете самую последнюю версию GS?!?) И, возможно, повторной / понижающей дискретизацией изображений что могло случиться.
Ghostscript, если используется для PDF -> PDF преобразований, в основном работает так:
- Считайте во входном файле (ах) все его объекты и преобразуйте их во внутренний формат для графического представления страницы.
- Выполните манипуляции , запрошенные в командной строке для содержимого страницы во внутреннем формате.
- Выпишите совершенно новый PDF.
Это означает, что для большинства операций PDF -> PDF у вас будет различный порядок и нумерация для объектов PDF, и даже внутренний код объекта может измениться (даже если ваши глаза не обнаружат) любые различия между вводом и выводом PDF).
По умолчанию Ghostscript также сжимает любые потоки объектов, которые были распакованы в исходном файле (но это сжатие без потерь).
Теперь для вашей очень упрощенной командной строки , которая не содержит никаких пожеланий для манипуляций , Ghostscript предполагает , что вы хотите использовать -dPDFSETTINGS=/default
, устанавливает этот параметр неявно и работает соответственно.
Теперь Какие являются /default
PDFSETTINGS ?! У вас есть два варианта, чтобы узнать:
Прочтите руководство . Большая таблица в середине этого раздела дает обзор. Вы можете видеть, что этот -dPDFSETTINGS=/default
сам по себе является сокращением для нескольких десятков других более специфических настроек, которые он представляет. Ссылка на приведенную документацию предназначена для текущей HEAD кода разработки , и ваша фактически используемая версия может, конечно, отличаться .
Запрос (ваш собственный) 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 использовать как можно больше режима passthrough для входного 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).