python解析pdf,pdfplumber和tabula

最近做了一个需要解析财报pdf的项目,财报的格式大致一样,但是具体细节会有略微不同。

原本是使用pdfplumber来做,做到一半,发现 pdfplumber对于分页了的表格处理很不友好。

原本处理分页的表格,是将上一页的最后一个表格和下一页的第一个表格拼接,但是 pdfplumber 解析的表格出现乱序的情况,最后一个表格的位置出现在解析出的表格列表中间位置,导致合并表格数据失败。

所以中途又重新开始找解析框架,找到了 tabula,这个对于表格处理的某些方面比 pdfplumber 好,至少不会出现表格乱序的情况。

但是这个框架只支持pdf表格解析,不支持文字解析,所以最终还是 pdfplumber 和 tabula 混合使用。

总结来说:

pdfplumber:

优点:

  1. 对于文字的解析非常优秀,没有发现错字漏字的情况
  2. 对于普通表格的解析也很棒

缺点:

  1. 对于表格分页的情况处理很薄弱
  2. 合并单元格的表格解析会不够理想,但是效果还是要比tabula好。
  3. 有一个可视化表格工具,但那个工具巨难装,我装了一天半都没成功。

tabula:

优点:

  1. 专门用于处理pdf里的表格,对于表格分页的情况很理想
  2. 表格结果使用pandas的DataFrame数据格式包装,处理数据很强大。
  3. 有一个可视化应用exe,安装即可用(我没用过

缺点:

  1. pandas的DataFrame很强大是没错,但是对于不熟悉的人来说学习成本也很高。
  2. 合并单元格的表格形式,解析效果非常差劲,数据出现过缺失和乱序的情况
  3. 是java编写的,所以依赖于jdk

简单示例:

pdfplumber,文档地址:https://github.com/jsvine/pdfplumber

# 解析pdf
with pdfplumber.open("abc.pdf") as pdf:
    # 拿到第一页的对象
    page = parse_pdf.pages[0]
    # 拿到这一页的文本数据
    text = page.extract_text()
    # 拿到这一页的所有表格数据
    tables = page.extract_tables()
    # 遍历表格
    for t_index in range(len(tables)):
        table = tables[t_index]
        # 遍历每一行的数据
        for data in table:
            print(data)

tabula,文档地址:https://aegis4048.github.io/parse-pdf-files-while-retaining-structure-with-tabula-py

# 解析表格, stream表示流模式识别(建议),guess为猜测,pages是页面下标,从1开始
# multiple_tables是需不需要识别多个表格
tables = tabula.read_pdf(pdf_path, stream=True, guess=True, pages=    [1,2],multiple_tables=True)
    # 遍历表
    for table in tables:
        # 通过表格内置下标迭代器来遍历下标(也可能不是下标,而是id
        for index in table.index:
            # 获取下标所属那一行的值
            data = table.loc[index].values

彩蛋(tabula 表格去除全部为空的行和列):

def format_data_frame(table):
    """
    格式化data_frame表格,删除全部为空的行和列
    :return:
    """
    all_data = table.isna()
    for t_index in all_data.index:
        data = all_data.loc[t_index].values
        if all(data):
            table = table.drop([t_index], axis=0, inplace=False)

    for clo_name in all_data.columns:
        data = all_data[clo_name]
        if all(data):
            table = table.drop(clo_name, axis=1, inplace=False)
    return table

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种开源的编程语言,可以使用它实现各种数据处理和分析任务,包括处理PDF文件。在处理PDF文件,需要提取其中的表格和文字内容,这就需要使用Python的相关库。 有许多Python库可以用于处理PDF文件,其中比较流行的包括PyPDF2、pdfminer、pypdfocr等。这些库提供了一些方便的功能,例如提取PDF文件中的文字、获取PDF文件中的表格等。 在实现同提取表格和文字,可以使用Tabula-py和PDFplumber这两个库。Tabula-py提供了一种简单的方式来提取PDF文件中的表格,它可以识别文本表格并将其转换为CSV、JSON以及HTML格式。PDFplumber则可以对PDF文件进行更加全面的处理,它可以提取PDF文件中的文字、图片、表格等内容。 使用Tabula-py库实现提取表格的示例代码如下: ``` import tabula # 设置参数 pdf_file = "example.pdf" output_file = "example.csv" # 读取表格 df = tabula.read_pdf(pdf_file, pages='all') # 将表格转换为CSV格式并保存到磁盘 df.to_csv(output_file, index=False, encoding='utf-8') ``` 使用PDFplumber库实现提取文字的示例代码如下: ``` import pdfplumber # 设置参数 pdf_file = "example.pdf" # 打开PDF文件 with pdfplumber.open(pdf_file) as pdf: # 遍历每一页 for page in pdf.pages: # 提取文字 text = page.extract_text() # 输出结果 print(text) ``` 以上示例演示了如何使用Python库实现同提取PDF文件中的表格和文字内容。根据具体的需求,可以选择合适的库进行处理,并将其集成到自己的应用程序中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值