如何用Python提取PDF中矩形区域内的发票编号?
解决PDF矩形框内发票编号提取问题
你的问题出在三个核心点:
- 裁剪页面后未使用裁剪后的内容提取文本,仍调用原页面文本,等于白做裁剪操作
- 正则表达式匹配方式错误,直接用字符串包含逻辑判断正则模式,无法正确识别发票号格式
- 原设置的bbox坐标范围不准确,导致裁剪区域未覆盖到发票号所在的矩形框
修正后的代码
import pdfplumber import re def extract_invoice_data(pdf_path): with pdfplumber.open(pdf_path) as pdf: page = pdf.pages[0] # 调整后的发票号所在矩形框坐标(适配目标PDF实际布局) # 坐标规则:(x0, y0, x1, y1),原点为页面左下角 invoice_num_bbox = (520, 755, 600, 775) # 裁剪到发票号专属区域并提取文本 invoice_num_area = page.crop(invoice_num_bbox) invoice_num_text = invoice_num_area.extract_text() # 保留原有的日期提取逻辑(已验证可用) full_text = page.extract_text() invoice_date = None invoice_date_label = 'Invoice Date:' for line in full_text.split('\n'): if invoice_date_label in line: invoice_date = line.split(invoice_date_label)[1].strip() # 用正则正确匹配发票号格式 invoice_number = None if invoice_num_text: match = re.search(r'(\d+)-IN', invoice_num_text) if match: invoice_number = match.group(0) return invoice_number, invoice_date # 示例调用 pdf_path = 'C:/Users/gsawdy/Desktop/Results/page_1.pdf' invoice_number, invoice_date = extract_invoice_data(pdf_path) print(f'Invoice Number: {invoice_number}') print(f'Invoice Date: {invoice_date}')
关键修正说明
- 精准裁剪:单独裁剪发票号所在的矩形区域,提取该区域文本,避免其他页面内容干扰匹配
- 正则匹配修复:使用
re.search执行正则模式匹配,替代原有的字符串包含判断逻辑 - 坐标校准:根据目标PDF的实际布局调整了bbox坐标,确保完全覆盖发票号所在的矩形范围
内容的提问来源于stack exchange,提问作者gsawdy
相关产品推荐
相关产品推荐

