程序员学习之在Python中使用PDF:阅读、旋转、合并和拆分
off999 2024-09-21 20:59 32 浏览 0 评论
私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包。
PDF 文档格式
今天,可移植文档格式(PDF)属于最常用的数据格式。 1990年,Adobe定义了PDF文档格式。 PDF格式背后的想法是传输的数据/文档对于通信过程中涉及的双方——创建者,作者或发送者和接收者来说看起来完全相同。 PDF是PostScript格式的后续版本,标准化为ISO 32000-2:2017。
处理PDF文档
对于Linux,有很多可用的命令行工具,如pdftk和pdfgrep来操作pdf。 作为开发人员,您可以构建自己的基于Python的软件,并使用免费提供的PDF库。
本文是一个小系列的开头,将介绍这些有用的Python库。 在第一部分中,我们将重点介绍现有PDF的操作。 您将学习如何阅读和提取内容(文本和图像),旋转单个页面以及将文档拆分为单独的页面。 第二部分将介绍如何根据叠加层添加水印。 第三部分将专注于编写/创建PDF,还将包括删除和重新组合单个页面到新文档。
工具和库
Python相关的PDF工具,模块和库的可用解决方案范围有点令人困惑,需要花一点时间来弄清楚什么是什么,以及哪些项目是持续维护的。 根据我们的研究,这些是目前最新的方案:
PyPDF2:这是一个Python库,用于提取文档信息和内容,逐页拆分文档,合并文档,裁剪页面和添加水印。 PyPDF2支持未加密和加密的文档。
PDFMiner:完全用Python编写,适用于Python 2.4。对于Python 3,请使用克隆包PDFMiner.six。这两个包都允许您解析,分析和转换PDF文档。包括对PDF 1.7以及CJK语言(中文,日文和韩文)以及各种字体类型(Type1,TrueType,Type3和CID)的支持。
PDFQuery:它将自己描述为“一个快速且友好的PDF抓取库”,它作为PDFMiner,lxml和pyquery的包装器实现。它的设计目标是“用尽可能少的代码可靠地从PDF集合中提取数据。”
tabula-py:它是tabula-java的简单Python包装器,可以从PDF中读取表并将它们转换为Pandas DataFrames。它还允许您将PDF文件转换为CSV / TSV / JSON文件。
pdflib for Python:Poppler库的扩展,为它提供Python绑定。它允许您解析,分析和转换PDF文档。不要与其同名的商业吊坠相混淆。
PyFPDF:用于在Python下生成PDF文档的库。从FPDF PHP库移植,一个众所周知的PDFlib扩展替换,包含许多示例,脚本和衍生产品。
PDFTables:一种商业服务,提供从PDF文档中提取的表格。提供API以便PDFTable可以用作SAAS。
PyX - Python图形包:PyX是一个用于创建PostScript,PDF和SVG文件的Python包。它结合了PostScript绘图模型的抽象和TeX / LaTeX接口。这些基元构建了复杂的任务,例如以发布就绪质量创建2D和3D图。
ReportLab:一个雄心勃勃的工业级图书馆,主要致力于精确创建PDF文档。可作为开源版本以及名为ReportLab PLUS的商业增强版本免费提供。
PyMuPDF(又名“fitz”):MuPDF的Python绑定,它是一个轻量级的PDF和XPS查看器。该库可以访问PDF,XPS,OpenXPS,epub,漫画和小说书籍格式的文件,并以其顶级性能和高渲染质量而闻名。
pdfrw:一种基于Python的纯PDF解析器,用于读写PDF。它忠实地再现了矢量格式而没有光栅化。与ReportLab结合使用,有助于在使用ReportLab创建的新PDF中重复使用现有PDF的部分内容。
下面我们将重点介绍PyPDF2和PyMuPDF,并解释如何以最简单的方式提取文本和图像。 为了理解PyPDF2的用法,官方文档和其他资源提供的大量示例的组合。 相比之下,官方的PyMuPDF文档更清晰,使用库的速度要快得多。
用PyPDF2提取文档
PyPDF2可以作为常规软件包安装,也可以使用pip3(适用于Python3)安装。 这里的测试基于即将推出的Debian GNU / Linux版本10“Buster”的软件包。 Debian软件包的名称是python3-pypdf2。
下面的代码首先导入PdfFileReader 类,然后适用这个类打开文件,用getDocumentInfo() 方法来提取文档信息,包括页数和首页内容。
请注意PyPDF2页码计数从0开始,这也是为什么pdf.getPage(0) 函数可以获取文件的第一页。最终,提取到的信息被打印到了stdout。
使用PyMuPDF提取文本
PyMuPDF可从PyPi网站获得,您可以在终端中使用以下命令安装包:
显示文档信息,打印页数和提取PDF文档的文本的方式与PyPDF2类似(参见清单2)。 要导入的模块名为fitz,并返回到PyMuPDF的先前名称。
PyMuPDF的优点在于它保持原始文档结构的完整性 - 带有换行符的整个段落保留在PDF文档中。
使用PyMuPDF从PDF中提取图像
PyMuPDF使用getPageImageList()方法简化了从PDF文档中提取图像的过程。下面的代码来源于PyMuPDF wiki页面的示例,并逐页提取并保存PDF中的所有图像作为PNG文件。 如果图像具有CMYK颜色空间,则首先将其转换为RGB。
在400页PDF上运行这个Python脚本,它在不到3秒的时间内提取了117个图像,这是惊人的。 各个图像以PNG格式存储。 为了保持原始图像格式和大小,而不是转换为PNG,请查看PyMuPDF wiki中脚本的扩展版本。
如何旋转页面?
有时候PDF是横向模式而不是纵向模式,甚至是颠倒的。当有人扫描文档为PDF或电子邮件时,很可能会发生这种情况。我们可以打印出文档并阅读纸质版本,也可以使用Python的强大功能来旋转有问题的页面。
下面看一下如何使用PyPDF2旋转文章的一些页面:
from PyPDF2 import PdfFileReader, PdfFileWriter def rotate_pages(pdf_path): pdf_writer = PdfFileWriter() pdf_reader = PdfFileReader(path) # 顺时针旋转90度 page_1 = pdf_reader.getPage(0).rotateClockwise(90) pdf_writer.addPage(page_1) # 逆时针旋转90度 page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90) pdf_writer.addPage(page_2) # 在正常方向上添加一页 pdf_writer.addPage(pdf_reader.getPage(2)) with open('rotate_pages.pdf', 'wb') as fh: pdf_writer.write(fh) if __name__ == '__main__': path = '新路径.pdf' rotate_pages(path)
上面除了pdfileReader之外,还导入了pdfileWriter,因为我们需要编写一个新的pdf。rotate_pages()获取要修改的PDF的路径。在这个函数中,需要创建一个可以命名为pdf-writer的writer对象和一个名为pdf-reader的reader对象。
接下来,可以使用.get page()获取所需的页面。上面开始输入了第0页,也就是第一页,调用page对象的.rotateClockwise()顺时针旋转方法并输入90。然后同样地,对于第二页,调用.rotateCounterLockwise()逆时针旋转并输入90。
每次调用Rotation旋转方法后,都会调用.addPage(),这将向writer对象添加页面的旋转版本。最后一页是第3页,没有对其进行任何旋转。最后,使用.write()把所有新页写入新的PDF。
使用PyPDF2将PDF拆分为页面
对于此示例,首先需要导入PdfFileReader和PdfFileWriter类。 然后我们打开PDF文件,创建一个reader对象,并使用reader对象的getNumPages方法遍历所有页面。
在for循环中,我们创建了一个新的PdfFileWriter实例,它不包含任何页面。 然后,我们使用pdfWriter.addPage()方法将当前页面添加到writer对象。 此方法接受页面对象,我们使用PdfFileReader.getPage()方法获取该页面对象。
下一步是创建一个唯一的文件名,我们使用原始文件名加上“page”一词加上页码。 我们在当前页码中加1,因为PyPDF2计算从零开始的页码。
最后,我们以“write binary”模式(模式wb)打开新文件名,并使用pdfWriter类的write()方法将提取的页面保存到磁盘。
如何合并PDF?
在许多情况下,我们希望将两个或多个PDF合并到一个PDF中。例如,现在可能有一个标准的封面,需要转到许多类型的报告中。这时候就可以使用python来帮助完成这类工作。
下面是实现的代码,完成PDF合并的操作:
from PyPDF2 import PdfFileReader, PdfFileWriter def merge_pdfs(paths, output): pdf_writer = PdfFileWriter() for path in paths: pdf_reader = PdfFileReader(path) for page in range(pdf_reader.getNumPages()): # 将每页添加到writer对象 pdf_writer.addPage(pdf_reader.getPage(page)) # 写入合并的pdf with open(output, 'wb') as out: pdf_writer.write(out) if __name__ == '__main__': paths = ['document1.pdf', 'document2.pdf'] merge_pdfs(paths, output='merged.pdf')
假如有一个要合并到一起的pdf列表时,可以直接使用merge_pdf函数完成。此函数采用了输入路径和输出路径作为参数。
首先遍历输入的paths,并为每个输入创建一个PDF阅读对象。然后遍历PDF文件中的所有页面,并使用.addpage()将这些页面写入writer对象。当完成对列表中所有PDF的所有页面的写入后,将在末尾写入新的结果中。
如果不想合并每个PDF的所有页面,可以通过添加一系列要添加的页面来稍微增强这个脚本。挑战一点的话,也可以使用Python的argparse模块为这个函数创建一个命令行接口。
查找包含文本的所有页面
这个功能非常实用,与pdfgrep类似。 使用PyMuPDF,脚本将返回包含给定搜索字符串的所有页码。 页面一个接一个地加载,并且在searchFor()方法的帮助下,检测到搜索字符串的所有出现。 如果匹配,则在stdout上打印相应的消息。
结论:
这里讲解的方法非常强大。 使用相对较少数量的代码行,可以轻松获得结果。
来源网络,侵权删除
相关推荐
- 让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
-
花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些“大招”?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了330倍!作者不仅展示了“术”,更传授...
- 7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制
-
“本文整理自开发者AbdurRahman在Stackademic的真实记录,所有代码均经过最小化删减,确保在50行内即可运行。每段脚本都对应一个日常场景,拿来即用,无需额外依赖。一、在朋...
- Python3.14:终于摆脱了GIL的限制
-
前言Python中最遭人诟病的设计之一就是GIL。GIL(全局解释器锁)是CPython的一个互斥锁,确保任何时刻只有一个线程可以执行Python字节码,这样可以避免多个线程同时操作内部数据结...
- Python Web开发实战:3小时从零搭建个人博客
-
一、为什么选Python做Web开发?Python在Web领域的优势很突出:o开发快:Django、Flask这些框架把常用功能都封装好了,不用重复写代码,能快速把想法变成能用的产品o需求多:行业...
- 图解Python编程:从入门到精通系列教程(附全套速查表)
-
引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...
- Python 并发编程实战:从基础到实战应用
-
并发编程是提升Python程序效率的关键技能,尤其在处理多任务场景时作用显著。本文将系统介绍Python中主流的并发实现方式,帮助你根据场景选择最优方案。一、多线程编程(threading)核...
- 吴恩达亲自授课,适合初学者的Python编程课程上线
-
吴恩达教授开新课了,还是亲自授课!今天,人工智能著名学者、斯坦福大学教授吴恩达在社交平台X上发帖介绍了一门新课程——AIPythonforBeginners,旨在从头开始讲授Python...
- Python GUI 编程:tkinter 初学者入门指南——Ttk 小部件
-
在本文中,将介绍Tkinter.ttk主题小部件,是常规Tkinter小部件的升级版本。Tkinter有两种小部件:经典小部件、主题小部件。Tkinter于1991年推出了经典小部件,...
- Python turtle模块编程实践教程
-
一、模块概述与核心概念1.1turtle模块简介定义:turtle是Python标准库中的2D绘图模块,基于Logo语言的海龟绘图理念实现。核心原理:坐标系系统:原点(0,0)位于画布中心X轴:向右...
- Python 中的asyncio 编程入门示例-1
-
Python的asyncio库是用于编写并发代码的,它使用async/await语法。它为编写异步程序提供了基础,通过非阻塞调用高效处理I/O密集型操作,适用于涉及网络连接、文件I/O...
- 30天学会Python,开启编程新世界
-
在当今这个数字化无处不在的时代,Python凭借其精炼的语法架构、卓越的性能以及多元化的应用领域,稳坐编程语言排行榜的前列。无论是投身于数据分析、人工智能的探索,还是Web开发的构建,亦或是自动化办公...
- Python基础知识(IO编程)
-
1.文件读写读写文件是Python语言最常见的IO操作。通过数据盘读写文件的功能都是由操作系统提供的,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个...
- Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!
-
Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...
- 一文带你了解Python Socket 编程
-
大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口...
- Python-面向对象编程入门
-
面向对象编程是一种非常流行的编程范式(programmingparadigm),所谓编程范式就是程序设计的方法论,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。类和对象面向对象编程:把...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)