为了简化扫描过程,我打算创建一个脚本,可以一步扫描并应用 OCR。然而,我的 bash 技能相当差,所以我会非常感谢您的帮助。这是我的尝试:
#!/bin/bash
mydate="$(date +"%Y%m%d-%H%M%S")"
image="$(scanimage --device "brother4:net1;dev0" --progress --verbose --resolution=600 -l 0 -t 0 -x 210 -y 297 --format=pdf)"
ocrmypdf --deskew "$image" "$mydate".pdf
该命令运行良好,无需创建特定于日期的文件名:
scanimage --device "brother4:net1;dev0" --progress --verbose --resolution=600 -l 0 -t 0 -x 210 -y 297 --format=pdf > scan.pdf && ocrmypdf --deskew scan.pdf scan.pdf
由于 OCR 过程需要一些时间,因此必须在扫描时存储包含时间(最多秒)的文件名,然后应用于最终文件。或者也许有可能 - 没有找到如何 - 将文件通过管道传送到ocrmypdf
而不命名它,然后使用日期和时间信息保存文件。
答案1
您可以创建一个临时目录并将文件保存在其中。mktemp
旨在为您提供唯一的文件/目录名称并适合此目的。
tmpdir=$(mktemp -d OcrTmpDirXXXXXXXXX)
scanimage args >"$tmpdir/in.pdf"
ocrmypdf args "$tmpdir/in.pdf" "$tmpdir/out.pdf"
printf 'See "%s" for result\n' "$tmpdir"
答案2
问题在于
image="$(scanimage --device "brother4:net1;dev0" --progress --verbose --resolution=600 -l 0 -t 0 -x 210 -y 297 --format=pdf)"
是该$image
变量包含二进制内容pdf 的名称,而不是文件名。
一种非常棘手的方法是使用流程替代
ocrmypdf --deskew <(
scanimage --device "brother4:net1;dev0" --progress --verbose --resolution=600 -l 0 -t 0 -x 210 -y 297 --format=pdf
) "$mydate".pdf
我不保证 ocrmypdf 会接受它。
如果 ocrmypdf 接受文件名-
表示“标准输入”,那么您可以执行以下操作:
scanimage --device "brother4:net1;dev0" --progress --verbose --resolution=600 -l 0 -t 0 -x 210 -y 297 --format=pdf \
| ocrmypdf --deskew - "$mydate".pdf
或者也许你需要一个双连字符,我不知道这个工具是如何工作的(查看手册页)
... \
| ocrmypdf --deskew -- - "$mydate".pdf