1

我正在尝试使用名为 ocrmypdf 的包进行一些批处理。

这是一个可以处理1个pdf文件的命令

ocrmypdf input.pdf output.pdf

这是一个可以处理我们运行它的目录中的所有pdf文件的命令。

parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf

现在,我实际上想对目录中的所有 pdf 文件运行此命令。这个参数多了一个。

ocrmypdf --sidecar txt/input.txt input.pdf out/output.pdf

我之前尝试像这样重写并行命令:

parallel --tag -j 2 ocrmypdf --sidecar txt/{}.txt {}.pdf out/{}.pdf ::: *.pdf

但我得到了错误:

ocrmypdf: error: the following arguments are required: output_pdf

有人可以帮我理解我做错了什么吗?谢谢!

4

2 回答 2

2

这对我有用:

parallel --tag -j 2 ocrmypdf --sidecar txt/{.}.txt {} out/{} ::: *.pdf

如果它不适合您:

  • 识别失败的文件
  • 手动运行失败的文件以检查它是否有效
  • 编辑您的问题以包含指向失败文件的链接

(运行多个 tesseract 时也要注意这个错误:https ://github.com/tesseract-ocr/tesseract/issues/3109#issuecomment-703845274 )

于 2021-10-18T06:53:27.757 回答
1

尝试:

parallel --tag -j 2 ocrmypdf --sidecar txt/{.}.txt {} out/{} ::: *.pdf

花括号(即“ {}.pdf”)之后的 .pdf 是无关的,将导致无法找到输入文件(“ {}” 默认情况下也捕获扩展名),对于文本文件,通过在其中添加句点括号,它会自动删除扩展名,因此您最终会得到“... .txt”而不是“... .pdf.txt”文件(其中“...”=与输入匹配的相同文件名)

如果上述方法不起作用,可能是由于文件名中包含空格,或者其他一些字符混淆了并行解析(如文件名中的引号字符、括号等),请尝试使用文件作为输入:

故障排除解决方案 - 创建一个文件作为输入parallel

我相信这应该有效。为了避免引号引起的大惊小怪,我首先创建了一个包含所有 pdf 名称的文件(来自 cwd 的完整相对路径):

[g]ls --color=none *.pdf | parallel -q printf '%s'\\n {} > ocrmypdf.list

或者

[g]ls --color=none -N *.pdf > ocrmypdf.list

重要的是文件中的打印文件名中没有引入单引号.list- 引用应该是“文字”,例如:

像这样:

Tritone Substitution sheet music.pdf

不是这样的:

'Tritone Substitution sheet music.pdf'

然后您可以运行并行 ocrmypdf 命令,如下所示:

parallel -j 2 ocrmypdf --sidecar txt/{.} {} out/{} :::: ocrmypdf.list

还要注意 4::::与通常的 3,因为它是从文件中读取的。这将默认为每行并行运行一个完整的文件名参数,因此,不用担心输入文件中的 pdf 文件名中是否有空格等。

于 2021-10-14T22:28:15.797 回答