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

如何用Python(pdfminer、minecart等)检测PDF中彩色块的坐标

我之前在处理带彩色高亮表格的PDF提取时,也遇到过和你一样的问题——用minecart检测高亮块坐标确实是个高效的方案,不用全量跑OpenCV。下面给你详细的实现步骤和代码,亲测可用:

用minecart检测PDF彩色高亮块坐标并配合tabula-py提取表格

1. 先安装依赖

首先确保你已经安装了minecart:

pip install minecart

2. 核心:检测彩色高亮块的坐标

高亮块在PDF里通常以**填充矩形(filled rectangle)**的形式存在,我们可以通过minecart遍历页面元素,匹配目标颜色来获取坐标。注意minecart的坐标原点在页面左下角,和tabula-py的坐标系统完全兼容,不需要额外转换。

import minecart

def detect_highlight_regions(pdf_path, target_rgb):
    """
    检测PDF中指定颜色的高亮块坐标
    :param pdf_path: PDF文件路径
    :param target_rgb: 目标高亮颜色的RGB元组(范围0-1,比如(1, 0.8, 0.8)对应浅红色)
    :return: 包含页码和bbox的列表,bbox格式为[x0, y0, x1, y1](左下角到右上角)
    """
    highlight_regions = []
    doc = minecart.Document(open(pdf_path, 'rb'))
    
    for page_idx, page in enumerate(doc.pages):
        # 遍历页面所有图形元素
        for shape in page.shapes:
            # 筛选填充的矩形元素
            if isinstance(shape, minecart.Rectangle) and shape.fill:
                # 匹配颜色(加小容差,避免PDF颜色精度问题)
                color_match = all(abs(c - tc) < 0.05 for c, tc in zip(shape.fill.color, target_rgb))
                if color_match:
                    highlight_regions.append({
                        "page": page_idx + 1,  # tabula页码从1开始
                        "bbox": [shape.x0, shape.y0, shape.x1, shape.y1]
                    })
        # 补充处理文本高亮注释(部分PDF的高亮是annotation而非图形)
        for annot in page.annotations:
            if annot.type == "highlight":
                # 注释的坐标原点通常在左上角,转换为左下角坐标
                rect = annot.rect
                x0, y_top, x1, y_bottom = rect
                y0 = page.height - y_bottom
                y1 = page.height - y_top
                highlight_regions.append({
                    "page": page_idx + 1,
                    "bbox": [x0, y0, x1, y1]
                })
    return highlight_regions

3. 配合tabula-py提取对应区域的表格

拿到高亮块的坐标后,直接把bbox传给tabula的area参数,就能精准提取对应区域的表格:

from tabula import read_pdf

# 替换成你的PDF路径和目标高亮颜色
pdf_file = "your_target.pdf"
# 示例:浅红色高亮,你可以通过打印颜色值确认目标颜色(见下方调试技巧)
target_color = (1, 0.8, 0.8)

# 检测高亮区域
regions = detect_highlight_regions(pdf_file, target_color)

# 批量提取表格
extracted_tables = []
for region in regions:
    tables = read_pdf(
        pdf_file,
        pages=region["page"],
        area=region["bbox"],
        pandas_options={"header": 0},  # 根据你的表格结构调整表头设置
        multiple_tables=True
    )
    extracted_tables.extend(tables)

# 输出提取结果
for idx, table in enumerate(extracted_tables):
    print(f"=== 提取的表格 {idx+1} ===")
    print(table)
    print("\n")

调试技巧:确认目标高亮的实际颜色

如果找不到高亮块,可能是颜色值匹配错误,你可以先打印页面所有填充矩形的颜色和坐标,确认目标高亮的真实RGB值:

doc = minecart.Document(open(pdf_file, 'rb'))
for page in doc.pages:
    for shape in page.shapes:
        if isinstance(shape, minecart.Rectangle) and shape.fill:
            print(f"颜色:{shape.fill.color},坐标:({shape.x0}, {shape.y0}) -> ({shape.x1}, {shape.y1})")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:02:25