PDFQuery:获取元素所在的页码

时间:2016-05-07 17:37:08

标签: jquery python pdf pdfminer pyquery

这是我第一次使用PDFQuery来抓取PDF格式。

我需要做的是从价格列表中获取多个页面的价格,我想将产品代码提供给PDFQuery,它应该找到代码并返回它旁边的价格。问题是,使用Github页面上的第一个示例获取文本的位置,但它清楚地说明了"请注意,我们不必知道页面上的名称,或者它的页面是什么#39; s on"。这是我的价格表的情况,但然后所有其他示例指定页码(LTPage[pageid=1]),但我不知道我们从哪里获得页码。

如果我没有指定页码,它会返回所有页面在同一位置的所有文本。

此外,我添加了exactText功能,因为代码可以是,例如," 92005"," 92005C"," 92005G",因此单独使用:contains并没有多大帮助。

我已经尝试选择元素所在的页面,并使用JQuery .closest,两者都没有运气。

我检查了PDFMiner documentationPyQuery documentation,但我看不到有什么可以帮助我=(

我的代码现在看起来像这样:

import pdfquery

pdf = pdfquery.PDFQuery("tests/samples/priceList.pdf")
pdf.load()

code = "92005G"

def exactText():
    element = str(vars(this))
    text = str("u'" + code + "\\n'")
    if text in element:
        return True
    return False

#This should work if i could select the page where the element is located
#page = pdf.pq('LTPage:contains("'+code+'")')
#pageNum = page.attr('pageid')

#Here I would replace the "8" with the page number i get, or remove the LTPage 
#selector all together if i need to find the element first and then the page
label = pdf.pq('LTPage[page_index="8"] LTTextLineHorizontal:contains("'+code+'")').filter(exactText)

#Since we could use "JQuery selectors" i tried using ".closest", but it returns nothing
#page = label.closest('LTPage')
#pageNum = page.attr('pageid')

left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))

#Here I would replace the "8" with the page number i get
price = pdf.pq('LTPage[page_index="8"] LTTextLineHorizontal:in_bbox("%s, %s, %s, %s")' % (left_corner+110, bottom_corner, left_corner+140,     bottom_corner+20)).text()
print price

任何帮助都非常感谢,男人和女孩!!!

2 个答案:

答案 0 :(得分:0)

可能有更优雅的方式,但我用来查找元素的页面是.interancestors('LTPage')。下面的示例代码将找到“我的文本”的所有实例,并告诉您它所在的页面:

for pq in pdf.pq('LTTextLineHorizontal:contains("My Text")'):
    page_pq = pq.iterancestors('LTPage').next()   # Use just the first ancestor
    print 'Found the text "%s" on page %s' % ( pq.layout.get_text(), page_pq.layout.pageid)

我希望有所帮助! :)

答案 1 :(得分:0)

这应该在python3中有效(注意调用next(iterator)以获取第一个页面祖先):

code = "92005G"

label = pdf.pq('LTPage:contains("{}")'.format(code))
page_pq = next(label.iterancestors('LTPage'))
pageNum = int(page_pq.layout.pageid)

label = pdf.pq('LTPage[page_index="{0}"] LTTextLineHorizontal:contains("{1}")'.format(pageNum, code)).filter(exactText)

left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))

price = pdf.pq('LTPage[page_index="{0}"] LTTextLineHorizontal:in_bbox("{1}, {2}, {3}, {4}")'.format(pageNum, left_corner+110, bottom_corner, left_corner+140, bottom_corner+20)).text()