Есть ли инструмент (бесплатное программное обеспечение для Linux), который позволяет мне рассчитать количество черного в файле PDF? Например, измеряется в мм² или в какой-либо другой подходящей единице измерения?
В последних версиях 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. Существующий инструмент
Поискав в Интернете, я нашел инструмент, который работает точно так же, а также поддерживает множество форматов (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
будут доступны в репо вашего дистрибутива).
Как это работает:
pdf
файл в серию монохромных png
изображений (по одному изображению на каждую страницу).convert
инструментаawk
которая суммирует черные пиксели для всех страниц, затем белые пиксели и вычисляет процентное соотношение двух цветов.Вы также можете разместить скрипт где-нибудь в своем PATH
(или символическую ссылку на него из вашего PATH
), чтобы его можно было вызывать просто по его имени ( calc_pdf_ink.sh file.pdf
а не /path/to/script/calc_pdf_ink.sh file.pdf
)
Иоахим Брайтнер
inkcov
устройству?Курт Пфайфл
Иоахим Брайтнер
inkcov
не имеет параметров конфигурации? (Я не ищу ничего конкретного, мне просто любопытно.)Курт Пфайфл
gs -o - -sDEVICE=inkcov -c "currentpagedevice {exch ==only ( ) print === } forall"
может рассказать вам все о потенциальных переключателях командной строки, которые вы могли бы использовать с устройствоinkcov
. Возможные параметры для настройки в моем следующем комментарии:Курт Пфайфл
-dDeviceGrayToK=true|false
,-dUseCIEColor=true|false
а-sICCOutputColors=/path/to/colorprofile.icc
затем еще некоторые. Но если вы не знаете, что делаете, лучше не трогайте его для серьезных результатов!Иоахим Брайтнер
Курт Пфайфл
Иоахим Брайтнер
гомбош
gs
командой! (Подсказка: вы можете использоватьawk
для извлечения полей или электронную таблицу для расчета средних значений.)