You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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}')

关键修正说明

  1. 精准裁剪:单独裁剪发票号所在的矩形区域,提取该区域文本,避免其他页面内容干扰匹配
  2. 正则匹配修复:使用re.search执行正则模式匹配,替代原有的字符串包含判断逻辑
  3. 坐标校准:根据目标PDF的实际布局调整了bbox坐标,确保完全覆盖发票号所在的矩形范围

内容的提问来源于stack exchange,提问作者gsawdy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:57:27