簡體   English   中英

PDFQuery:獲取元素所在的頁碼

[英]PDFQuery: get Page number where element is located

這是我第一次使用PDFQuery來抓取 PDF。

我需要做的是從包含幾頁的價目表中獲取價格,我想將產品代碼提供給 PDFQuery,它應該找到代碼並返回旁邊的價格。 問題是使用 Github 頁面上的第一個示例獲取文本的位置,但它清楚地表明“請注意,我們不必知道名稱在頁面上的位置,或者它在哪個頁面上”。 我的價目表就是這種情況,但是所有其他示例都指定了頁碼( LTPage[pageid=1] ),但我沒有看到我們從哪里獲得頁碼。

如果我不指定頁碼,它會返回所有頁面相同位置的所有文本。

此外,我添加了一個exactText函數,因為代碼可能是,例如,“92005”、“92005C”、“92005G”,所以單獨使用:contains並沒有多大幫助。

我試過選擇元素所在的頁面,並使用 JQuery .closest ,兩者都沒有運氣。

我檢查了PDFMiner 文檔PyQuery 文檔,但沒有看到任何對我有幫助的東西 =(

我的代碼現在看起來像這樣:

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

任何幫助都非常感謝,男孩和女孩!!!

可能有一種更優雅的方式,但我用來查找元素所在頁面的方法是 .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)

我希望這有幫助! :)

這應該在 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM