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

如何用Python从含模糊图片的PDF中提取表格并保存为CSV?

从图片型PDF提取表格的解决方案

问题概述

需从仅含扫描图片(无原生文本/表格结构)的PDF中提取表格,现有尝试存在两个问题:

  1. 使用PyMuPDF(fitz)的get_images()提取时,每页被拆分为多张小图,表格被截断
  2. 使用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进行表格识别,以下是基础实现:

  1. 安装依赖:
pip install pytesseract pandas pillow
# 需安装Tesseract OCR引擎,根据操作系统选择对应版本
  1. 识别代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:37:55