如何使用 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
我有一个包含照片书页的多页 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