如何使用 imagemagick 处理多页 PDF 的每一页?

How to process each page of a multi-page PDF in place with 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 和 return 多页 PDF 一样处理每一页?

您似乎不太可能希望将 PDF 传递给 OCR,因为 Tesseract 等人更喜欢 PNG 或 NetPBM PPM 文件,因此您不妨将大 PDF 拆分为单独的 PNG(或其他)文件:

convert full.pdf page-%03d.png

您现在可以删除单个页面上的渐变,一次一个,然后传递给 OCR。或者您可以使用 GNU Parallel 并行执行它们 - 请说明是否有此选项,如果有,我会为您写下来。

由于 imagemagick 似乎无法一次性完成此操作,因此我根据 Mark Setchell 在对他的回答的评论中提出的建议编写了一个脚本。

#!/usr/bin/bash

set -e

tmpdir=$(mktemp -d)

echo "Splitting PDF into single pages"
convert -density 288 "" "${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}"

我的 material 工作正常。您的里程可能会有所不同。

这应该可以在一个命令行中完成您在 ImageMagick 中想要的操作。您必须使用 -layers composite 并通过 null: 分隔您的 pdf 和模糊处理。这与合并动画 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