Сжатие PDF после манипуляции - PullRequest
0 голосов
/ 25 апреля 2018

У меня следующая проблема:

Я получаю различные отсканированные файлы PDF с устройства сканера Kyocera.

Я должен автоматически манипулировать этими PDF-файлами, чтобы:

  1. Удалить цвета из текстовых маркеров
  2. Преобразование PDF в оттенки серого
  3. Поместите это в нашу DMS

Я использую Bash-Script для выполнения этой работы.

Для удаления цветов текстового маркера и преобразования в оттенки серого я использую imagemagick:

convert -density 150 INPUT.pdf \
-channel rgba \
-alpha set \
-fuzz 15% \
-fill white \
-opaque 'rgb(255,200,195)' \
-opaque 'rgb(255,253,177)' \
-opaque 'rgb(255,155,240)' \
-opaque 'rgb(255,91,193)' \
-colorspace gray OUTPUT-convert.pdf

Полученное изображение довольно хорошее, НО размер PDF огромен:

Оригинал: 365K Преобразовано: 1.358K

Итак, я нашел команду ghostscript, которая выполняет работу и уменьшает размер файла:

gs -dSAFER -dBATCH -dNOPAUSE -dNOCACHE -dCompatibilityLevel=1.4 \
-sDEVICE=pdfwrite   \
-sColorConversionStrategy=/LeaveColorUnchanged \
-dPDFSETTINGS=/ebook \
-sOutputFile=OUTPUT-ghostscript.pdf OUTPUT-convert.pdf

Теперь размеры файлов:

Оригинал: 365K Преобразовано: 1.358K (OUTPUT-convert.pdf) Ghostscript: 500K (OUTPUT-ghostscript.pdf)

Я не могу понять, почему размер PDF после манипуляции, от цвета до оттенков серого, превышает исходный документ. Плотность (150 dpi) - это разрешение исходного документа.

Когда я помещаю преобразованный PDF (1.358K) через Adobe Acrobat в Windows и воссоздаю PDF, размер составляет 213K. У меня нет потери качества. Как я могу добиться этого под Linux с помощью bash-скрипта?

Любая помощь приветствуется!

Вот ссылка, например, на PDF-файлы:

http://62.75.158.162/download/yKLu3fkbLy7MgkczDrKdG6osHdXh3jvy/

1 Ответ

0 голосов
/ 25 апреля 2018

На самом деле невозможно очень много комментировать, не видя файла примера, чтобы точно определить, что произошло на каждом этапе.

Однако я очень сильно подозреваю, что вы потеряли 'качество », это просто, что при разрешении экрана, вы не можете сказать.Ваш оригинальный файл PDF был создан с использованием ImageMagick с разрешением 150 точек на дюйм.Скорее всего, изображение хранится без сжатия в файле PDF, поэтому оно имеет большой размер.

Когда вы запускаете этот файл PDF обратно через Ghostscript, возникает два эффекта.Во-первых, вы использовали стандартный набор настроек PDFSETTINGS.Это (среди многих других) приводит к уменьшению количества серых изображений до разрешения 150 точек на дюйм (к счастью для вас, безрезультатно).Он также сжимает данные изображения, используя сжатие JPEG.

Теперь я понятия не имею, что находится в исходном файле PDF, но если данные были сжаты с использованием JPEG, как кажется вероятным, то вы применяете двойное квантование JPEG.,Это процесс с потерями и приведет к потере качества.

Поскольку вы изменяете исходные данные изображения (для изменения цвета), у вас нет выбора по распаковке данных изображения.Однако для сохранения качества не следует использовать сжатие JPEG снова, вместо этого следует использовать сжатие Flate.Коэффициент сжатия не будет таким хорошим, но он сохранит качество без изменений.Чтобы сделать это, вам нужно указать GrayImageFilter с использованием дистиллятора, вы не можете использовать PDFSETTINGS для этого.

Я не могу представить, что Acrobat сделал, чтобы еще больше уменьшить размер файла (и у вас нетЯ сказал, что вы «воссоздаете файл PDF»), но я думаю, что это приведет к еще большему снижению качества изображения.Трудно понять, как можно сэкономить 50% размера файла без этого.Также возможно, что (подобно Ghostscript) JPEG сжимает данные в градациях серого, но использует более агрессивный набор параметров JPEG (что, конечно, приводит к еще большей потере качества).

Если вы опубликовали примеры оригинала,Вывод Ghostscript и вывод Acrobat Я мог бы рассказать вам больше, но не из этого.

Для чего стоит, в Ghostscript есть новая функция (требуется версия 9.23 или выше), которая позволяет вам создаватьPDF-файл, который состоит только из изображения, и выберите цветовую модель.Вы можете запустить исходный PDF-файл через Ghostscript, используя что-то вроде:

gs -sDEVICE = pdfimage8 -r150 -sOutputFile = gs.pdf

, что приведет к довольно минимальному PDF-файлу, в котором исходный вводбыло преобразовано в изображение в оттенках серого (с разрешением 150 точек на дюйм), и это изображение было упаковано в файл PDF.Я понятия не имею, может ли это работать лучше для вас.

Позже РЕДАКТИРОВАТЬ

Да, это в значительной степени то, что я ожидал.

Исходный файл имеет то, что, кажется,отмеченные артефакты сжатия JPEG (все прямоугольные «спеклы» вокруг текста).Очевидно, что, не видя оригинального документа, я не могу сказать, связано ли это с тем, что исходный документ был напечатан в формате JPEG на бумаге, или артефакты были введены сканером, или (что более вероятно) каким-либо приложением конвертировало отсканированное изображение в PDF.Проверяя изображение, сохраненное в файле PDF, я вижу, что это действительно изображение JPEG.

Тем не менее, исходное изображение (на мой взгляд) действительно очень шумное.

Теперь вывод из 'convert 'возможно немного лучше (с точки зрения разборчивости), чем оригинал.Я предполагаю, что это «что-то» связано с вашей командной строкой преобразования, не могу быть уверен.Изображение в этом случае , а не в формате JPEG, оно сжато с кодировкой RunLength, которая, конечно, без потерь.Он также менее эффективен в качестве метода сжатия, поэтому изображение больше.По причинам, наиболее известным для ImageMagick, он также применяет мягкую маску к данным изображения.Так что теперь на одной странице два изображения, а не просто 1. Не удивительно, что он больше оригинала!

Я подозреваю, что мягкая маска связана с вашей командной строкой, включая RGBA.Я предполагаю, что он создает альфа-канал, а PDF не поддерживает простое смешивание альфа-каналов, его собственная модель прозрачности намного более изощренна.Так что я подозреваю, что вы на самом деле делаете выходной файл больше, чем нужно.Боюсь, я не могу помочь вам с ImageMagick, я ничего об этом не знаю, но избавиться от этого второго изображения очень поможет.

Обратите внимание, что и ваш исходный файл, и выводиз ImageMagick, по сути, несжатые (с точки зрения «структуры» файла PDF).

Затем мы подошли к PDF-файлу Ghostscript.«Структура» PDF-файла сама сжимается, что дает небольшие преимущества.Все изображения сжаты в формате JPEG, что обеспечивает дополнительное сжатие, но за счет качества.Применение квантования JPEG несколько раз всегда стоит качества.Просто сравнивая выходные данные 'convert' с выходными данными Ghostscript, я могу легко увидеть ухудшение качества.

Теперь мы подошли к выводу Acrobat.Сравнивая его с другими файлами, он показывает худшее качество.На изображении очень хорошо видны артефакты JPEG.В этом случае и изображение, и мягкая маска были сжаты с помощью схемы сжатия JPEG2000, которая является «лучшим» сжатием, чем JPEG.Тем не менее, похоже, что применение его к данным, которые уже были квантованы для JPEG, дает довольно плохие результаты.Или, по крайней мере, применение его к изображению JPEG с мягкой маской приводит к: -)

Основная проблема с JPEG2000 заключается в том, что оно обременено патентом.Хотя декодеры могут быть написаны без лицензионных отчислений, для написания кодировщика вы должны лицензировать запатентованную технологию от (многих) патентовладельцев, что является дорогостоящим процессом.

Таким образом, версия AGPL Ghostscript не включает декодер JPEG2000,и поэтому не может записывать изображения JPEG2000.

Очевидно, что вы можете использовать копию Acrobat для перезаписи вашего PDF-файла со сжатием JPEG2000, как вы это сделали здесь.

Предполагая, что вы хотите избежать этого,тогда я бы хотел выяснить, почему конвертер создает изображение с примененной мягкой маской.Я сильно подозреваю, что это связано с использованием rgba вместо rgb.

Избегание создания второго (мягкая маска) изображения может (я полагаю) значительно уменьшить размер файла PDF, созданного с помощью команды "convert",Вы можете получить хоть какое-то дополнительное преимущество без потери качества, запустив его через устройство pdfwrite Ghostscript и указав / FlateEncode для GrayImageFilter.Это приведет к созданию файла PDF, в котором мебель PDF сжимается и где к данным изображения применяется лучшая схема сжатия.

Вы также можете просто оставить строку Ghostscript такой, какая она есть, ухудшения качества может быть достаточнодля вас, чтобы жить с.

...