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

如何在Python中提取带坐标的数字化PDF文本片段?

提取PDF文本并获取坐标、字体/字号信息

你想要提取PDF中带坐标(边界框)、字体及字号的文本,我结合你试过的工具,给你两个靠谱的解决方案:

一、用pdfminer.six获取完整信息(含边界框)

你之前用pdfminer.six的high_level模块已经能拿到字体和字号,只需要补充获取边界框的逻辑就行。每个LTTextLine或者LTChar都自带bbox属性,包含了该元素的左下角和右上角坐标(格式为x0, y0, x1, y1)。

这里给你优化后的代码,既能拿到整行文本,也能获取对应的字体、字号和边界框,避免逐字符输出的冗长:

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer, LTTextLine

for page_layout in extract_pages("PDF-export-example.pdf"):
    print(f"=== 第 {page_layout.pageid} 页 ===")
    for element in page_layout:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                if isinstance(text_line, LTTextLine):
                    # 获取整行文本
                    line_text = text_line.get_text().strip()
                    if not line_text:
                        continue
                    # 获取边界框(x0:左, y0:下, x1:右, y1:上)
                    bbox = text_line.bbox
                    # 获取该行的字体和字号(取第一个字符的属性,默认整行字体一致)
                    first_char = next(char for char in text_line if isinstance(char, LTChar))
                    font_name = first_char.fontname
                    font_size = first_char.size
                    
                    print(f"文本: {line_text}")
                    print(f"边界框: {bbox}")
                    print(f"字体: {font_name}, 字号: {font_size}\n")

如果需要逐字符的精确坐标,也可以保留逐字符遍历的逻辑,每个LTChar的bbox就是单个字符的边界框。

二、用PyMuPDF(fitz)更简洁高效

PyMuPDF是个非常好用的PDF处理库,API更直观,提取文本时能直接拿到每个文本块的位置、字体、字号信息,代码也更简洁:

首先安装库:

pip install pymupdf

然后用以下代码提取:

import fitz  # PyMuPDF

doc = fitz.open("PDF-export-example.pdf")
for page_num in range(len(doc)):
    page = doc[page_num]
    print(f"=== 第 {page_num+1} 页 ===")
    # 获取页面所有文本块,每个块包含文本、边界框、字体等信息
    text_blocks = page.get_text("dict")["blocks"]
    for block in text_blocks:
        if block["type"] == 0:  # 0表示文本块
            for line in block["lines"]:
                for span in line["spans"]:
                    text = span["text"].strip()
                    if not text:
                        continue
                    # 边界框(x0, y0, x1, y1)
                    bbox = span["bbox"]
                    font_name = span["font"]
                    font_size = span["size"]
                    
                    print(f"文本: {text}")
                    print(f"边界框: {bbox}")
                    print(f"字体: {font_name}, 字号: {font_size}\n")
doc.close()

这个方法的优势很明显:

  • 输出结构清晰,按「文本块-行-文本段(同字体字号的连续文本)」划分
  • 坐标获取直接,API设计更友好
  • 处理速度也比pdfminer.six更快

关于你试过的工具补充说明

  • pdftotext:确实只有布局化的文本输出,不带任何元数据,适合只需要纯文本内容的场景
  • PyPDF2:旧版本的文本提取能力较弱,现在推荐用它的继任者pypdf(注意是小写的pypdf),不过即使是pypdf,提取坐标等元数据也不如上面两个工具方便
  • tabula-py:专门用于提取PDF中的表格内容,你的示例PDF如果没有表格结构,自然不会有输出,适合特定的表格提取场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:52:54