如何使用 ocr bash 脚本进行扫描

如何使用 ocr bash 脚本进行扫描

为了简化扫描过程,我打算创建一个脚本,可以一步扫描并应用 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

相关内容