Измерение покрытия чернилами в файле PDF

Есть ли инструмент (бесплатное программное обеспечение для Linux), который позволяет мне рассчитать количество черного в файле PDF? Например, измеряется в мм² или в какой-либо другой подходящей единице измерения?

Ответы (2)

В последних версиях Ghostscript доступно новое устройство inkcov, которое может подсчитывать количество пикселей для каждого из цветовых каналов в пространстве CMYK. (Если в PDF-файле используется RGB, сообщаемые значения цвета пересчитываются в соответствующие значения CMYK — утилита не может напрямую работать в RGB.)

Пример:

$> gs -o -  -sDEVICE=inkcov sample.pdf

Processing pages 1 through 7.
Page 1
 0.00000  0.00000  0.00000  0.02231 CMYK OK
Page 2
 0.02363  0.02363  0.02363  0.02363 CMYK OK
Page 3
 0.02527  0.02527  0.02527  0.00000 CMYK OK
Page 4
 0.03322  0.03322  0.03322  0.03322 CMYK OK
Page 5
 0.00000  0.00000  0.00000  0.03413 CMYK OK
Page 6
 0.00000  0.00000  0.00000  0.01984 CMYK OK
Page 7
 0.13274  0.13274  0.13274  0.03355 CMYK OK

Значения представляют собой целые числа в диапазоне от 0..1, где значение 1 представляет собой 100% покрытие чернилами (для всех пикселей на странице). Следовательно, приведенный выше результат означает:

  1. Страница 1 не использует голубой, пурпурный или желтый цвет. Используемый ЧЕРНЫЙ цвет покрывает 2,231 % площади страницы.
  2. Страница 2 использует C, M, Y и K в абсолютно одинаковой мере: соответствующий охват составляет 2,363% страницы каждый. (Возможно, это «насыщенно-серый» цвет, смешанный с одинаковым количеством красок в каждом канале.)
  3. Страница 3 не использует черный цвет, но использует цветовые каналы C, M и Y для 2,527% площади страницы каждый. (Возможно, для смеси "не черный серый"...)
  4. Страница 4 снова имеет одинаковое покрытие страницы 3,332% для каждого из цветовых каналов.
  5. На страницах 5 и 6 используются только ЧЕРНЫЕ чернила.
  6. Страница 7 теперь вы можете понять сами....
Выглядит хорошо до сих пор. Есть ли где-нибудь документация по этому inkcovустройству?
По-английски: только то, что я написал здесь (или то, что другие скопировали из моих ответов. По-немецки: поищите на веб- сайте GUUG членский журнал Uptimes. В весеннем выпуске 2013 года есть моя более длинная статья...
Спасибо. Я делаю вывод, что inkcovне имеет параметров конфигурации? (Я не ищу ничего конкретного, мне просто любопытно.)
@JoachimBreitner: Если вы (а) немного знаете PostScript, (б) прочитали и поняли этот мой ответ , то вы могли бы (в) сделать вывод, что такая команда gs -o - -sDEVICE=inkcov -c "currentpagedevice {exch ==only ( ) print === } forall"может рассказать вам все о потенциальных переключателях командной строки, которые вы могли бы использовать с устройство inkcov. Возможные параметры для настройки в моем следующем комментарии:
... потенциальные настройки могут быть -dDeviceGrayToK=true|false, -dUseCIEColor=true|falseа -sICCOutputColors=/path/to/colorprofile.iccзатем еще некоторые. Но если вы не знаете, что делаете, лучше не трогайте его для серьезных результатов!
Я думаю, одна вещь, которую я хотел бы сделать, это получить результат в какой-то абсолютной единице площади, чтобы мне не приходилось вручную учитывать размер страницы (или даже размеры страницы, если они различаются!) во внимание при интерпретации результаты, достижения.
@JoachimBreitner: «Вещь, которую я хотел бы сделать» ?!? Планируете ли вы отправить патч ребятам из Ghostscript?
Нет. Я имел в виду «функцию, которую я хотел бы использовать».
Очень полезная команда! Мне было интересно, почему мой тонер закончился после 1000 страниц, а не 2000, во время более крупного задания на печать. Оказывается, номинальная доходность страницы рассчитана для 5% покрытия, но в моем документе было около 10%. Все с простой gsкомандой! (Подсказка: вы можете использовать awkдля извлечения полей или электронную таблицу для расчета средних значений.)

РЕДАКТИРОВАТЬ: 1. Существующий инструмент

Поискав в Интернете, я нашел инструмент, который работает точно так же, а также поддерживает множество форматов (doc, odt, ps, png, pdf и т. д.). Он называется pkpgcounterи доступен во многих дистрибутивах (включая Fedora и Debian), или вы можете легко установить его из исходного кода. Узнайте больше на их сайте .

Применение:

pkpgcounter --colorspace BW -r150 my_file.pdf

Это рассчитает процент черного ( BW) для каждой страницы отдельно с точным разрешением 150 точек на дюйм ( -r150). Он также поддерживает другие цветовые пространства, такие как CMYKи RGB. Вызов без каких-либо аргументов просто напечатает количество страниц.

Приятно то, что он дает примерно те же результаты, что и мое быстро составленное решение ниже (которое также можно легко настроить для поддержки нескольких цветовых пространств).

Если вы хотите рассчитать покрытие чернил для всего файла, а не для каждой страницы отдельно, вы можете сделать это с помощью awk:

pkpgcounter --colorspace BW -r150 file.pdf | sed 's/://' | awk '{s+=$2;c++} END{print s/c}'

Выход (черный процент):

10.3758

2. Индивидуальное решение

Я не знаю такого инструмента, но было бы нетрудно приблизительно определить процент черного в файле PDF с помощью инструментов командной строки Linux. В частности, использование pdftopngнабора xpdfинструментов вместе с convertинструментом (частью ImageMagick) и некоторыми сценариями с sedи awk.

Я набросал сценарий, который может быть полезен:

#!/usr/bin/bash
# Count black percentage in a pdf document

infile=$1
[ -z "$1" ] && { echo "Usage: $0  my_file.pdf"; exit 2; }
[ -f "$infile" ] || { echo "$infile does not exist"; exit 2; }
type pdftopng &>/dev/null || { echo "Please install pdftopng (from xpdf)"; exit 2; }
type convert &>/dev/null || { echo "Please install convert (from ImageMagick)"; exit 2; }    

# Temporary directory and files
dir="/tmp/pdf-ink-$$"
tmpfile="$dir/tmp.mpc"
tmpfile2="$dir/tmp2.mpc"

# Delete temporary files on EXIT or interrupts
trap "rm -rf $dir; exit 0" 0
trap "rm -rf $dir; exit 1" 1 2 3 15

# Create the temporary directory
mkdir "$dir"

# First step : convert pdf pages to png images - one image per page - saved at the temp directory
pdftopng -mono "$infile" "${dir}/pages"

# change to temporary directory and continue operations there
cd "$dir"


# Calc histogram for image $1
histogram() {
    # convert to temporary format for faster processing (mpc)
    convert -quiet -regard-warnings "$1" +repage "$tmpfile"
    # dither image
    convert "$tmpfile" +dither -colors 2 -colorspace gray -contrast-stretch 0 "$tmpfile2"
    # calculate histogram
    convert "$tmpfile2" -define histogram:unique-colors=true -format %c histogram:info:-    
}

# Calc percentage for histogram
hist_percent() {
    sed 's/:.*#/ /g' |   # make output parsable
    awk '{b[$3]+=$1; sum+=$1} END { OFS="\t"; for (i in b) print i, (b[i]/sum)*100 }' |   # calculate percentages
    sed 's/gray(255)/white/;s/gray(0)/black/' | column -t  # humanize output
}

# Process each page separately - then pipe histogram to awk for percentage calculation
for f in *.png; do histogram "$f"; done | hist_percent

Сохраните его со значимым именем, например, calc_pdf_ink.shи сделайте его исполняемым с расширением chmod +x calc_pdf_ink.sh. Затем вы можете назвать это так:

./calc_pdf_ink.sh myfile.pdf

Выход:

white  90.3206
black  9.67944

Теперь, чтобы рассчитать количество черного в конкретной единице, нужно умножить этот процент на площадь формата печати. Например, для формата А4 площадью 624 см 2 черный цвет покроет 60,4 см 2 .

Для этого вам понадобятся вышеупомянутые инструменты, которые, вероятно, уже будут установлены в вашей системе (в противном случае оба xpdfи convertбудут доступны в репо вашего дистрибутива).

Как это работает:

  1. Он преобразует pdfфайл в серию монохромных pngизображений (по одному изображению на каждую страницу).
  2. Он рассчитывает двухцветную (черно-белую) гистограмму каждой страницы с помощью convertинструмента
  3. Затем анализируется гистограмма каждой страницы, awkкоторая суммирует черные пиксели для всех страниц, затем белые пиксели и вычисляет процентное соотношение двух цветов.

Вы также можете разместить скрипт где-нибудь в своем PATH(или символическую ссылку на него из вашего PATH), чтобы его можно было вызывать просто по его имени ( calc_pdf_ink.sh file.pdfа не /path/to/script/calc_pdf_ink.sh file.pdf)