2015-10-13 16 views
5

Possiamo usare regex per rilevare il testo all'interno di un pdf (utilizzando pdfquery o un altro strumento)?È possibile utilizzare le espressioni regolari con pdfquery?

So che possiamo fare questo:

pdf = pdfquery.PDFQuery("tests/samples/IRS_1040A.pdf") 
pdf.load() 
label = pdf.pq('LTTextLineHorizontal:contains("Cash")') 
left_corner = float(label.attr('x0')) 
bottom_corner = float(label.attr('y0')) 
cash = pdf.pq('LTTextLineHorizontal:in_bbox("%s, %s, %s, %s")' % \ 
     (left_corner, bottom_corner-30, \ 
     left_corner+150, bottom_corner)).text() 
print cash 
'179,000.00' 

Ma abbiamo bisogno di qualcosa di simile:

pdf = pdfquery.PDFQuery("tests/samples/IRS_1040A.pdf") 
pdf.load() 
label = pdf.pq('LTTextLineHorizontal:regex("\d{1,3}(?:,\d{3})*(?:\.\d{2})?")') 
cash = str(label.attr('x0')) 
print cash 
'179,000.00' 

risposta

2

questo non è esattamente una ricerca per una regex, ma funziona per formattare/filtrata del possibili estrazioni:

def regex_function(pattern, match): 
    re_obj = re.search(pattern, match) 
    if re_obj != None and len(re_obj.groups()) > 0: 
     return re_obj.group(1) 
    return None 

pdf = pdfquery.PDFQuery("tests/samples/IRS_1040A.pdf") 

pattern = '' 
pdf.extract([ 
('with_parent','LTPage[pageid=1]'), 
('with_formatter', 'text'), 
('year', 'LTTextLineHorizontal:contains("Form 1040A (")', 
     lambda match: regex_function(SOME_PATTERN_HERE, match))) 
]) 

non ho la prova questo prossimo, ma potrebbe funzionare anche:

def some_regex_function_feature(): 
    # here you could use some regex. 
    return float(this.get('width',0)) * float(this.get('height',0)) > 40000 

pdf.pq('LTPage[page_index="1"] *').filter(regex_function_filter_here) 
[<LTTextBoxHorizontal>, <LTRect>, <LTRect>]