LINUX.ORG.RU

Разделить/Найти ч/б страницы и цветные с учётом цвет. пространства GhostScript

 ,


0

1

Приветствую знатоков, нужна ваша помощь.

Есть задача. Пользователь заливает .pdf файл на сайт для обработки на бек-енде нужно разделить файл на ч/б и цветные страницы для печати одной порции страниц на ч/б принтер и, цветные - на цветной. Для начала, хотя бы, точно определить и отобразить пользователю (текстом), кол-во ч/б и цветных страниц и, номера страниц.

Я чуть чуть погуглил и где-то в интернете один из пользователей запостил что-то типа

Monochrome (Black and White) pages:

gswin64c -q -o - -sDEVICE=inkcov DOCUMENT.pdf | grep «^ 0.00000 >0.00000 0.00000» | find /c /v ""

Color pages:

gswin64c -q -o - -sDEVICE=inkcov DOCUMENT.pdf | grep -v «^ >0.00000 0.00000 0.00000» | find /c /v ""

У меня пока отсутствует опыт работы с Ghostscript. Однако, эти команды не учитывают многих особенностей.

Когда пользователь работает с Word(овскими) документами и сохраняет его к PDF, все страницы, с обычным текстом, идут в RGB пространстве со значениями 0/0/0. Если отконвертировать их в CMYK пространство то, чёрный превращается в комбинированный. Дизайнеры ещё называют глубокий чёрный. Поэтому, когда запускаешь первую команду (определить чёрно-белый) - они все считаются цветными.

Тут, было бы правильным, отнести диапазон значений, в который отнести не только значения CMYK 0/0/0/0, но и серый и глубокий чёрный.

С другой стороны, я даже не представляю себе, а как ghostscript будет определять страницу, если будет чёрный цвет текста и одно слово, скажем, синим. Или будет цветная картинка.

нашёл для Node.JS уже модуль, думаю, буду работать через него. https://www.npmjs.com/package/ghostscript4js

Разделять собираюсь, наверное, при помощи pdftk.exe.

Спасибо большое за любую информацию.

По-моему полной автоматизации здесь не получится - обязательно какая-то гадость да вылезет. У всех типографий, принимающих pdf на печать, есть документ с техническими требованиями к pdf - CMYK, максимально допустимая сумма процентных значений по всем каналам, шрифт в кривых, текст только в Key-color (ключевой цвет - черный). Проще уговорить по-хорошему клиента делать pdf в соответствии с ними.

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

fox72
()

мне кажется тут нужно строить гистограмму и по ней уже определять чб-страницы, с допустимым отклонением. но гистограмма, понятно, должна быть какого-то конкретного пространства, чтобы можно было сравнивать. удобно будет сравнивать цвета в модели hsl, например, смотреть в ней отклонения s-канала от заданного значения.

в имеджмаджике такое, наверное, можно провернуть, он точно умеет конвертить в разные модели и может выводить гистограмму в текстовом виде в stdout.

конвертировать каждую страницу, конечно, накладно, но это зато самый надёжный способ. чтобы отделить grayscale-страницы от rgb или cmyk или ещё чего, можно воспользоваться тулзой identify из того же имеджмаджика.

очень примерно будет что-то типа этого:

export FILE=file.pdf

identify -format '%p %r\n' "$FILE" | while read PAGE CLASS SPACE; do
    if [[ $SPACE =~ Gray ]]; then
        continue
    fi
    convert "$FILE"[$PAGE] -density 200 -colorspace hsl -channel S -separate -format %c histogram:info: \
        | ./my_histogram_parser.py && echo "Page $PAGE is grayscate within 1% tolerance"
    #...
done

фиг знает из какого и в какое тут пространство он конввертирует, наверное всё в пределах srgb. возможно тебе этого хватит, а если нет, то имеджмаджик в принципе умеет в цветовые профили, но мне сейчас уже неохота с этим заморачиваться.

учти, имеджмаджик, когда конвертит pdf в картинки или из картинок собирает pdf, не освобождает память после каждой страницы, а держит всё в памяти до последнего, из-за чего на файлах с большим количеством страниц бывает приходит oomk.

если напишешь на magickwand, то можешь более экономно работать с памятью и от скриптоты можно будет избавиться.

а для ноды наверняка есть биндинг к im или какому-то его форку.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.