Python 实战 | 从 PDF 中提取(框线不全的)表格

这篇具有很好参考价值的文章主要介绍了Python 实战 | 从 PDF 中提取(框线不全的)表格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

更多详情请点击查看原文:Python 实战 | 从 PDF 中提取(框线不全的)表格

Python教学专栏,旨在为初学者提供系统、全面的Python编程学习体验。通过逐步讲解Python基础语言和编程逻辑,结合实操案例,让小白也能轻松搞懂Python!
>>>点击此处查看往期Python教学内容

本文目录

一、引言

二、camelot-py 介绍

三、安装 camelot-py

四、camelot-py 使用方法

五、camelot-py 的其他实用参数

六、结束语

七、相关推荐

本文共7015个字,阅读大约需要18分钟,欢迎指正!

一、引言

社科同胞们一定有过收集/整理数据的经历吧,有时候一些原始数据被存放在大量的 PDF 文件中,例如上市公司公告公报中的各种指标信息,但如何快速地从大量的 PDF 中提取出那些表格却是一个难题。在过往的文章中,我们曾向大家分享过使用 Python 的 pdfplumber 库从 PDF 中读取表格的方法(>>>点击查看“一文读懂如何用python读取并处理PDF中的表格”),但经过长期使用,笔者注意到这个库在默认情况下解析时,对表格的要求非常之高。只有当表格的全部框线都存在时才能发挥作用,如果你要读取的表格框线不全,那么读取时极易丢失部分行或列。后来笔者找到了一个在表格框线不全时也能有不错解析效果的工具库,特此与大家分享使用方法和代码。

二、camelot-py 介绍

一个基于 Ghostscript 的库,可以从 PDF 文件中提取表格数据,它使用了一种名为 Lattice 的算法,基于文本的近似排列来解析表,由此实现无框线(或框线不全)表格的解析,解析结果可以直接转为 DataFrame,进而存储为 Excel 表。

三、安装 camelot-py

camelot库的安装命令如下:

pip install camelot-py        # 常规安装方式
pip install camelot-py[cv]    # 常规安装后如果调用报错,卸载后改用此命令,
                              # 表示不仅安装 camelot自身,还会安装其他依赖库

调用时发现camelot依赖PyPDF2库的特定版本,笔者的PyPDF2版本为2.2.2,可以正常运行。

四、camelot-py 使用方法

笔者找到一个仅带有少量框线表格的某上市公司年度报告的 PDF 文件,表格位于第 91 页,如下图:

python怎么解析没有竖线的pdf表格,python,Ghostscript,提取表格

图片来源:《深圳中航地产股份有限公司二○○七年年度报告》-成本法核算的其他股权投资

下面是使用 camelot 读取该表格的 Python 代码:

# 可以不导入 pandas,因为导入该库时会自动导入 pandas
import camelot.io as camelot

# 解析表格
result = camelot.read_pdf(
            filepath="001914_2007-12-31_2007.pdf",  # 94
            pages='94',            
            flavor='stream',        
            edge_tol=200,           
                         )
                         
# 解析结果中可能包含多个表格,下面把解析到的第一个表格转为 DataFrame
# 如果解析结果中不含表格,那么将会报错
df = result[0].df
df

解析结果如下图:

python怎么解析没有竖线的pdf表格,python,Ghostscript,提取表格

 

从解析结果来看,效果十分不错,唯一的问题在于表头的解析,这就需要对解析结果进行二次清洗,但总的来说效果已经很喜人了。

五、camelot-py 的其他实用参数

让人欣喜的是,camelot并不是一个解析结果只能“看脸”的工具库,它还提供了很多可以干预或优化解析结果的参数,笔者将其中几个必要和实用的参数罗列在下表。

参数名称

取值

描述

filepath

字符串

pdf 文件路径。

pages

字符串,如"91"、"1,2,3"、"91-end"、"all"

从 1 开始算,必须是字符串,可以一次性解析多页,例如:'1,2,3'、'91-end'(表示从91页到最后一页)、'all'(全部页)。

flavor

'lattice''stream';默认值为 lattice

针对不同类型的PDF表格指定解析方式,可选参数有'lattice'(格子解析)和'stream'(流解析),前者适用于解析带有完整框线的表格,后者常用于解析框线不全的表格。

edge_tol

数字,默认值为 100

指定表格边缘容差(边缘容忍度)。它是一个浮点数,用于控制识别表格边缘的容差范围。默认值为 100,如果表格的某两行之间间隙稍大,导致表格解析被解析为多个表格,那么可以释放增加该参数的值,避免读取的表格不完整;或者减少参数值,这样当多个表之间的间隙不是特别大时也可以将其分开。

split_text

True 或 False,默认值为 True

当单元格中有分行的文本时,是否应该将它们分为多个单元格。

strip_text

字符串,默认值为 空字符 ''

去除单元格中的指定字符,默认值为'',即不清洗,如果需要取出多种不需要的字符,那么直接将多个字符组合成一个字符串传入即可。

camelot库还有其他有用的参数,如果大家感兴趣,可以去查看源代码,笔者将源码中的参数介绍附在下方:

"""
Read PDF and return extracted tables.

    Note: kwargs annotated with ^ can only be used with flavor='stream'
    and kwargs annotated with * can only be used with flavor='lattice'.

    Parameters
    ----------
    filepath : str
        Filepath or URL of the PDF file.
    pages : str, optional (default: '1')
        Comma-separated page numbers.
        Example: '1,3,4' or '1,4-end' or 'all'.
    password : str, optional (default: None)
        Password for decryption.
    flavor : str (default: 'lattice')
        The parsing method to use ('lattice' or 'stream').
        Lattice is used by default.
    suppress_stdout : bool, optional (default: True)
        Print all logs and warnings.
    layout_kwargs : dict, optional (default: {})
        A dict of `pdfminer.layout.LAParams <https://github.com/euske/pdfminer/blob/master/pdfminer/layout.py#L33>`_ kwargs.
    table_areas : list, optional (default: None)
        List of table area strings of the form x1,y1,x2,y2
        where (x1, y1) -> left-top and (x2, y2) -> right-bottom
        in PDF coordinate space.
    columns^ : list, optional (default: None)
        List of column x-coordinates strings where the coordinates
        are comma-separated.
    split_text : bool, optional (default: False)
        Split text that spans across multiple cells.
    flag_size : bool, optional (default: False)
        Flag text based on font size. Useful to detect
        super/subscripts. Adds <s></s> around flagged text.
    strip_text : str, optional (default: '')
        Characters that should be stripped from a string before
        assigning it to a cell.
    row_tol^ : int, optional (default: 2)
        Tolerance parameter used to combine text vertically,
        to generate rows.
    column_tol^ : int, optional (default: 0)
        Tolerance parameter used to combine text horizontally,
        to generate columns.
    process_background* : bool, optional (default: False)
        Process background lines.
    line_scale* : int, optional (default: 15)
        Line size scaling factor. The larger the value the smaller
        the detected lines. Making it very large will lead to text
        being detected as lines.
    copy_text* : list, optional (default: None)
        {'h', 'v'}
        Direction in which text in a spanning cell will be copied
        over.
    shift_text* : list, optional (default: ['l', 't'])
        {'l', 'r', 't', 'b'}
        Direction in which text in a spanning cell will flow.
    line_tol* : int, optional (default: 2)
        Tolerance parameter used to merge close vertical and horizontal
        lines.
    joint_tol* : int, optional (default: 2)
        Tolerance parameter used to decide whether the detected lines
        and points lie close to each other.
    threshold_blocksize* : int, optional (default: 15)
        Size of a pixel neighborhood that is used to calculate a
        threshold value for the pixel: 3, 5, 7, and so on.

        For more information, refer `OpenCV's adaptiveThreshold <https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#adaptivethreshold>`_.
    threshold_constant* : int, optional (default: -2)
        Constant subtracted from the mean or weighted mean.
        Normally, it is positive but may be zero or negative as well.

        For more information, refer `OpenCV's adaptiveThreshold <https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#adaptivethreshold>`_.
    iterations* : int, optional (default: 0)
        Number of times for erosion/dilation is applied.

        For more information, refer `OpenCV's dilate <https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html#dilate>`_.
    resolution* : int, optional (default: 300)
        Resolution used for PDF to PNG conversion.

    Returns
    -------
    tables : camelot.core.TableList
"""

六、结束语

提取 PDF 中的表格是研究工作中的一项基础技术工作,传统的表格解析方法难以解决表格框线不全的问题,所以能解析的表格十分有限,而类似于 camelot 这种基于视觉的表格解析方式则强大很多。不过使用 camelot 时也会遇到一些奇怪的问题,例如目录等一些非表格文本可能也会被识别为表格,所以在应用中还需要根据实际情况选择最合适的工具库。

如果你想学习各种 Python 编程技巧,提升个人竞争力,那就加入我们的数据 Seminar 交流群吧,欢迎大家在社群内交流、探索、学习,一起进步!同时您也可以分享通过数据 Seminar 学到的技能以及得到的成果。

注:请查看原文Python 实战 | 从 PDF 中提取(框线不全的)表格,以获取客服联系方式。

七、相关推荐

Python 教学

  • Python 教学 | 学习 Python 第一步——环境安装与配置

  • Python 教学 | Python 基本数据类型

  • Python 教学 | Python 字符串操作(上)

  • Python 教学 | Python 字符串操作(下)

  • Python 教学 | Python 变量与基本运算

  • Python 教学 | 组合数据类型-列表

  • Python 教学 | 组合数据类型-集合(内含实例)

  • Python 教学 | 组合数据类型 - 字典&元组

  • Python 教学 | Python 中的分支结构(判断语句)

  • Python 教学 | Python 中的循环结构(上)

  • Python 教学 | Python 中的循环结构(下)

  • Python 教学 | Python 函数的定义与调用

  • Python 教学 | Python 内置函数

  • Python 教学 | 最常用的标准库之一 —— os

  • Python 教学 | 盘点 Python 数据处理常用标准库

  • Python 教学 | “小白”友好型正则表达式教学(一)

  • Python 教学 | “小白”友好型正则表达式教学(二)

  • Python 教学 | “小白”友好型正则表达式教学(三)

  • Python 教学 | 数据处理必备工具之 Pandas(基础篇)

  • Python 教学 | 数据处理必备工具之 Pandas(数据的读取与导出)

  • Python 教学 | Pandas 数据索引与数据选取

  • Python 教学 | Pandas 妙不可言的条件数据筛选

  • Python 教学 | Pandas 缺失值与重复值的处理方法

  • Python 教学 | Pandas 表格数据行列变换

  • Python 教学 | Pandas 表格字段类型精讲(含类型转换)

  • Python 教学 | Pandas 数据合并(含目录文件合并案例)

  • Python 教学 | Pandas 数据匹配(含实操案例)

  • Python 教学 | Pandas 函数应用(apply/map)【上】

  • Python 教学 | Pandas 函数应用(apply/map)【下】

  • Python 教学 | Pandas 分组聚合与数据排序

  • Python 教学 | Pandas 时间数据处理方法

  • Python 教学 | 列表推导式 & 字典推导式

  • Python 教学 | 一文搞懂面向对象中的“类和实例”

  • Python 教学 | Python 学习路线+经验分享,新手必看!

  • Python 教学 | 解密 Windows 中的 Path 环境变量

Python实战

  • Python实战 | 如何使用 Python 调用 API

  • Python 实战 | 使用正则表达式从文本中提取指标

  • 大数据分析 | 用 Python 做文本词频分析

  • 数据治理 | 从“今天中午吃什么”中学习Python文本相似度计算

  • 数据治理 | 省下一个亿!一文读懂如何用python读取并处理PDF中的表格(赠送本文所用的PDF文件)

  • 数据治理 | 还在人工识别表格呢?Python 调用百度 OCR API 又快又准

  • 数据治理 | 如何用 Python 批量压缩/解压缩文件

  • 案例分享:使用 Python 批量处理统计年鉴数据(上)

  • 案例分享:使用 Python 批量处理统计年鉴数据(下)

  • Python 实战 | ChatGPT + Python 实现全自动数据处理/可视化

  • ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙

  • Python 实战 | 文本分析之文本关键词提取

  • Python 实战 | 文本分析工具之HanLP入门

  • Python 实战 | 进阶中文分词之 HanLP 词典分词(上)

  • Python 实战 | 进阶中文分词之 HanLP 词典分词(下) 

  • ​​​​​​Python实战 | 文本文件编码问题的 Python 解决方案 

数据可视化 

  • 数据可视化 | 讲究!用 Python 制作词云图学问多着呢

  • 数据可视化 | 地址数据可视化—教你如何绘制地理散点图和热力图

  • 数据可视化 | 太酷了!用 Python 绘制3D地理分布图

  • 数据可视化 | 用 Python 制作动感十足的动态柱状图

  • 数据可视化 | Python绘制多维柱状图:一图展示西部各省人口变迁【附本文数据和代码】

  • 数据可视化 | 3D 柱状图一览各省农民合作社存量近十年变化文章来源地址https://www.toymoban.com/news/detail-851298.html

到了这里,关于Python 实战 | 从 PDF 中提取(框线不全的)表格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python提取PDF中部分页面的实战代码

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年01月16日
    浏览(40)
  • Android Dialog 显示不全的问题

    前言:开发的时候发现一些运行到手机里的dialog显示不全,只显示一半左右  问了下chatgpt发现没有任何头绪,于是开始自己慢慢分析 显示去掉了原有的dialog的style发现问题解决了,但在原有基础上如何解决呢? 先看看xml,发现设置了宽高都不起作用 使用LayoutInspector查看发现

    2024年01月23日
    浏览(56)
  • 任务管理器显示不全的解决方案

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年02月08日
    浏览(36)
  • show processlist 显示的MySQL语句不全的解决方法

    使用 show processlist 命令时显示MySQL语句不全,可以通过 show full processlist 命令解决。

    2024年01月21日
    浏览(35)
  • 【新知】chatGPT 使用笔记(一)——文本代码显示不全的问题解决

    在网页使用chatGPT生成比较长的文本和代码时,出现显示不全的问题。 官方给出的原因和解决办法如下: ChatGPT生成的代码可能因为输出长度限制而显示不全,这是因为在许多平台上,输出的长度有限制,如果超出了限制,则会被截断。 为了解决这个问题,您可以尝试以下方

    2023年04月24日
    浏览(63)
  • 使用gradio创建一个提取pdf、excel中表格数据的demo

    在线体验地址 (https://swanhub.co/patch/TabularScan/demo) 大家可以在上面的链接中试用,需求不大也不用自己弄代码了。 后续大家如果有一些代码或功能想快速部署、提供服务,不管是 AI 项目或是 web 项目,也可以直接托管在 swanhub开源社区 上,方便快捷,而且免费 最近需要对pdf、

    2024年02月09日
    浏览(54)
  • 解决Android中使用RecyclerView滑动时底部item显示不全的问题

    感觉这个bug是不是因人而异啊,找了很多文章都没能解决我的问题,包括在RecyclerView上在嵌套上一层RelativeLayout,添加属性android:descendantFocusability=”blocksDescendants”,使用ConstraintLayout布局包裹RecyclerView,再设置layout_height=\\\"0dp\\\"和layout_constraintBottom_toBottomOf=\\\"parent\\\"(就是指定约束

    2024年02月16日
    浏览(42)
  • 解决:Android Studio 中sdk tools 中库显示不全的问题

    如下图,打开配置后显示不全 这是网络问题,由于Android Studio是goolge旗下的产品,多少需要向外访问 通过更改hosts文件即可,用记事本打开,末尾添加如下三行 大功告成! 建议挂个tizi试试

    2024年02月07日
    浏览(41)
  • echarts柱状图坐标轴的内容太长导致显示不全的两种解决办法

     情况一:坐标上的内容是文字时 如上图这样一个横向的柱状图,y坐标轴的内容太长后会导致显示不全。 因为数据是由后端传过来的,有些会很长有些会比较短,如果只是一味的调整grid会导致短数据前的留白过于多,布局不合理。这个时候就需要用一些别的属性。 解决办法

    2024年02月06日
    浏览(40)
  • Java 生成各种 PDF 实战方案(图片、模板、表格)

    本篇文章的重点还是在讲通过java生成pdf,其实如果是单纯的模板填充挺简单的,但是又要填充模板还要动态生成表格就比较麻烦了,因为如果在模板中画表格的框去生成的话,超过模板框的位置就会隐藏,我刚接到需求的时候也是有点难受,在网上也是找了大量的资料,研究

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包