Как обработать каждую страницу многостраничного PDF-файла с помощью imagemagick?

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

Эта команда отлично работает с PNG одной страницы:

convert page.png \( +clone -blur 0x64 \) -compose minus -composite -channel RGB -negate page_deblurred.png

Однако, как только я попробую это на многостраничном PDF-файле с помощью этой команды...

convert full.pdf \( +clone -blur 0x64 \) -compose minus -composite -channel RGB -negate full_deblurred.pdf

... Я получаю одностраничный PDF-файл с инвертированными цветами, наложенными на текст с нескольких страниц.

Как мне сказать imagemagick обрабатывать каждую страницу, как это происходит с PNG, и возвращать мне многостраничный PDF?


person 303    schedule 14.03.2020    source источник


Ответы (3)


Это должно делать то, что вы хотите в ImageMagick, в одной командной строке. Вы должны использовать композицию -layers и отделить свой PDF-файл и обработку размытия с помощью null:. Это тот же процесс, что и объединение анимированных GIF-файлов.

convert -density 288 image.pdf -write mpr:img null: \( mpr:img -blur 0x64 \) -compose minus -layers composite -channel RGB -negate -resize 25% image_deblurred.pdf


person fmw42    schedule 15.03.2020
comment
Спасибо за ваш ответ! Это работает, но качество вывода слишком низкое для OCR. Я позволил себе отредактировать, добавив флаг -density 288 после convert. Это значительно увеличивает время вычислений, но результаты намного лучше. Этот флаг можно использовать для управления соотношением времени выполнения и качества. - person 303; 19.03.2020
comment
Я дополнительно отредактировал ответ, чтобы выходной размер не менялся из-за -density 288. Добавление -resize 25% компенсирует увеличение размера -density 288. Обработка по-прежнему займет столько же времени, сколько и без -resize. - person fmw42; 19.03.2020

Кажется маловероятным, что вы захотите передать PDF-файл в OCR, поскольку Tesseract и др. предпочитают файлы PNG или NetPBM PPM, поэтому вы также можете разделить свой большой PDF-файл на отдельные файлы PNG (или другие):

convert full.pdf page-%03d.png

Теперь вы можете удалять градиенты на отдельных страницах по одному и переходить к OCR. Или вы можете использовать GNU Parallel, чтобы делать их параллельно — пожалуйста, сообщите, если это возможно, и я напишу это для вас, если да.

person Mark Setchell    schedule 14.03.2020
comment
Спасибо за ваш ответ! На самом деле я бы предпочел использовать pdfsandwich, который действительно принимает PDF-файлы в качестве входных данных и имеет некоторые встроенные параметры, которые я хотел бы использовать. - person 303; 15.03.2020
comment
Хорошо, я не слышал о pdfsandwich, но, думаю, я бы все же разделил PDF на отдельные страницы, как указано выше, удалил градиент со страниц по отдельности либо в цикле for, либо параллельно, а затем рекомбинировал в многостраничный PDF для вашего предпочтительный инструмент. Дайте мне знать, если вам нравится такой подход и вы хотите получить руку с любыми аспектами. - person Mark Setchell; 15.03.2020
comment
Если Imagemagick не может выполнить эту работу самостоятельно, я с радостью приму каждый ответ, который даст нужный мне результат. Мне трудно увидеть преимущества GNU Parallel в этом случае, поскольку Imagemagick уже использует все ядра моего процессора при обработке только одного файла. - person 303; 15.03.2020

Поскольку imagemagick, похоже, не способен сделать это за один раз, я собрал сценарий на основе предложения Марка Сетчелла, сделанного в комментарии к его ответу.

#!/usr/bin/bash

set -e

tmpdir=$(mktemp -d)

echo "Splitting PDF into single pages"
convert -density 288 "$1" "${tmpdir}/page-%03d.png"
for f in "$tmpdir"/page-*.png
do
    echo "Processing ${f##*/}"
    convert "$f" \( +clone -blur 0x64 \) -compose minus -composite -channel RGB -negate "$(printf "%s%s" "$f" "_gradient_removed.png")"
done
pdf_file_name_without_suffix="${1%.pdf}"
echo "Reassembling PDF"
convert "$tmpdir"/*_gradient_removed.png -quality 100 "$pdf_file_name_without_suffix"_gradient_removed.pdf

rm -rf "${tmpdir}"

Он отлично работает с моим материалом. Ваш пробег может отличаться.

person 303    schedule 15.03.2020