Portable Document Format(可移植文档格式),或者PDF是一种文件格式,可以用于跨操作系统的呈现和文档交换。尽管PDF最初是由Adobe发明的,但它现在是由国际标准化组织(ISO)维护的开放标准。你可以通过使用PyPDF2包在Python中处理已先存在的PDF。

PyPDF2是一个纯Python包,可用于许多不同类型的PDF操作。

本文将带你了解如何执行以下操作:

从Python中提取PDF中的文档信息

旋转页面

合并PDF

拆分PDF

添加水印

加密PDF

一、pyPdf,PyPDF2和PyPDF4的历史

最初的pyPdf软件包于2005年发布。pyPdf的最后一个正式版本是在2010年。大约一年后,一家名为Phasit的公司赞助了一个名为PyPDF2的pyPdf分支。该代码编写为向后与原始代码兼容,并且用了好多年,效果一直很好,其最后一个版本是在2016年。

有一个名为PyPDF3的软件包简短系列版本,然后该项目被重命名为PyPDF4。所有这些项目都完全相同,但pyPdf和PyPDF2 +之间的最大区别在于后者版本增加了Python 3支持。Python 3的原始pyPdf有一个不同的Python 3分支,但是这个分支已经多年没有维护了。

虽然最近放弃了PyPDF2,但新的PyPDF4与PyPDF2没有完全的向后兼容性。本文中的大多数示例都可以与PyPDF4完美配合,但也有一些不能,这就是为什么PyPDF4在本文中没有更多的特色。随意用PyPDF4替换PyPDF2的导入,看看它是如何工作的。

二、pdfrw:一个替代的PDF操作包

Patrick Maupin创建了一个名为pdfrw的软件包,它可以完成许多与PyPDF2相同的工作。除了加密的特殊情况外,本文后面提到PyPDF2的所有操作,pdfrw均可以实现。

pdfrw的最大区别在于它与ReportLab软件包集成,因此你可以使用一些或所有预先存在的PDF构建一个新的PDF。

三、PyPDF2的安装

如果使用Anaconda而不是常规Python,可以使用pip或conda安装PyPDF2。以下是使用pip安装PyPDF2的方法:

$ pip install pypdf2

由于PyPDF2没有任何依赖,因此安装非常快。

四、如何从Python中提取PDF文档信息

我们可以使用PyPDF2从PDF中提取元数据和一些文本,尤其是当在预先存在的PDF文件上执行某些类型的自动化时是非常有用的。

以下是当前可以提取的数据类型:

Author

Creator

Producer

Subject

Title

Number of page

可以在自己的电脑上随便找一个PDF文件进行尝试操作。下面是使用该PDF编写一些代码,并了解如何访问这些属性:

from PyPDF2 import PdfFileReader

def extract_information(pdf_path):

with open(pdf_path, "rb") as f:

pdf = PdfFileReader(f)

information = pdf.getDocumentInfo()

number_of_pages = pdf.getNumPages()

txt = f"""

Information about {pdf_path}:

Author: {information.author}

Creator: {information.creator}

Producer: {information.producer}

Subject: {information.subject}

Title: {information.title}

Number of pages: {number_of_pages}

"""

print(txt)

return information

if __name__ == "__main__":

path = "xxxx.pdf"

extract_information(path)

首先从PyPDF2包导入PdfFileReader。PdfFileReader是一个具有多种与PDF文件交互的方法的类。在此示例中,我们调用了.getDocumentInfo(),它将返回DocumentInformation的实例,包含了我们感兴趣的大部分信息。我们还可以在reader对象上调用.getNumPages(),让它返回文档中的页数。

information这个变量具有多个实例属性,可以使用这些属性从文档中获取所需的其余元数据。我们可以打印出该信息并将其返回以备将来使用。

虽然PyPDF2具有.extractText(),可以在其页面对象上使用提取文本(本例中未显示),但它的效果不是很好。有些PDF会返回文本,有些会返回空字符串。如果要从PDF中提取文本,建议应该看一下PDFMiner项目。PDFMiner更加强大,专门用于从PDF中提取文本。

五、如何旋转页面?

有时候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。

六、如何合并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模块为这个函数创建一个命令行接口。

七、如何拆分PDF?

有时可能需要将PDF拆分为多个PDF,对于包含大量扫描内容的PDF来说尤其重要。以下是如何使用PyPDF2将PDF拆分为多个文件:

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):

pdf = PdfFileReader(path)

for page in range(pdf.getNumPages()):

pdf_writer = PdfFileWriter()

pdf_writer.addPage(pdf.getPage(page))

output = f"{name_of_split}{page}.pdf"

with open(output, "wb") as output_pdf:

pdf_writer.write(output_pdf)

if __name__ == "__main__":

path = "xxx.pdf"

split(path, "jupyter_page")

这个函数中再次创建了PDF的reaer对象,并对其所读取的页面进行遍历。对于PDF中的每个页面,创建一个新的PDF的writer实例并向其添加单个页面。然后,将该页面写入一个唯一命名的文件。脚本运行完毕后,就可以将原始PDF的每个页面拆分为单独的PDF。

八、如何添加水印?

水印是纸质或者电子文档上的图像或图案,一些水印只能在特殊照明条件下才能看到。水印的重要性在于它可以保护你的知识产权,例如图像或PDF。

我们可以使用Python和PyPDF2为文档添加水印,而且是拥有仅包含水印图像或文本的PDF。下面是向PDF添加水印方法:

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):

watermark_obj = PdfFileReader(watermark)

watermark_page = watermark_obj.getPage(0)

pdf_reader = PdfFileReader(input_pdf)

pdf_writer = PdfFileWriter()

# 给所有页面添加水印

for page in range(pdf_reader.getNumPages()):

page = pdf_reader.getPage(page)

page.mergePage(watermark_page)

pdf_writer.addPage(page)

with open(output, "wb") as out:

pdf_writer.write(out)

if __name__ == "__main__":

create_watermark(

input_pdf="Jupyter_Notebook_An_Introduction.pdf",

output="watermarked_notebook.pdf",

watermark="watermark.pdf")

上面create_watermark有三个参数:

input_pdf:要加水印的PDF文件路径

output:要保存PDF的水印版本的路径

watermark:包含水印图像或文本的PDF

在代码中,打开水印PDF并从文档中抓取第一页,因为这是水印应该驻留的位置。然后使用input_pdf和通用pdf_writer对象创建PDF的writer对象,以写出带水印的PDF。

下一步是遍历input_pdf中的页面,然后调用.mergePage()并以用上面读取的水印对象watermark_page为参数,这样会将watermark_page覆盖在当前页面的顶部,然后再将新合并的页面添加到pdf_writer对象中。遍历完成后,最后将新加水印的PDF写入磁盘。

九、如何加密PDF?

PyPDF2目前仅支持将用户密码和所有者密码添加到预先存在的PDF。在PDF版本中,所有者密码会提供PDF的管理员权限,并允许设置文档的权限,而用户密码只允许打开文档。

实际上,PyPDF2是不允许设置文档的任何权限的,即使它允许设置所有者密码的情况下。但无论如何,这是可以加密的方式,也将固有地加密PDF:

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):

pdf_writer = PdfFileWriter()

pdf_reader = PdfFileReader(input_pdf)

for page in range(pdf_reader.getNumPages()):

pdf_writer.addPage(pdf_reader.getPage(page))

pdf_writer.encrypt(user_pwd=password, owner_pwd=None,

use_128bit=True)

with open(output_pdf, "wb") as fh:

pdf_writer.write(fh)

if __name__ == "__main__":

add_encryption(input_pdf="reportlab-sample.pdf",

output_pdf="reportlab-encrypted.pdf",

password="twofish")

add_encryption以输入输出PDF路径和要添加到PDF的密码为参数。由于需要加密整个输入PDF,因此需要遍历其所有页面并将其添加到writer编写器。最后一步是调用.encrypt(),以用户密码,所有者密码以及是否应该添加128位加密为参数。默认情况下,要启用128位加密。如果将其设置为False,则将应用40位加密。

结论

PyPDF2包非常有用,可以使用PyPDF2自动执行脚本完成PDF文档的批量操作。本文介绍了如何从PDF中提取元数据,旋转页面,合并和拆分PDF,添加水印,以及添加加密的操作。

同时,还要关注较新的PyPDF4包,因为它很快就会取代PyPDF2。也可以看看pdfrw包,它也可以执行许多与PyPDF2相同的操作。

以上所述是小编给大家介绍的Python玩转PDF的各种骚操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python书籍pdf文档密码-Python玩转PDF的各种骚操作相关推荐

  1. python docx 合并文档 图片_python玩转pdf全攻略

    本篇说点轻松的,聊下Python对pdf的各种操作,包含pdf转word,pdf转图片等. pdf转换word文档 保留格式 pdf转换为word文档,被大众经常使用的是纯Python库pdfmine ...

  2. html在电脑里怎么打开pdf文件,电脑上的PDF文档怎么打开?打开PDF的5种方法

    原标题:电脑上的PDF文档怎么打开?打开PDF的5种方法 目前常用的办公文档中PDF因其格式的稳定性和兼容性都较好,而被越来越多的人使用.那么PDF文档应该如何打开呢?有哪些常用的PDF文件的打开方式 ...

  3. python docx 合并文档 图片_Python+pymupdf处理PDF文档案例6则

    推荐图书:<Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),清华大学出版社,2020年6月第1次印刷,7月第2次印刷 京东购买链接:https://it ...

  4. ubuntu去除PDF文档密码

    1.安装qpdf sudo apt-get install qpdf 2.使用qpdf去除文档密码 qpdf --password='替换成文档的密码' --decrypt 替换为需要转换的pdf.p ...

  5. 暴力破解pdf文档密码

    目录 前言 准备系统环境 安装pdfcrack 使用指定字符开始暴力破解 使用字典文件进行爆破 附pdfcrack man手册 前言 相信小伙伴们都遇到这种情况;你收到了一些标题很吸引人的pdf文档 ...

  6. PDF文档阅读器-福昕PDF阅读器下载

    福昕PDF阅读器(Foxit Reader)是福昕公司推出的首款简体中文版本PDF文档阅读器,它的启动速度是很快的,是一款非常好用的软件.福昕PDF阅读器(Foxit Reader)是用户信赖的阅读器 ...

  7. pdf 文档 搜索 服务器,福昕PDF搜索工具_PDF文档索引与检索_福昕软件官网

    快速精准的索引技术,帮助您快速搜索PDF文档 Foxit PDF IFilter实现了快速精准的索引技术,通过指定搜索条件,对大量PDF文件进行索引,从而快速定位到所需文档.Foxit PDF IFi ...

  8. 用C#实现生成PDF文档和将WORD转换为PDF (转自海东的技术资料)

    转自:http://www.cnblogs.com/ghd258/articles/258060.html 前言:由于一个客户的项目中需要将WORD文档转换成PDF格式,故写了本篇实站教程  需求分析 ...

  9. 用C#实现生成PDF文档和将WORD转换为PDF

    知识点:线程调用,异步线程,异步线程回调函数,C#的类,WSH宿主脚本开发 前言:由于一个客户的项目中需要将WORD文档转换成PDF格式,故写了本篇实站教程 需求分析:客户的项目以B/S结构为主,提供 ...

最新文章

  1. hdu 2067 兔子板
  2. boost::strong_components用法的测试程序
  3. Laravel查询搜索函数集合:find  first  firstWhere firstOr findOrFail firstOrFail firstOrNew firstOrCreate
  4. android 悬浮球简书,轻松自制flyme悬浮球
  5. 如何解决win10+VS2017+WDK环境下编译C++程序提示error LNK1104无法打开文件*.lib的问题
  6. 信息学奥赛C++语言:学生人数
  7. 国内做得好的进销存软件有哪些啊?
  8. MAC下Charles的破解版
  9. 关于希捷维修日志中 FAIL Servo Op=0100 Resp=0003 错误信息的解读
  10. ROS机器人更换新雷达需要重新配置carto和navigation的哪些参数
  11. 新松机器人招股说明书_来看看绿的谐波招股书披露的重要信息
  12. 一次不常见的等待事件:RECO进程enq: DR - contention
  13. python编写木马攻击_Python编写简易木马程序
  14. 无线路由器wan口和lan口
  15. bluetooth pdf_这个pdf软件很okk,速来get!
  16. 【零基础深度学习教程第一课:深度学习基础】
  17. python爬虫之爬取起点中文网小说
  18. 元胞自动机(Cellular Automata)与城市规划及其MATLAB实现——莆田市城市发展预测
  19. 设置默认訪问项目的client的浏览器版本号(IE版本号)
  20. 科技界10大最节俭富豪:谷歌创始人从不剩饭

热门文章

  1. hortonworks/registry配置详解
  2. 95-190-542-源码-window-清除器(Evictors)-CountEvitor简介
  3. 云计算教程学习入门视频课件:什么是中间件?
  4. 云计算学习路线图课件:云计算和虚拟机有什么区别?
  5. html语言中强调的ddr,DDR基础知识
  6. php文章自动采集器,使用php蓝天采集器抓取今日头条ajax的文章内容
  7. solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
  8. 【2019.09.14】2019icpc沈阳网络赛
  9. servlet里面转发与重定向
  10. gitHub上传项目