pdfminer3k

pdfminer3k 是 pdfminer 的 python3 版本,主要用于读取 pdf 中的文本

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfparser import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregatorfp = open("笨办法学Python(第三版).pdf", "rb")
parser = PDFParser(fp)     # 创建一个与文档相关联的解释器
doc = PDFDocument()        # PDF文档对象,提供密码初始化,没有就不用带password参数。
parser.set_document(doc)   # 链接解释器和文档对象
doc.set_parser(parser)
doc.initialize()           # 初始化文档# 检查文件是否允许文本提取
if not doc.is_extractable:raise PDFTextExtractionNotAllowedresource = PDFResourceManager()    # 创建PDF资源管理器对象来存储共享资源
laparam = LAParams()               # 参数分析器
device = PDFPageAggregator(resource, laparams=laparam)    # 创建一个聚合器
interpreter = PDFPageInterpreter(resource, device)        # 创建PDF页面解释器for page in doc.get_pages():interpreter.process_page(page)  # 使用页面解释器来读取layout = device.get_result()   # 使用聚合器来获取内容for out in layout:if hasattr(out, "get_text"):print(out.get_text())    #打印结果

pdfminer 对于表格的处理非常的不友好,能提取出文字,但是没有格式:

pdf表格截图:

代码运行结果:

想把这个结果还原成表格可不容易,加的规则太多必然导致通用性的下降。

pdfplumber

pdfplumber 是按页来处理 pdf 的,可以获得页面的所有文字,并且提供的单独的方法用于提取表格

import pdfplumberpath = 'test.pdf'
pdf = pdfplumber.open(path)for page in pdf.pages:# 获取当前页面的全部文本信息,包括表格中的文字# print(page.extract_text())                        for table in page.extract_tables():# print(table)for row in table:print(row)print('---------- 分割线 ----------')
pdf.close()

得到的 table 是个 string 类型的二维数组

它可以区分表格,其次,准确率也提高了很多,表头的识别完全正确。对于表格中有换行的,识别还不是很正确,但至少列的划分没问题,所以还是能处理的

import pdfplumber
import repath = 'test1.pdf'
pdf = pdfplumber.open(path)for page in pdf.pages:print(page.extract_text())for pdf_table in page.extract_tables():table = []cells = []for row in pdf_table:if not any(row):# 如果一行全为空,则视为一条记录结束if any(cells):table.append(cells)cells = []elif all(row):# 如果一行全不为空,则本条为新行,上一条结束if any(cells):table.append(cells)cells = []table.append(row)else:if len(cells) == 0:cells = rowelse:for i in range(len(row)):if row[i] is not None:cells[i] = row[i] if cells[i] is None else cells[i] + row[i]for row in table:print([re.sub('\s+', '', cell) if cell is not None else None for cell in row])print('---------- 分割线 ----------')pdf.close()

经过处理后,运行得到结果:

当然对于不同的 pdf,可能需要不同的处理,实际情况还是要自己分析。

pdfplumber 也有处理不准确的时候,主要表现在缺列

pdfplumber 还提供了图形Debug功能,可以获得PDF页面的截图,并且用方框框起识别到的文字或表格,帮助判断PDF的识别情况,并且进行配置的调整。要使用这个功能,还需要安装ImageMagick。因为没有用到,所以暂时没有去细究。

Python处理pdf文件 - pdfminer、pdfplumber相关推荐

  1. (一)python编辑PDF文件:pdfplumber库

    本文参考Github: pdfplumber 库 (一)安装(cmd运行): pip install pdfplumber (二)类 顶层类:pdfplumber.PDF 核心类:pdfplumber ...

  2. (二)python编辑PDF文件:pdfplumber库操作

    文章参考知乎 >> 传送门 (一)字符操作 (1)pdf文件任意页字符提取 import pdfplumber with pdfplumber.open("D:\\Desktop ...

  3. 利用Python提取PDF文件中的文本信息

    如何利用Python提取PDF文件中的文本信息 日常工作中我们经常会用到pdf格式的文件,大多数情况下是浏览或者编辑pdf信息,但有时候需要提取pdf中的文本,如果是单个文件的话还可以通过复制粘贴来直 ...

  4. python读取PDF文件中跨页表格思路分享

    目录 背景 背景知识 实现思路 1.判断当前页面是否以表格结尾 2.判断下一页面是否以表格开头 3.注意事项 参考 背景 最近需要读取PDF文件中的表格,遇到的一个难点之一是如何识别并合并PDF中跨页 ...

  5. nsga2代码解读python_python自动化办公系列 | python操作pdf—— PyPDF2 和 pdfplumber模块(1)...

    看了好多代码,目前为止都是散乱的分享,接下来将整理作为专题,进行系统化的一个分享整理,也是我自己学习的过程.第一个的系统化的分享专题--python办公自动化.代码后面的#所表示的是注释,对本行代码进 ...

  6. 使用Python读取pdf文件

    学习python,不用再为pdf无法转换而烦恼~~~ 下面我们介绍python读取pdf文件(主要是针对文字部分) 1.打开环境 2.安装pdfminer3k包 可以使用jupyter noteboo ...

  7. python读取pdf文件_深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  8. 8、【办公自动化】Python实现PDF文件的批量操作

    说明 平时工作中,经常会和 PDF 文件打交道,比如,合并.拆分.加解密.添加和去除水印.提取指定内容.转换成其他文件格式等操作.如果只是处理单个 PDF 文件的话,有些操作是比较简单的,而如果需要批 ...

  9. 【word2vec】python读取pdf文件,通过词向量寻找相关词语

    1. 什么是Word2vec 对于自然语音处理而言,首先要做的就是将文字转换为计算机能看懂的数字,也就是说,将词语进行数字化. (1)one-hot编码,比较常用的一种编码方式,又叫独热编码. 对于一 ...

最新文章

  1. 【HDU4497 GCD and LCM】
  2. boost::core模块实现分配器解除分配
  3. Java读写二进制文件
  4. Windows 10环境下如何安装CMake?(更新时间:2021.9.13)
  5. java数组查找算法_JAVA数组中查找算法中equals和==的问题
  6. UI_storyboard实现页面回调
  7. Lanczos 法 和 QR分解 求解实对称矩阵特征值
  8. 计算机网络原理(04741)自考学习笔记/备考资料
  9. wex5bex5 ---- (一)
  10. 软考中级软件设计师学习资料分享
  11. win10扬声器红叉_win10系统右下角小喇叭红叉显示扬声器耳机或者耳机已拔出的图文技巧...
  12. python windows开发环境_windows10下搭建Python3.6开发环境
  13. 网站ICP备案与公安备案有什么区别---kalrry
  14. Codeforces Round #789 (Div. 1) B. Tokitsukaze and Meeting
  15. 邓仲祥:神奇魅力的太子山
  16. 【转载】如何巧用IPD,建立完善的产品研发管理体系?
  17. ajaxSubmit提交数据重复
  18. 【ArcGIS微课1000例】0031:ArcGIS中的32个拓扑规则(图文详解)
  19. 浏览器是如何运作的?
  20. CentOS7架设服务器系列

热门文章

  1. 在厦门当小学计算机老师,在厦门当老师,没两把“刷子”还是另谋生路吧!
  2. VS Code代码高亮颜色设置
  3. 易趣已是黄昏落日盖棺瞑目
  4. 2021-12-11 《聪明的投资者》学习笔记-8.投资者与市场波动--波动无法预测
  5. C++学习笔记:成员初始化列表【Cherno】
  6. 加速访问Cloudflare的网站的解决方案
  7. 技术与经济之八:关于优惠与红包
  8. 各类免费资料及书籍索引大全(珍藏版)
  9. c语言入门题目:输出一个短句“Hello World!”
  10. 安卓10拨号流程梳理