我有定期流入的发票pdfs . 我从这些pdf中提取数据以进行各种操作和存储 .
这是一个示例部分:
第一步是使用Adobe的OCR . 然后,我使用tika来解析pdf . 在Python中:
from tika import parser
parsedPDF = parser.from_file("the_file.pdf")
这是预期的输出:
...
001 6 0 6 EA FSC450-WBKR FUTSAL, ADULT, WHT/BLK/RED BULK \n\n
002 6 0 6 EA SS50-P SOCCER PURPLE/BLUE/WHITE BULK \n\n
...
行由换行符分隔,您在pdf上看到的行被解析为完整行(见下文) .
这是实际输出:
001 6 0 6 \n\n
002 6 0 6 \n\n
003 13 0 13 \n\n
004 3 0 3 \n\n
EA FSC450-WBKR FUTSAL, ADULT, WHT/BLK/RED BULK \n\n
EA SS50-P SOCCER PURPLE/BLUE/WHITE BULK \n\n
...
OCR创建了一个结构,您在pdf上看到的行分为两个部分[* note] . 分裂发生在"Shipped"和"Unit" Headers 之间 .
对于项目002,如果我从“#” Headers 拖动到“打包” Headers ,它首先选择第一部分的数据,然后跳到第二部分的顶部 .
这个问题有一个很好的解决方案吗?有没有办法为OCR定义结构(例如,它将一行读作一行?)
[* note]:实际上文本是垂直包装的(与通常看到的水平文本换行相比) .
1 回答
而不是尝试重铸数据,而只是使用你拥有的东西 . 你得到两组线,第一组包含数据行的左半部分,第二组包含右半部分 .
itertools.groupby
非常适合按某些分组标准拆分行 . 在这种情况下,您可以看出左半部分都以数字开头,而右半部分则没有 .一旦你将它们分成两个大小相等的组,使用Python的内置方法
zip
将它们拼接在一起 . 然后一连串的split()
可以帮助您解析每一行的内容 - 请参阅下面代码中的注释:得到: