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

如何定位PDF文件中数学公式的起止位置?现有工具适配不佳

解决PDF公式起止位置识别问题的可行方案

一、基于现代PDF结构化解析工具的方案

1. PyMuPDF(fitz)

PyMuPDF对PDF中的图形、文本块解析精度远高于pdfminer.six和pypdf,多数公式由矢量图形路径绘制,可通过检测密集图形元素块定位公式区域:

import fitz

def find_formula_bboxes(pdf_path, page_num):
    doc = fitz.open(pdf_path)
    page = doc[page_num]
    formula_bboxes = []
    # 获取页面所有图形对象
    shapes = page.get_drawings()
    # 过滤密集图形块(公式通常是紧凑多路径组合)
    for shape in shapes:
        bbox = shape["rect"]
        # 自定义阈值:宽度<200、高度<50且路径数>5
        if (bbox.width < 200 and bbox.height < 50) and len(shape["items"]) > 5:
            formula_bboxes.append((bbox.x0, bbox.y0, bbox.x1, bbox.y1))
    doc.close()
    return formula_bboxes

该方法直接从PDF矢量数据提取公式的边界框(起止坐标),无需OCR。

2. pdfplumber

基于pdfminer.six优化了布局分析,可区分文本、图形、图像块,结合规则定位公式:

import pdfplumber

def extract_formula_regions(pdf_path):
    formula_regions = []
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            # 获取页面所有元素的边界框
            elements = page.objects.get("char", []) + page.objects.get("curve", [])
            # 筛选高元素密度的小区域(公式密度远高于普通文本)
            for elem in elements:
                bbox = elem["bbox"]
                if (bbox[2]-bbox[0]) < 150 and (bbox[3]-bbox[1]) < 40:
                    formula_regions.append((page.page_number, bbox))
    return formula_regions

二、现代OCR+布局分析方案

放弃老旧OCR工具,改用以下稳定的现代工具:

1. Tesseract 5.x + pytesseract

Tesseract 5支持数学公式识别(启用--psm 6模式或加载数学模型),同时返回识别元素的坐标:

import pytesseract
from PIL import Image
import fitz

def ocr_formula_bboxes(pdf_path, page_num):
    doc = fitz.open(pdf_path)
    page = doc[page_num]
    # 转换PDF页面为图片
    pix = page.get_pixmap()
    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
    # 启用数学识别模式,获取带坐标的结果
    data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT, config="--psm 6 -l eng+equ")
    formula_bboxes = []
    # 筛选置信度高且含公式符号的区域
    for i in range(len(data["text"])):
        if data["conf"][i] > 60 and len(data["text"][i]) > 0 and any(c in "=+-*/∑∫√" for c in data["text"][i]):
            bbox = (data["left"][i], data["top"][i], data["left"][i]+data["width"][i], data["top"][i]+data["height"][i])
            formula_bboxes.append(bbox)
    doc.close()
    return formula_bboxes

注意:需安装最新版Tesseract(5.x),并确保pytesseract指向正确的Tesseract路径。

2. LayoutLM系列模型

微软的LayoutLM专门用于文档布局分析,可直接识别PDF中的公式区域并返回边界框,使用Hugging Face Transformers库即可实现:

from transformers import LayoutLMForTokenClassification, LayoutLMTokenizer
from PIL import Image
import fitz

# 加载预训练的LayoutLM公式识别模型
model = LayoutLMForTokenClassification.from_pretrained("microsoft/layoutlmv3-base-finetuned-doclaynet")
tokenizer = LayoutLMTokenizer.from_pretrained("microsoft/layoutlmv3-base-finetuned-doclaynet")

def layoutlm_find_formulas(pdf_path, page_num):
    doc = fitz.open(pdf_path)
    page = doc[page_num]
    pix = page.get_pixmap()
    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
    # 预处理页面图像和文本(参考官方文档完善细节)
    outputs = model(**tokenizer(img, return_tensors="pt"))
    predictions = outputs.logits.argmax(-1)
    # 解析预测结果,提取公式区域的边界框
    formula_bboxes = []
    # 根据模型标签映射筛选公式对应的预测结果
    doc.close()
    return formula_bboxes

该方案准确率高,适合复杂文档的公式定位。

三、专门的公式定位工具

pdf2svg + SVG分析

将PDF转换为SVG格式,公式会被解析为连续的矢量路径组,通过分析SVG中的路径元素定位公式:

# 安装pdf2svg(Linux)
sudo apt install pdf2svg

转换后用Python的svgpathtools库分析SVG文件,提取密集路径组的边界框,即为公式的起止位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:23:23