如何用Python从含模糊图片的PDF中提取表格并保存为CSV?
从图片型PDF提取表格的解决方案
问题概述
需从仅含扫描图片(无原生文本/表格结构)的PDF中提取表格,现有尝试存在两个问题:
- 使用PyMuPDF(fitz)的
get_images()提取时,每页被拆分为多张小图,表格被截断 - 使用Tabula提取时生成空CSV文件
已尝试代码
PyMuPDF提取图片(拆分问题)
import fitz import os pdf_file_path = os.path.join(os.getcwd(), '1990-01-01 Oil Market Report (IEA).pdf') pdf_file = fitz.open(pdf_file_path) page = pdf_file[1] img_list = page.get_images() for i in range(len(img_list)): if img_list: xref = img_list[i][0] pix = fitz.Pixmap(pdf_file, xref) if pix.n > 4: print("n > 4") pix = fitz.Pixmap(fitz.csRGB, pix) pix.save(f"ocr-images{i}.png")
Tabula提取表格(空文件问题)
tabula.convert_into(path, "output.csv", output_format="csv", stream=True, pages='all')
核心原因
你的PDF是扫描图片型PDF,没有原生的文本或表格结构,Tabula、PyMuPDF的get_images()这类工具无法直接处理:
- Tabula依赖PDF中的文本块定位表格,对纯图片无效
get_images()提取的是PDF中嵌入的分片图片,并非整页渲染结果
可行解决方案
采用「整页渲染为高清图片 + OCR表格识别」的流程:
步骤1:导出整页高清图片
直接渲染整页而非提取嵌入图片,确保表格完整:
import fitz import os pdf_path = os.path.join(os.getcwd(), '1990-01-01 Oil Market Report (IEA).pdf') pdf = fitz.open(pdf_path) for page_num in range(len(pdf)): page = pdf[page_num] # 设置300dpi保证清晰度,适配模糊表格 pix = page.get_pixmap(dpi=300) pix.save(f"full_page_{page_num+1}.png") pdf.close()
步骤2:OCR识别表格并导出CSV
使用Tesseract OCR进行表格识别,以下是基础实现:
- 安装依赖:
pip install pytesseract pandas pillow # 需安装Tesseract OCR引擎,根据操作系统选择对应版本
- 识别代码:
import pytesseract import pandas as pd from PIL import Image # 若Tesseract未在系统PATH中,需指定路径 # pytesseract.pytesseract.tesseract_cmd = r'你的Tesseract安装路径\tesseract.exe' # 加载目标页面图片 img = Image.open("full_page_2.png") # 用Tesseract的结构化输出提取表格数据 ocr_data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DATAFRAME) # 过滤有效文本行,按块分组整理成表格行 valid_rows = ocr_data[ocr_data['text'].notna() & (ocr_data['text'].str.strip() != '')] table_rows = valid_rows.groupby('block_num')['text'].apply(lambda x: ' '.join(x)).tolist() # 导出为CSV pd.DataFrame([row.split() for row in table_rows]).to_csv("extracted_table.csv", index=False)
进阶优化方案
如果基础OCR效果不佳,可尝试:
- 调整图片预处理:对图片进行二值化、降噪处理(用
PIL或opencv-python),提升识别准确率 - 专用表格识别工具:如TableNet(深度学习模型)、云服务商的OCR表格识别API,这类工具对复杂表格的识别效果更好
内容的提问来源于stack exchange,提问作者FaisalShakeel
相关产品推荐
相关产品推荐

