Python实现PDF图例识别与地图符号统计的可行性咨询
完全可行!Python实现PDF图例读取与地图符号统计的分步方案
针对你的需求,根据符号类型(文本字符/图形符号),可以用以下两种新手友好的方案实现:
场景1:符号是可识别的文本字符(如X、★等)
这种情况用文本提取工具就能快速实现,推荐用pdfplumber(比PyPDF2的文本提取准确率更高)。
步骤与代码
- 先安装依赖:
pip install pdfplumber
- 编写代码(注释已标注新手可调整的部分):
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组合。
步骤与代码
- 安装依赖:
pip install pdf2image pytesseract pillow
注意:还需要下载安装Tesseract OCR引擎,并在代码里配置其路径(新手必做)。
- 编写代码:
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
相关产品推荐
相关产品推荐

