Как обработать каждую страницу многостраничного PDF на месте с помощью imagemagick? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть многостраничный 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?

Ответы [ 3 ]

1 голос
/ 15 марта 2020

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

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


1 голос
/ 14 марта 2020

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

convert full.pdf page-%03d.png

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

0 голосов
/ 15 марта 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}"

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

...