百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

程序员学习之在Python中使用PDF:阅读、旋转、合并和拆分

off999 2024-09-21 20:59 46 浏览 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上打印相应的消息。


结论:

这里讲解的方法非常强大。 使用相对较少数量的代码行,可以轻松获得结果。

来源网络,侵权删除

相关推荐

hdd硬盘和ssd(ssd硬盘和hdd硬盘是什么意思)

HDD硬盘和SSD硬盘是两种不同类型的电脑存储设备,它们有着以下区别:1.工作原理:HDD硬盘使用机械旋转的磁盘和读写磁头来存储和读取数据,而SSD硬盘则使用闪存存储数据,类似于USB闪存盘。2....

电脑免费软件下载大全(电脑上免费的下载软件)

正常情况下,如果我们想要在自己的电脑上面下载一个不要钱的单机游戏,那么我们是可以直接在我们的软件管理中心进行一个下载的,这个时候我们只需要通过一个权限就能够正常的下载,当然我们也是可以在一些小游戏的软...

mpp文件转换excel(mpp转换成pdf)

要将Excel表格转换为MPP格式,您可以按照以下步骤操作:1.打开Excel表格并确保数据按照项目的不同阶段或任务进行组织。2.将Excel表格中的数据复制到一个新的MicrosoftProj...

win7旗舰版开机密码忘记按f2

方法如下:开始-控制面板-用户帐户;在打开的更改用户帐户界面点击要更改的帐户;然后点击帐户左面的更改密码按钮;在打开的页面上,输入一次当前使用的密码,输入2次要更改的新密码然后保存退出就可以了...

笔记本无音频输出设备(笔记本无音频输出设备)

1、没有声卡驱动,解决方法就是找到笔记本的官网,下载电脑声卡的驱动安装即可。2、没有外界的音频播放设备,解决方法就是买一个外界的音频播放设备插到电脑主机的音频接口上即可。笔记本电脑显示未安装任何音频输...

iso文件能用手机打开吗(iso文件能用手机打开吗安全吗)

一般的压缩软件就可以打开的,比如,好压软件,这个打开只是解压形式的,如果你说的是运行iso文件,这个没有,况且安卓系统也不支持iso运行ISO文件一般用于光盘镜像文件的存储,如果想要在手机上运行ISO...

win7系统卡顿怎么优化(win7很慢很卡怎么优化)

1、首先打开安全卫士,进入安全卫士首页,单击软件窗口右下角的“更多”图标,打开扩展应用程序。2、单击选择“我的工具”。3、在我的工具菜单里面找到“人工服务”单击打开人工服务。4、在人工服务对话框有很多...

如何查看c盘微信聊天记录(如何查看c盘微信聊天记录内存大小)

微信群中的消息只要没删除基本都能保存,想要找微信群中几个多月前的消息可以直接根据日期来查找聊天记录。操作如下:1、打开想要查找记录的微信群,点击右上角人形图标;2、点击查找聊天内容;3、选择按日...

office2016家庭版激活密钥(office家庭版激活码2019)

走淘宝吧,因为零售版的密钥只能用一次。大概几块钱就能激活2016。如果你不在乎钱的话可以向我一样,订阅一个office365.实在不行可以和几个人一起买一个家庭版的365.出现这个情况,找微软申诉是没...

移动硬盘驱动器下载安装(移动硬盘驱动器下载安装教程)

1、右键单击您的桌面,选择“新建文件夹”,并命名该文件夹(例如“usb驱动程序”);2、然后到本站下载驱动程序;3、将其解压缩至在您的桌面上刚刚创建的usb驱动程序文件夹;4、单击开始菜单,然后选择设...

电脑硬盘格式化工具(电脑 格式化硬盘)

硬盘格式化工具很多,PQMACGIG8.0(中文就叫硬盘分区魔法师)是比较好的一个,这个是在WINDOWS下比叫好用,(个人感觉)FDISK也是比较好的一个,这个一般用在DOS下分区格式化WIN...

photoshop是一款什么软件(ps指的是什么软件)

这个说法是错误的,ps软件“即:photoshop”是由美国著名的“adobe阿多比”公司出品的专业的图像处理软件,它不是由微软公司出品的软件。众所周知的是,微软公司以设计视窗操作系统名满全球,它出...

ipad越狱的好处与坏处(ipad越狱好不好)

  好处一:  1、重命名、重组应用程序  如果你看着Sparrow(iOS最优秀邮件客户端)这个名字不爽,越狱之后就可以改成“Email”,如果你觉得“豆瓣电台”这个名字不给力,那就改成“中央人民广...

win7光盘重装系统步骤图解(win7光盘如何重装系统)

1.确认您的电脑支持从光盘启动。如果支持,可以直接将Windows7安装光盘插入电脑的光驱中。 2.打开电脑,按下F2、F10、F12或Delete等键进入BIOS设置界面。 ...

电脑已联网却无法上网(电脑已经联网了但是不能上网)

电脑连上网后,仍可能存在无法上网的情况,这可能是由多种原因造成的。以下是一些可能的原因和解决方法:1.浏览器问题:有时候,浏览器可能会出现故障,导致无法正常访问网络。您可以尝试清除浏览器的缓存和co...

取消回复欢迎 发表评论: