我想编写一个运行命令的脚本OCR
pdfs,在写入文本文件后删除生成的图像。
我想要组合的两个命令如下。
该命令创建文件夹,解压pgm
从每个PDF
并将它们添加到每个文件夹中:
time find . -name \*.pdf | parallel -j 4 --progress 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/screen -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}'
此命令执行 OCR 并删除生成的图像 (pgm
):
time find . -name \*.pgm | parallel -j 4 --progress 'tesseract {} {.} -l deu_frak && rm {.}.pgm'
我想组合这两个命令,以便脚本删除pgm
每次 OCR 后的图像。如果我运行上述命令,第一个命令将提取图像并耗尽我的磁盘空间,然后第二个命令将执行 OCR,只有在这之后才删除图像作为最后一步。
So,
- 创建文件夹
- 从 PDF 中提取 PGM
- OCR 从 PGM 到 txt
- 删除刚刚使用过的PGM图像(丢失)
基本上,我希望每个步骤都按此顺序完成PDF
分开并不适合所有人PDF
立刻。我怎样才能做到这一点?
Edit:
我解决问题的第一次尝试是创建以下命令:
time find . -name \*.pdf | parallel -j 4 -m --progress --eta 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/screen -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' && time find . -name \*.pgm | parallel -j 4 --progress --eta 'tesseract {} {.} -l deu_frak && rm {.}.pgm'
但是,tesseract 找不到语言包。
更新答案
我还没有测试过这个,请在copy文件的一小部分。您可以使用以下命令关闭消息DEBUG:
一开始,如果你很高兴,它看起来不错:
#!/bin/bash
# Declare a function for "parallel" to call
doit() {
# Get name of PDF with and without extension
withext="$1"
noext="$2"
echo "DEBUG: Processing $withext into $noext"
# Make output directory
mkdir -p "$noext"
# Extract as PGM into subdirectory
gs ... -o "$noext"/"${noext}-%03d.pgm $withext"
# Go to target directory or die with error message
cd "$noext" || { echo ERROR: Failed to cd to $noext ; exit 1; }
# OCR and remove each PGM
n=0
for f in *pgm; do
echo "DEBUG: OCR $f into $n"
tesseract "$f" "$n" -l deu_frak
echo "DEBUG: Remove $f"
rm "$f"
((n=n+1))
done
}
# Ensure the function is exported to subshells
export -f doit
find . -name \*.pdf -print0 | parallel -0 doit {} {.}
您应该能够测试doit()
功能无parallel
通过运行:
doit someFile.pdf someFile
原答案
如果你想为每个参数做很多事情GNU 并行,最简单的方法是声明一个bash
函数,然后调用它。
它看起来像这样:
# Declare a function for "parallel" to call
doit() {
echo "$1" "$2"
# mkdir something
# extract PGM
# do OCR
# delete PGM
}
# Ensure the function is exported to subshells
export -f doit
find some files -print0 | parallel -0 doit {} {.}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)