pdfplumber识别表格

参考
pdfplumber是怎么做表格抽取的
利用pdfplumber提取pdf文档内容

介绍pdfplumber

pdfplumber是一款完全用python开发的pdf解析库,基于pdfminer,可以获取每个字符,矩形框,线等对象具体信息,还可以抽取文本和表格。目前pdfplumber仅支持可编辑的pdf文档

示例:

import pdfplumber

with pdfplumber.open("example.pdf") as pdf:
    first_page = pdf.pages[0]
    table_settings = {"intersection_x_tolerance": 1}
    table = first_page.extract_table(table_settings)
    print(table)#列表

常用方法

extract_table()pdfplumber 中用于从 PDF 中提取表格数据的函数。该函数可以接受一个可选的参数字典,用于更精细地控制表格数据的提取过程。下面介绍一些常用的参数:

  • vertical_strategy:用于指定垂直方向上的表格线提取策略,可以是 “lines”、“text” 或 “mixed” 中的任意一种,默认值为 “lines”。
  • horizontal_strategy:用于指定水平方向上的表格线提取策略,可以是 “lines”、“text” 或 “mixed” 中的任意一种,默认值为 “lines”。
  • snap_tolerance:用于指定在表格提取过程中两个元素之间的距离阈值,如果它们之间的距离小于该值,则会被视为同一元素。默认值为 3。
  • join_tolerance:用于指定在表格提取过程中两个单元格相连时的距离阈值,如果它们之间的距离小于该值,则它们将被合并为同一个单元格。默认值为 2。
  • edge_tolerance:用于指定在表格提取过程中一个元素的边缘与页面边缘之间的距离阈值,如果它们之间的距离小于该值,则该元素将被忽略。默认值为 10。
  • min_words:用于指定一个单元格必须包含的最少文本块数目,默认值为 1。
  • snap_x_tolerance:用于在表格提取过程中校正列位置的参数,允许水平方向上的一些偏离。默认值为 None。
  • snap_y_tolerance:用于在表格提取过程中校正行位置的参数,允许垂直方向上的一些偏离。默认值为 None。
  • intersection_x_tolerance:用于调整表格列位置的参数,允许一些列交叉或合并。默认值为 None。

需要注意的是,不同的参数组合可能会产生不同的结果,具体使用时应根据实际情况进行调整。

extract_text 提取字符串,可选keep_blank_chars=True参数,保留空格字符串,在加上正则可以结构化信息

图像显示

im = page.to_image()
table_settings ={}
im.reset().debug_tablefinder(table_settings) #显示表格

安装imagemagick,强大且免费的命令行图片批量处理工具(尤其是pdf图片互相转换)

安装imagemagick https://imagemagick.org/script/download.php#windows

报错:wand.exceptions.DelegateError: FailedToExecuteCommand `“gswin64c.exe” ,缺少了对适量图 栅格化的软件,需要安装一个Ghostscript软件

https://blog.csdn.net/qq_44795036/article/details/125212424
下载ghostscript https://www.ghostscript.com/releases/gsdnld.html

实践

使用pdfplumber包转换excel,注意转换后pdf的换号符会保留。

import pdfplumber
from openpyxl import Workbook
from tqdm import tqdm
data_folder = './pdf/'
 
file_name = data_folder+'**.pdf'
data_name = data_folder+'**.csv'

def analysis_table(pdf_file_path):
    # 打开表格
    workbook = Workbook()
    sheet = workbook.active

    # 打开pdf
    with pdfplumber.open(pdf_file_path) as pdf:
        for page in tqdm(pdf.pages):
            # 提取表格信息
            try:
                table = page.extract_table()
                # print(table)
                # 格式化表格数据
                for i, row in enumerate(table):
                    # 每一页前两行都是表头,不要
                    # 第一页多了行标题,不要
                    if str(page) ==  '' and i== 2:
                        pass
                    elif   i==0 or i==1:
                        ...
                    else:
                        sheet.append(row)
            except:
                break
    workbook.save(filename=data_name)

analysis_table(file_name)
import pandas as pd
import pdfplumber
from openpyxl import Workbook

data_folder = './pdf/'
file_name = data_folder+'xxx.pdf'
data_name = data_folder+'xxx.xlsx'

def analysis_table(pdf_file_path):
    # 打开表格
    all_txt = []
    workbook = Workbook()
    sheet = workbook.active
    with pdfplumber.open(pdf_file_path) as pdf:
        for page in pdf.pages:
            chuli = page.extract_text().split('\n')
            endList = []
            for xw in chuli:
                try:
                    int(xw)
                    endList.append('\n')
                except:
                    endList.append(xw.split(' '))
            # logger.warning('\n'.join(endList))
            print(endList)
            all_txt.append(endList[1:-1]) #列的数量不一定准
    df = pd.DataFrame(sum(all_txt, []),columns=[...])
 
    workbook.save(filename=data_name)

analysis_table(file_name)

你可能感兴趣的:(python,python,开发语言)