求助:如何将URL中PDF表格转为Pandas DataFrame?扫描版PDF处理遇阻
扫描版PDF转Pandas DataFrame的解决方案
针对扫描生成的图片式PDF(无可选中文本),以下是两种可落地的解决思路:
方案一:使用tabula-py的OCR模式
tabula支持通过Tesseract进行OCR识别,前提是先安装好Java环境和Tesseract OCR引擎。代码示例:
import tabula as tb # 扫描版PDF路径/URL pdf_path = "https://rrc.texas.gov/media/uzzdihmq/2023-july-10-0026.pdf" # 启用OCR模式,指定语言为英文 dfs = tb.read_pdf( pdf_path, pages=1, guess=True, ocr=True, ocr_language="eng" ) # 输出解析后的DataFrame print(dfs[0])
注意:需确保已安装tabula-py、tesseract-ocr,并配置好环境变量让Java和Tesseract能被系统调用。
方案二:图片预处理+Tesseract表格OCR+数据解析
如果tabula的OCR模式效果不佳,可手动处理PDF转图片,优化图片后再做OCR,最后解析为DataFrame:
- 先安装依赖库:
pdf2image、opencv-python、pytesseract、pandas - 代码示例:
from pdf2image import convert_from_path import cv2 import pytesseract import pandas as pd import numpy as np # 1. 将PDF转换为图片 pages = convert_from_path("https://rrc.texas.gov/media/uzzdihmq/2023-july-10-0026.pdf") # 2. 图片预处理(提升OCR准确率) def preprocess_image(img): # 转为灰度图 gray = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY) # 自适应二值化 thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 降噪处理 denoised = cv2.medianBlur(thresh, 3) return denoised processed_img = preprocess_image(pages[0]) # 3. Tesseract OCR识别,输出带布局信息的DataFrame ocr_result = pytesseract.image_to_data( processed_img, lang="eng", output_type=pytesseract.Output.DATAFRAME ) # 4. 筛选有效文本并整理为表格 valid_text = ocr_result[ocr_result["text"].notna() & (ocr_result["text"].strip() != "")] # 按行分组拼接文本 rows = valid_text.groupby("line_num")["text"].apply(lambda x: " ".join(x)).tolist() # 拆分列(若为固定宽度表格,需手动根据像素坐标分割,此处示例按空格拆分) df = pd.DataFrame([row.split() for row in rows[1:]], columns=rows[0].split()) print(df)
说明:如果是固定宽度布局的表格,可通过pytesseract.image_to_boxes获取字符坐标,手动定位列边界后拆分文本。
额外优化建议
- 确保Tesseract安装对应语言的训练数据,提升识别准确率。
- 若扫描PDF存在倾斜,可在预处理步骤加入霍夫变换检测角度,对图片做旋转校正。
内容的提问来源于stack exchange,提问作者jare2620
相关产品推荐
相关产品推荐

