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

Python实现PDF图例识别与地图符号统计的可行性咨询

完全可行!Python实现PDF图例读取与地图符号统计的分步方案

针对你的需求,根据符号类型(文本字符/图形符号),可以用以下两种新手友好的方案实现:

场景1:符号是可识别的文本字符(如X、★等)

这种情况用文本提取工具就能快速实现,推荐用pdfplumber(比PyPDF2的文本提取准确率更高)。

步骤与代码

  1. 先安装依赖:
pip install pdfplumber
  1. 编写代码(注释已标注新手可调整的部分):
import pdfplumber

# 替换成你的PDF文件路径
pdf_path = "your_map.pdf"

with pdfplumber.open(pdf_path) as pdf:
    # 提取第1页(图例)的文本(PDF页码从1开始,代码里索引是0)
    legend_page = pdf.pages[0]
    legend_text = legend_page.extract_text()
    
    # 解析图例:根据你的实际格式调整拆分逻辑
    # 示例格式:"符号X代表宝藏" → 拆成 {'X': '宝藏'}
    symbol_map = {}
    for line in legend_text.split('\n'):
        # 跳过空行
        if not line.strip():
            continue
        # 按你的图例分隔符拆分,比如这里用“代表”
        if "代表" in line:
            symbol_part, meaning = line.split("代表", 1)
            # 提取符号(去掉“符号”前缀,清理空格)
            symbol = symbol_part.replace("符号", "").strip()
            symbol_map[symbol] = meaning.strip()
    
    # 提取第2页(地图)的文本
    map_page = pdf.pages[1]
    map_text = map_page.extract_text()
    
    # 统计每个符号的出现次数
    symbol_counts = {}
    for symbol in symbol_map:
        symbol_counts[symbol] = map_text.count(symbol)
    
    # 输出结果
    print("符号统计结果:")
    for symbol, meaning in symbol_map.items():
        print(f"{symbol}({meaning}):{symbol_counts[symbol]}次")

调整提示

如果你的图例格式是X: 宝藏或X-宝藏,只需把代码里的split("代表", 1)改成split(":", 1)或split("-", 1)即可。


场景2:符号是自定义图形(无法提取为文本,如扫描件里的特殊图标)

这种情况需要先把PDF转成图片,再用OCR(光学字符识别)工具提取内容,推荐用pdf2image+pytesseract组合。

步骤与代码

  1. 安装依赖:
pip install pdf2image pytesseract pillow

注意:还需要下载安装Tesseract OCR引擎,并在代码里配置其路径(新手必做)。

  1. 编写代码:
from pdf2image import convert_from_path
import pytesseract
from PIL import Image

# 配置Tesseract的安装路径(Windows示例,Mac/Linux无需此配置,确保已加入环境变量)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 替换成你的PDF文件路径
pdf_path = "your_map.pdf"

# 把PDF的第1、2页转成图片
pages = convert_from_path(pdf_path, pages=[0, 1])

# 处理图例页(第0张图片)
legend_img = pages[0]
# 识别中文用lang='chi_sim',英文可省略该参数
legend_text = pytesseract.image_to_string(legend_img, lang='chi_sim')

# 解析图例(逻辑和文本场景一致)
symbol_map = {}
for line in legend_text.split('\n'):
    if not line.strip():
        continue
    if "代表" in line:
        symbol_part, meaning = line.split("代表", 1)
        symbol = symbol_part.replace("符号", "").strip()
        symbol_map[symbol] = meaning.strip()

# 处理地图页(第1张图片)
map_img = pages[1]
map_text = pytesseract.image_to_string(map_img, lang='chi_sim')

# 统计符号次数
symbol_counts = {symbol: map_text.count(symbol) for symbol in symbol_map}

# 输出结果
print("符号统计结果:")
for symbol, meaning in symbol_map.items():
    print(f"{symbol}({meaning}):{symbol_counts[symbol]}次")

进阶提示

如果图形无法被OCR识别,可尝试用OpenCV的模板匹配功能:截取图例中的符号作为模板,在地图页中搜索匹配的图形区域并统计数量。这部分需要基础的图像知识,新手可以先从OCR方案入手。


常见问题解决

  • 若PDF是扫描件:必须用场景2的OCR方案,因为扫描件本质是图片,没有文本层。
  • 文本提取乱码:试试pdfplumber的extract_text(layout=True)参数,保留排版结构。
  • OCR识别不准:可以调整图片分辨率(convert_from_path的dpi=300参数)、增强对比度,或训练Tesseract自定义字符集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:44