python能做的100件事04 - python解析PDF

news2024/12/23 9:36:36

1. python常用pdf库

名称特点
PyPDF2已不再维护,继任者PyPDF4 ,但很长时间没有更新了,能读不能写
pdfrw能读不能写,但可以兼容ReportLab写
ReportLab商业版的开源版本,能写不能读
pikepdf能读不能写
pdfplumber能读不能写
PyMuPDF读写均可,基于GPL协议
borb纯Python库,支持读、写,基于GPL协议

其中前几种偏重于读或者写,PyMuPDF和borb读写兼具,但这两个库都基于GPL开源协议,对于商业开发不太友好。

介绍之前,我们通过读取一个已有的PDF中的文字来测试下时提取内容的准确度,pdfrw暂时跳过,因为没有找到其提取文本的api。ReportLab不能读,跳过。

2.读取测试

准备的测试的PDF,截图展示的是第5页内容:
在这里插入图片描述

2.1 PyPDF2 示例及结果

#!/usr/bin/python
from PyPDF2 import PdfReader
pdf = PdfReader("yz.pdf")
page = pdf.pages[4]
print(page.extract_text())

内容被正确读取,但是格式变为每行一个字。

在这里插入图片描述

2.2 PyPDF4 示例及结果

from PyPDF4 import PdfFileReader

pdf = open('yz.pdf','rb')
reader = PdfFileReader(pdf)
page = reader.getPage(4)
print(page.extractText().strip())

在这里插入图片描述
PyPDF4 输出的是内容流,暂无法解析为文本.

2.3 pikepdf

pikepdf 的官方文档上有这么一段话:

If you guessed that the content streams were the place to look for text inside a PDF – you’d be correct. 
Unfortunately, extracting the text is fairly difficult because content stream actually specifies as a font 
and glyph numbers to use. Sometimes, there is a 1:1 transparent mapping between Unicode numbers and 
glyph numbers, and dump of the content stream will show the text. In general, you cannot rely on there 
being a transparent mapping; in fact, it is perfectly legal for a font to specify no Unicode mapping 
at all, or to use an unconventional mapping (when a PDF contains a subsetted font for example).

We strongly recommend against trying to scrape text from the content stream.

pikepdf does not currently implement text extraction. We recommend pdfminer.six, a read-only 
text extraction tool. If you wish to write PDFs containing text, consider reportlab.

如果您猜测内容流是在PDF中查找文本的地方,那么您是正确的。不幸的是,提取文本相当困难,因为内容流实际上指定了要使用的字体和字形
数字。有时,Unicode数字和字形数字之间有1:1的透明映射,内容流的转储将显示文本。一般来说,你不能依赖于一个透明的映射;事实上,
字体完全可以不指定Unicode映射,或者使用非常规的映射(例如,当PDF包含一个子集字体时)。

我们强烈建议不要尝试从内容流中抓取文本。

Pikepdf目前不实现文本提取。我们推荐pdfminer。一个只读文本提取工具。如果您希望编写包含文本的pdf,请考虑reportlab。

2.4 pdfplumber 示例和结果

import pdfplumber

with pdfplumber.open("yz.pdf") as pdf:
    page = pdf.pages[4]
    chars = page.chars
    content = ''
    for char in chars:
        content += char['text']
    print(content)

pdfplumber是按字符读取,上面的示例代码中是对字符进行了拼接。结果如下:
在这里插入图片描述

2.5 PyMuPDF 示例及结果

import fitz
doc = fitz.open("yz.pdf")
page = doc.load_page(4)
text = page.get_text("text")
print(text)

这是目前提取文本结果最完美的一个:

$ python e6.py
1897年,在这里,什么都没有发生。
——科罗拉多州伍迪克里克小旅馆墙壁上的牌匾

2.6 borb示例及结果

以下示例代码为官方示例代码:

import typing
from borb.pdf import Document
from borb.pdf import PDF
from borb.toolkit import SimpleTextExtraction

def main():
    # read the Document
    doc: typing.Optional[Document] = None
    l: SimpleTextExtraction = SimpleTextExtraction()
    with open("yz.pdf", "rb") as in_file_handle:
        doc = PDF.loads(in_file_handle, [l])

    # check whether we have read a Document
    assert doc is not None

    # print the text on the first Page
    print(l.get_text()[4])
if __name__ == "__main__":
    main()
  # 处理字体时报错
  File "/home/eva/.local/lib/python3.11/site-packages/borb/pdf/canvas/font/composite_font/font_type_0.py", line 86, in character_identifier_to_unicode
    assert encoding_name in ["Identity", "Identity-H"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError

鉴于以上测试结果,接下来的演示中将使用pdfplumber + Reportlab 来进行.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue面试题2

1:vue.js的两个核心是什么? 答:数据驱动和组件化。 2:vue生命周期钩子函数有哪些? 答:总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后 3:第一次页面加载会触发哪几个钩子…

C语言二维数组中:主次对角线求和,上下三角求和,杨辉三角,矩阵转置

p8 有些的结论需要直接记住 目录 矩阵转置 主对角线和次对角线 下三角 和上三角(一般是让求和) 下三角 上三角 杨辉三角 矩阵转置 不是方阵 需要用到第二个二维数组 b[i][j]a[i][j] 是方阵 方法1 借助第二个二维数组,同上 方…

C++基础-3函数

一、函数 1.概述 作用:将一段经常使用的代码封装起来,减少重复代码 而一个较大的程序,一般分为若干个代码块,每个模块实现特定的功能 2.定义 5个内容: ①返回值类型 ②函数名 ③参数列表 ④函…

力扣刷题记录——1287. 有序数组中出现次数超过25%的元素、1299. 将每个元素替换为右侧最大元素 、1413. 逐步求和得到正数的最小值

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——1287. 有序数组中出现次数超过25%的元素…

【vector的模拟实现】

目录 1 类的成员变量 2 常用成员函数和迭代器 3 增删查改 3.1 reverse 3.2 push_back 3.3 resize 3.4 insert && erase 4 默认成员函数 4.1 构造函数 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构函数 前面我们详细介绍了string类的使用,vector的…

关于 JSON 数据格式的完全使用指南

前言 本文将对 JSON 的语法、解析、序列化进行详细的说明,帮助大家掌握 JSON 的使用方式。 如果文中有不对、疑惑或者错字的地方,欢迎在评论区留言指正🌻 一、JSON简介 在 JSON 之前,XML 曾经一度成为互联网上传输数据的事实标…

【论文阅读】【剪枝】Learning Efficient Convolutional Networks through Network Slimming

摘要 深度卷积神经网络(CNN)在许多实际应用中的部署在很大程度上受到其高计算成本的阻碍。在本文中,我们提出了一种新的神经网络学习方案,以同时1)减小模型大小;2) 减少运行时内存占用&…

Kali Linux- 社会工程及压力工具教程

在本章中,我们将了解 Kali Linux 中使用的社会工程工具。 文章目录社会工程Kali Linux - 压力工具SlowhttptestinvitefloodTHC-SSL-DOS总结社会工程 社会工程师工具包 (SET) 是一个专为社会工程设计的开源渗透测试框架。SET具有许多自定义攻…

第九章(12):STL之常用查找算法

文章目录前情回顾常用查找算法findfind_ifadjacent_findbinary_searchcountcount_if下一座石碑🎉welcome🎉 ✒️博主介绍:一名大一的智能制造专业学生,在学习C/C的路上会越走越远,后面不定期更新有关C/C语法&#xff0…

读懂用户之用户调研怎么做?(内附模板教程)

随着互联网的发展,不管是做产品设计、运营,还是市场推广,我们都需要思考的是“用户真正想要的是什么?”。这时候,用户调研的重要性就凸显出来了。 一、什么是用户调研 用户调研,指通过各种方式得到受访者的…

Redis常用指令

3. 常用指令 在这部分中呢,我们家学习两个知识,第一个是key的常用指令,第二个是数据库的常用指令。和前面我们学数据类型做一下区分,前面你学的那些指令呢,都是针对某一个数据类型操作的,现在学的都是对所…

#14环形链表#

环形链表 1题目链接 链接 2思路 slow和fast指向链表的开始 slow一次走一步 fast一次走两步 不带环 fast就会为空 带环 fast就会在环里追上slow 3实现 bool hasCycle(struct ListNode* head) {struct ListNode* slow head, * fast head;while (fast && fast->ne…

微信小程序学习第3天——网络数据请求

一、小程序网络请求限制 1、必须https类型的接口 2、必须将接口的域名添加到信任列表中 二、配置request合法域名 配置步骤:登录微信小程序管理后台 -> 开发 -> 开发设置 -> 服务器域名 -> 修改 request 合法域名 点击修改request合法域名&#xf…

【自动化测试】从0开始玩转docker—— 01软件安装

目的 CI / CD在目前各类互联网企业中已然成为推动软件开发行为的重要基础设施服务。同样的对于测试团队来说更是有着举足轻重的重大意义,无论是测试左移的具象化提现亦或是持续测试的顺利开展,掌握这一技能已是广大软件测试工程师的必修课。分享这一技术…

Springboot+Vue+Uniapp自媒体视频系统

简介:本项目采用了基本的springbootvueuniapp设计的自媒体系统。详情请看主要截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringbootVueUniapp自媒体视频系统源码作者LHL项目类型Java EE项目 …

C++vector容器

目录 1.vector基本概念 2.构造函数 3.vector赋值操作,,assign 4.vector容量和大小 ,empty,capacity,size,resize 5.vector的插入和删除,push_back,pop_back,insert,erase,clear 6.vector数据存取,at,[],遍历 7.vector互换…

C++之引用(上)

文章目录前言一、引用二、引用的写法三、引用特性1.引用在定义时必须初始化2. 一个变量可以有多个引用3. 引用一旦引用一个实体,再不能引用其他实体三、引用的权限(含例子)四、常引用总结前言 今天要介绍的是C中的一个新概念——引用。 一、…

MobaXterm使用指南

MobaXterm使用指南 1. 介绍 通俗的来讲,MobaXterm就是一款SSH客户端,它帮助我们在Windows操作系统下去连接并操作Linux服务器。MobaXterm 又名 MobaXVT,是一款增强型终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。MobaXterm 可以开启多…

Django网页+Yolov5垃圾识别系统

Django网页Yolov5垃圾识别系统如需安装运行环境或远程调试&#xff0c;见文章底部个人微信或QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<Django网页Yolov5垃圾识别系统>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

代码随想录NO33 |Leetcode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

贪心LeetCode_860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球今天是贪心第四天的题了&#xff0c;快开始dp了&#xff01;大头啊&#xff01; 860.柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&am…