2015-10-13 10 views
5

Können wir Regex verwenden, um Text in einer PDF zu erkennen (mit Hilfe von PDFquery oder einem anderen Tool)?Ist es möglich, reguläre Ausdrücke mit PDFquery zu verwenden?

Ich weiß, wir können dies tun:

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' 

Aber wir brauchen so etwas wie dieses:

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' 

Antwort

2

Dies ist nicht gerade ein Nachschlag für einen regulären Ausdruck, aber es funktioniert zu formatieren/Filter der möglich Extraktionen:

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))) 
]) 

ich habe diese nächste nicht testen, aber es könnte auch funktionieren:

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>] 
Verwandte Themen