如何拆分PDFQuery抓取库中使用的.extract的输出

时间:2019-04-10 14:23:43

标签: python python-3.x pdf

我对pdf查询库有疑问。最近几天我一直在试图解决这个问题,但似乎无法解决。

代码:

def data_validation(x,y,x1,y1,pdf,width_scale,height_scale):

    values = pdf.extract([
        ('with_formatter', 'text'),
        ('with_parent','LTPage[pageid=\'1\']'),
        ('values', 'LTTextLineHorizontal:in_bbox("%s,%s,%s,%s")' % ((x1*width_scale), ((800-y)*height_scale), (x*width_scale), ((800-y1)*height_scale)))
    ])

    return values

函数(data_validation)的输入变量是一个覆盖两个对象的边界框(边界框值),但是输出似乎已合并为1个值(输出)。

边界框值:

bbox #1 - Exhibit A Sample Contract
bbox #2 - Sample Contract

输出:

{' values': 'Exhibit A Sample Contract Sample Contract'}

输出不是{'values':'Exhibit A Sample Contract','Sample Contract'},一个具有2个值的键吗?

希望有人可以帮助我,告诉我我做错了什么。

1 个答案:

答案 0 :(得分:0)

经过深思熟虑后,我想起了我自己的想法,所以我认为我应该发布修复程序,因为这将对整个过程大有帮助。

代替pyquery将XML节点格式化为文本,作为PDF提取('with_formatter', 'text')的一部分,提取XML对象更容易,然后再提取文本。

values = pdf.extract([
    #('with_formatter', 'text'),
    ('with_parent','LTPage[pageid=\'1\']'),
    ('values', 'LTTextLineHorizontal:in_bbox("%s,%s,%s,%s")' % ((x1*width_scale), ((800-y)*height_scale), (x*width_scale), ((800-y1)*height_scale)))
])

这将产生类似于以下内容的字典values

{' values': [<LTTextLineHorizontal>, <LTTextLineHorizontal>]}

我们现在可以从<LTTextLineHorizontal>中的各个values XML节点构建一个列表:

for key,val in values.items():
    if len(val) >= 1: # if we found multiple bbox'
        resultingText = [i.text() for i in val.items('LTTextBoxHorizontal')]
    elif(len(val)) == 1: # if we found only one bbox
        resultingText = [val.text()]
    else: # no bbox found
        resultingText = []
return(resultingText)

resultingText的输出:

['Exhibit A Sample Contract', 'Sample Contract']