python - PDF 上的光学字符识别 (python)
问题描述
我正在使用 ocrmypdf。我正在尝试对竞选财务 pdf 进行 ocr。示例 pdf:https ://apps1.lavote.net/camp/comm.cfm?&cid=11
我的客户想要解析这些 pdf 文件以及其他文件(表格 496s、表格 497s)。问题是,即使是相同类型的表格,ocr 结果也不一致。
例如,一份 pdf(表格 460)将产生以下结果:
Statement covers period
from 07/01/2005
through __11/30/2005
另一个相同类型的产生:
Statement covers period
01/01/2006
from
through 03/17/2006
请注意,在第一个中,第一个日期在 之后from
,而在第二个中,第一个日期在 之前from
。这会在尝试解析数据时产生复杂性。
我正在使用我所谓的“检查点”来解析类似类型的表单。这是一个例子:
checkpoints = [
['Statement covers period from', 'Date From'],
['through', 'Date Thru'],
['Date of election if applicable:', None],
['\n', None],
['\\NUMBER Treasurer(s)\n', 'ID'],
['\n', None],
['COMMITTEE NAME (OR CANDIDATE’S NAME IF NO COMMITTEE)\n\n', 'Committee / Candidate Name'],
['\n', None],
['NAME OF TREASURER\n\n', 'Name of Treasurer'],
['\n', None],
['NAME OF OFFICEHOLDER OR CANDIDATE\n\n', 'Name of Officeholder or Candidate'],
['\n', None],
['OFFICE SOUGHT OR HELD (INCLUDE LOCATION AND DISTRICT NUMBER IF APPLICABLE)\n\n', 'Office Sough or Held'],
['\n', None],
]
我遍历每个检查点,找到当前迭代的开始索引和结束(使用当前检查点和下一个)索引,[0] 而不是 [1],并将内容保存到主对象中的一个键中,例如county_object[checkpoint[1]] = contents[start_index:end_index]
.
此设置仅适用于我正在解析的 pdf。因为 ocrmypdf 即使对于相同的表单类型也会产生不同的结果,所以我的设置并不理想。有人可以指出我应该如何去做的正确方向吗?
谢谢
解决方案
我想“相同”的 460 表格之间的区别是由于一个以轻微的 CW 角度扫描而另一个以轻微的 CCW 角度扫描而导致的垂直未对准。我希望您使用 调用--deskew
,但即使使用 调用,也可能存在一些小偏差,这很麻烦。
日期之间的垂直间隔似乎很大且很牢固,因此一个日期将以适当的方式在另一个日期之前。考虑更多地关注 mm/dd/yyyy 模式,而不是文本锚。
您可以从 Tesseract OCR获取绑定框坐标。使用它们来消除日期的歧义,根据您对表格上更高或更低的知识以及(大约)多少的了解。
推荐阅读
- java - 删除“过期”HTTP 标头(用于 StreamedFiles)
- python - IOError:[Errno 32] 管道损坏
- base64 - 如果文件太大,URL 字符串中的 Base64 二进制数据会打开空白页
- php - 我想在 Laravel 中使用密码重置,但它给出了以下错误。原因是什么?
- sql-server - 如果值为 Null 或 0,则获取前一个值
- rust - Clippy 对静态声明说“参数太多”
- python - 即使指定了不同的 mongo_uri,Flask 应用程序仍在尝试连接到 localhost:27017
- python - 将字典字典的所有键提取为列表或 np.array
- graphdb - 无法使用 SHACL Sail 初始化 graphdb 存储库
- regex - 带有可选字符的正面向后看