PDF 的光学字符识别 (python)
Optical Character Recognition on PDFs (python)
我正在使用 ocrmypdf。我正在尝试对竞选财务 pdf 进行 ocr。 pdf 示例:https://apps1.lavote.net/camp/comm.cfm?&cid=11
我的客户想要解析这些 pdf 以及其他(496 表、497 表)。问题是,即使使用相同类型的表格,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],然后将内容保存到 master 中的一个键对象,例如 county_object[checkpoint[1]] = contents[start_index:end_index]
.
此设置仅适用于我正在解析的 pdf。因为 ocrmypdf 即使对于相同的表单类型也会产生不同的结果,所以我的设置并不理想。有人可以为我指出正确的方向吗?
谢谢
我认为“相同的”460 表格之间的区别是
由于一个正在扫描的垂直错位
以轻微的 CW 角度和另一个以轻微的 CCW 角度。
我希望你用 --deskew
调用,
但即便如此,也可能存在一些小的偏差,证明是麻烦的。
日期之间的垂直分隔似乎很大而且很稳固,
所以一个日期将以正确的方式先于另一个日期。
考虑更多地关注 mm/dd/yyyy 模式
而在文本锚点上更少。
您可以 obtain bound box coordinates 从 Tesseract OCR。
使用它们来消除日期歧义,
根据您对表格上显示较高或较低的内容的了解,
以及(大约)多少。
我正在使用 ocrmypdf。我正在尝试对竞选财务 pdf 进行 ocr。 pdf 示例:https://apps1.lavote.net/camp/comm.cfm?&cid=11
我的客户想要解析这些 pdf 以及其他(496 表、497 表)。问题是,即使使用相同类型的表格,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],然后将内容保存到 master 中的一个键对象,例如 county_object[checkpoint[1]] = contents[start_index:end_index]
.
此设置仅适用于我正在解析的 pdf。因为 ocrmypdf 即使对于相同的表单类型也会产生不同的结果,所以我的设置并不理想。有人可以为我指出正确的方向吗?
谢谢
我认为“相同的”460 表格之间的区别是
由于一个正在扫描的垂直错位
以轻微的 CW 角度和另一个以轻微的 CCW 角度。
我希望你用 --deskew
调用,
但即便如此,也可能存在一些小的偏差,证明是麻烦的。
日期之间的垂直分隔似乎很大而且很稳固, 所以一个日期将以正确的方式先于另一个日期。 考虑更多地关注 mm/dd/yyyy 模式 而在文本锚点上更少。
您可以 obtain bound box coordinates 从 Tesseract OCR。 使用它们来消除日期歧义, 根据您对表格上显示较高或较低的内容的了解, 以及(大约)多少。