Camelot:从pdf中提取表格数据

文章目录:

  • 一、Camelot的介绍和安装
    • 1. Camelot介绍
    • 2. Camelot的安装
    • 3. 其他
  • 二、Camelot的使用
    • 1. 快速入门使用
    • 2. 详细说明
    • 3. camelot两种表格解析(提取)方法
      • 1、流解析(stream)
      • 2、格子解析(lattice)
  • 三、高级使用
    • 1. 处理背景线
    • 1. 处理背景线
    • 2. 可视调试
    • 3. 指定表区域
    • 4. 指定列表分隔符
    • 5. 沿分隔符拆分文本
    • 6. 标记上标和下表
    • 7. 从文本中删除字符
    • 8. 改善猜测的表区域
    • 9. 改进猜测的表行
    • 10. 检测短线
    • 11. 在生成单元格中移动文本
    • 12. 复制跨越单元格中的文本
    • 13. 调整布局生成
  • 四、命令行的使用

工作要效率,大数据时代,获取信息也要效率,只用不断的造轮子,才能不断的提高效率,今天介绍一下一款可以直接从pdf格式的文档中提取表格中数据的工具,Camelot!!!


一、Camelot的介绍和安装

1. Camelot介绍

Camelot: 一个友好的PDF表格数据抽取工具

一个python命令行工具,使任何人都能很轻松的从PDF文件中抽取表格数据。

使用Camelot从PDF文档提取数据非常简单

  • Camelot允许你通过调整设置项来精确控制数据的提取过程
  • 可以根据空白和精度指标来判断坏的表格,并丢弃,而不必手动检查
  • 每一个表格数据是一个panda的dataframe,从而可以很方便的集成到ETL和数据分析工作流中
  • 可以把数据导出为各种不同的格式比如CSV、JSON、EXCEL、HTML

2. Camelot的安装

camelot有三种安装方式:

  • pip 安装
  • conda安装
  • 源码安装
  1. pip 安装

pip install camelot-py[cv]

  1. conda安装

conda install -c conda-forge camelot-py

  1. 源码安装

git clone https://www.github.com/socialcopsdev/camelot
cd camelot
pip install “.[cv]”

注意:

如果后面导入camelot库包的时候,出现错误,可能是缺少Ghostscript包,用pip 安装即可。

3. 其他

源码参考文档:
https://github.com/socialcopsdev/camelot
使用文档:
https://camelot-py.readthedocs.io/en/master/

二、Camelot的使用

1. 快速入门使用

从一个pdf文件中提取出表格:

>>> import camelot
>>> tables = camelot.read_pdf('foo.pdf')
>>> tables
<TableList n=1>
>>> tables.export('foo.csv', f='csv', compress=True) # json, excel, html
>>> tables[0]
<Table shape=(7, 7)>
>>> tables[0].parsing_report
{'accuracy': 99.02,'whitespace': 12.24,'order': 1,'page': 1
}
>>> tables[0].to_csv('foo.csv') # 也可以提取成其他格式 to_json, to_excel, to_html
>>> tables[0].df # 获取一个pandas DataFrame!

2. 详细说明

上面的例子的说明:
1、创建一个表格对象

>>> tables = camelot.read_pdf('foo.pdf')
>>> tables
<TableList n=1>   # 只检测到一个表格

默认情况下,Camelot仅使用PDF的第一页来提取表。要指定多个页面,可以使用pages关键字参数:

>>> camelot.read_pdf('your.pdf', pages='1,2,3')

也可以使用命令行执行相同的操作

camelot --pages 1,2,3 lattice your.pdf

该pages关键字参数接受页面页码的逗号分隔的字符串。还可以指定页面范围 - 例如,pages=1,4-10,20-30或pages=1,4-10,20-end。

注意:

如果pdf文件是加密的表格,需要加入password参数,值为解密密码

>>> tables = camelot.read_pdf('foo.pdf', password='userpass')
>>>tables
<TableList n=1>

命令行:

camelot --password userpass lattice foo.pdf

目前,Camelot仅支持使用ASCII密码和算法代码1或2加密的PDF 。如果无法读取PDF,则抛出异常。这可能是由于未提供密码,密码不正确或加密算法不受支持。


2、查看表的形状(行和列),通过表格索引查看
我们可以使用其索引访问每个表。从上面的代码片段中,我们可以看到该tables对象只有一个表,因为n=1。让我们使用索引访问该表0并查看它shape。

>>> tables[0]
<Table shape=(7, 7)>

3、打印解析报告。

>>> print tables[0].parsing_report
{'accuracy': 99.02,'whitespace': 12.24,'order': 1,'page': 1
}

从解析的参数的评价标准可以得出,其准确性是很好的,空白较少,这意味着表格最有可能被正确提取。可以使用table对象的df属性将表作为pandas DataFrame访问。


4、打印出提取表格中的内容
数据格式是pandas DataFrane,因此用df访问

>>> tables[0].df


5、导出表格中的内容
可以使用其to_csv()方法将表导出为CSV文件。或者可以使用to_json(),或方法表分别导出为JSON格式,Excel,HTML文件或SQLite数据库。方法如下:

  • to_csv()
  • to_json()
  • to_excel()
  • to_html()
  • to_sqlite()
>>> tables[0].to_csv('foo.csv')

上面的1~5 步骤都可以通过命令行直接完成。

camelot --format csv --output foo.csv lattice foo.pdf

使用的pdf例子的传送门:–>here

3. camelot两种表格解析(提取)方法

1、流解析(stream)

Stream可用于解析在单元格之间具有空格的表,以模拟表结构。它建立在PDFMiner的功能之上,即使用边距将页面上的字符分组为单词和句子。

  1. PDF页面上的单词根据其y轴重叠分组为文本行。
  2. 计算文本,然后用于猜测PDF页面上有趣的表区域。您可以阅读Anssi Nurminen的硕士论文,以了解有关此表检测技术的更多信息。[见第20,35和40页]
  3. 然后猜测每个表区域内的列数。这是通过计算每个文本行中的单词数模式来完成的。基于此模式,选择每个文本行中的单词以计算列x范围的列表。
  4. 然后使用位于当前列x范围内/外的单词来扩展当前列列表。
  5. 最后,使用文本行的y范围和列x范围形成表格,并且页面上找到的单词基于其x和y坐标分配给表格的单元格。

2、格子解析(lattice)

格子本质上更具有确定性,并且它不依赖于猜测。它可用于解析在单元格之间划分了行的表,并且它可以自动解析页面上存在的多个表。

它首先使用ghostscriptPDF页面转换为图像,然后通过使用OpenCV应用一组形态变换(侵蚀和膨胀)来处理它以获得水平和垂直线段

下面介绍处理的步骤:
1、检测分割线段

2、通过重叠检测到的线段并叠加"和"它们像素强度来检测线的交叉点

3、通过再次重叠检测到的线段来计算表边界,这次是“或”它们的像素强度。

4、由于PDF页面的尺寸及其图像不同,因此检测到的表格边界,线条交叉点和线段将缩放并转换为PDF页面的坐标空间,并创建表格的表示。

5、使用线段和线交叉检测生成单元。

6、最后,页面上找到的单词将根据其x和y坐标分配给表格的单元格

三、高级使用

1. 处理背景线

1. 处理背景线

2. 可视调试

3. 指定表区域

4. 指定列表分隔符

5. 沿分隔符拆分文本

6. 标记上标和下表

7. 从文本中删除字符

8. 改善猜测的表区域

9. 改进猜测的表行

10. 检测短线

11. 在生成单元格中移动文本

12. 复制跨越单元格中的文本

13. 调整布局生成


四、命令行的使用

camelot --help 查看Camelot 参数使用:
参数说明:

参数 完成参数 参数功能
-q –quiet TEXT 不输出日志和警告
-p –pages TEXT 页数范围,可以用都好分割符,或者页码范围,例如: 1,3,4 or 1,4-end
-pw –password TEXT 解密密码
-o -output TEXT 输出路径
-f –format [csv json
-z –zip 创建
-split –split_text 跨多个单元格拆分文本。
-flag –flag_size 根据字体大小标记文本。有用的检测超/下标。
-strip –strip_text TEXT 将字符串赋值给单元格之前,表格中的字符应该被删除
-M –margins 字符边缘、线边缘、单词边缘



♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

Camelot:从pdf中提取表格数据相关推荐

  1. 怎么提取pdf中的表格数据_如何从pdf第1部分中提取表格数据

    怎么提取pdf中的表格数据 In this article, we talk about the challenges and principles of extracting tabular dat ...

  2. 从 pdf 中提取表格信息、合并、解析、输出数据

    从 pdf 中提取表格信息.合并.解析.输出 pdf 格式浅述 word 文档 与 pdf pdf 文档撰写的优点与难点 从 pdf 中抽取表格所在的页 从 pdf 中抽取表格 合并表格.解析表格.生 ...

  3. Python提取pdf中的表格数据(附实战案例)

    14天阅读挑战赛 今天给大家介绍一个Python使用工具,那就是从pdf文件中读取表格数据,主要用到第三方库 pdfplumber. pdfplumber简介 pdfplumber是一款基于pdfmi ...

  4. python分析pdf年报 货币现金_如何用Python从大量pdf 中提取表格中的数据进行分析?...

    根据一楼答案@森林的建议 说说我的处理经验 我也是借助开源项目tabula,不得不说tabula的功能确实很强大. 我是用Python来处理数据,但是没有用tabula-py,因为表格跨列跨行等情况比 ...

  5. 用Aspose.Words 从Word文档中提取表格数据

    用Aspose.Words 从Word文档中提取表格数据 对于某些项目,开发人员需要从Word文档中提取数据并导出到数据库.最大的挑战是必须支持现有Word文档. 相同格式且带多个数据块的Word文档 ...

  6. java读取pdf多表格_在Java中使用tabula提取PDF中的表格数据

    问题:如何将pdf文件中指定的表格数据提取出来? 尝试过的工具包有:pdfbox.tabula.最终选用tabula 两种工具的比较 pdfbox 其中,pdfbox能将pdf中的内容直接提取成Str ...

  7. python pdfminer读取pdf表格_如何使用PDFMiner从pdf中提取表格?

    我正试图从pdf文档中的一些表中提取信息. 考虑输入:Title 1 some text some text some text some text some text some text some ...

  8. 拷贝pdf中的表格数据

    第一步,新建一个文本文档 a.txt 将数据拷贝到里面 第二步,写个代码,替换所有的空格为制表符 最后,拷贝回来,bingo!

  9. ajax从mysql提取数据在html中_Python骚操作,提取pdf文件中的表格数据!

    在实际研究中,我们经常需要获取大量数据,而这些数据很大一部分以pdf表格的形式呈现,如公司年报.发行上市公告等.面对如此多的数据表格,采用手工复制黏贴的方式显然并不可取.那么如何才能高效提取出pdf文 ...

最新文章

  1. BFS:南土所梁玉婷组综述促进土壤植物生态系统健康的微生物共存理论
  2. java预编译啥意思_java预编译 java jdbc 预编译语句和普通语句的区别
  3. 完成端口模式下的高性能网络服务器【转】
  4. getElementsByclassName
  5. html 怎么自动让图片居中显示,css中怎样让图片居中显示?
  6. vscode 集成终端改成cmd模式
  7. nebula如何实现用in实现any(x,y,z)的效果
  8. Leetcode69场双周赛-第一题5960:标题首字母大写
  9. 常见数控机床的数据采集方法比较
  10. 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享
  11. delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨
  12. A guide to convolution arithmetic for deep learning中译版
  13. MLP多层感知机(人工神经网络)原理及代码实现
  14. Canvas--文字渲染
  15. linux救援模式使用yum,linux学习笔记-第二课-yum,救援模式,单用户模式,运行级别...
  16. 【转】NGUI创建UIRoot后报NullReferenceException的解决办法
  17. ubuntu18.04 server配置静态ip
  18. 如何查看自己已连接WiFi的密码
  19. Codeforces364D Ghd【随机+检验】
  20. Springboot整合Elasticsearch(High-level-Client)

热门文章

  1. 定时器php windows任务计划
  2. 【win32汇编】0x01 开篇一些乱七八糟的话
  3. jQuery Validate 表单验证插件----自定义校验结果样式
  4. (读取,录入)语音处理
  5. git使用-设置项目忽略文件
  6. r型聚类典型指标_聚类与RFM模型 —— 从5月的一道腾讯数据分析面试题说起
  7. 简明python教程百度云-网易云课堂 - 我的职业课堂
  8. 学python心得体会1000字-Python学习心得体会总结,不要采坑
  9. 想学python看什么书-想学习Python做数据分析,应该看哪些书?
  10. python语言编程环境-day02--编程语言的分类与Python开发环境的搭建