大家好,我是小张~,今天文章与自动化办公相关,目前个人认为 Python 库中处理 PDF 比较不错的有三个,分别是 PyPDF2,Pdfplumer 和 PDFminer;

今天教程内容主要聚焦于 PyPDF2 ,借助它对 PDF 实现以下基本操作

  • 1,将单个 PDF 拆分为多个 PDF 文件 ;
  • 2,将多个 PDF 合并为一个 PDF 文件 ;
  • 3,将 PDF 中某页进行旋转 ;
  • 4,对 PDF 添加水印 ;
  • 5,对 PDF 加密 ;
  • 6,对 PDF 进行解密;
  • 6,获取 PDF 基本信息,例如作者、标题、页数等;

PyPDF2 历史

正文开始之前,说一下 PyPDF2 的发展历史 ,PyPDF 的前身是 pyPDf 包在2005年发布,该包的最后一个版本发布于2010年,后来大约经过一年左右, 名为 Phasit 的公司赞助 PyPdf 的一个分支后来命名为 PyPDF2,两个版本功能都基本一样,最大区别就是 PyPDF2 中 加入了支持 Python3 特性;

PyPDF2 近期也没有再更新了,最近一个版本发布在2016年,但使用热度依然没有消退;虽然后面又出现了 PyPDF3、PyPDF4 等不同版本,但这些包并没有对 PyPDF2 功能向后完全兼容,用户受欢迎程度当然也不如 PyPDF2

PyPDF2 安装

与其它Python 库一样,安装可通过 pip 或 conda 工具

pip install pypdf2

PDF 信息提取

使用 PyPDF2 可以从 PDF 中提取到一些元数据和文本信息,对 PDF 有个大致了解

用 PyPDF2 能够提取的数据如下

  • 作者;
  • 创建者;
  • 制作者;
  • Subject;
  • 标题;
  • 页数;

这里我下载了官网提供的 PDF 样本《Seige_of_Vicksburg_Sample_OCR》一共六页,作为测试数据

from  PyPDF2 import PdfFileReader# # pdf 文档
pdf_path = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"with open(pdf_path,'rb') as f:pdf = PdfFileReader(f)infomation = pdf.getDocumentInfo()number_of_pages = pdf.getNumPages()txt = f'''{pdf_path} information:Author : {infomation.author},Creator : {infomation.creator},Producer : {infomation.producer},Subject : {infomation.subject},Title : {infomation.title},Number of pages : {number_of_pages}'''print(txt)

下面为打印结果

D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf information:Author : DSI,Creator : LuraDocument PDF Compressor Server 5.5.46.38,Producer : LuraDocument PDF v2.38,Subject : None,Title : Binder1.pdf,Number of pages : 6

在上面例子中用到了 PdfFileReader 类,用于与 pdf 文件交互;调用该类中的 getDocumentInfo() 方法返回一个 DocumentInformation 的实例,该实例中存储着我们需要的信息;对 reader 对象调用 getNumPages 方法也可以返回文档页数;

个人看法,这里面的数据也就 页数 有点价值,当批量统计时该方法很适用

PDF 页面旋转

PyPDF2 中 pdf 每一页都是以 page 对象存在,返回某一页的实例可通过 reader 对象中的 get_Page(page_index) 方法,其中 page_index 表示索引

对某一页旋转,有两种方式

  • rotateClockwise(90),顺时针旋转90度;
  • rotateCounterClockwise(90),逆时针旋转 90 度;

下面代码表示将目标 PDF 中第一页顺时针方向旋转 90 度,第二页以逆时针方向旋转 90 度,其它页位置角度不变;

from  PyPDF2 import PdfFileReader,PdfFileWriterpdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
# Rotate page 90 degrees to the right
page_1 = pdf_reader.getPage(0).rotateClockwise(90)
pdf_writer.addPage(page_1)
# Rotate page 90 degrees to the left
page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90)
pdf_writer.addPage(page_2)
# 之后的正常写出
for i in range(2,pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(i))with open(pdf_path, 'wb') as fh:pdf_writer.write(fh)

结果如下

代码中同时用到了PdfFileReader,PdfFileWriter 这两个类,页面旋转并不是在原有 PDF 基础上进行操作而是在内存处创建了一个新的PDF流对象,将操作后的每一页通过 addPage() 方法加入到这个对象中,之后将内存中的这个对象写入到文件中;

写到这里,说实话其实 页面旋转 这个功能没基本没什么作用,加在这里只是想充当一些字数,哈哈哈

单个 PDF 拆分成多个PDF

from  PyPDF2 import PdfFileReader,PdfFileWriter# # pdf 文档
pdf_path = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"
save_path = 'D:/Data/自动化办公/PDF/'# Split Pages of PDFpdf_reader = PdfFileReader(pdf_path)
for i in range(0,pdf_reader.getNumPages()):pdf_writer = PdfFileWriter()pdf_writer.addPage(pdf_reader.getPage(i))# Every page write to a pathwith open(save_path+'{}.pdf'.format(str(i)), 'wb') as fh:pdf_writer.write(fh)print('{} Save Sucessfully !\n'.format(str(i)))

代码将 PDF 原文件中的每一页拆分到每一个PDF文件,其中文件名用页索引来命名;

通过拆分也可以提取到 pdf 文件中固定页码范围,例如我只想提取 pdf 中的 2-5 页,其它部分不要,那么代码将写成下面形式

pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
for i in range(1,5):# pdf_writer = PdfFileWriter()pdf_writer.addPage(pdf_reader.getPage(i))# Every page write to a path
with open(save_path+'2_5.pdf', 'wb') as fh:pdf_writer.write(fh)

多个 PDF 文件合并为单个

pdf 拆分与合并方向虽然相反,但用到的类、原理都是一样的

PdfFileReader读取每个pdf,并递归获取每一页page 对象, PdfFileWrite 新建一个流对象,把前面内存中读取到的 page 对象按顺序写入到这个流对象中,最后写入到磁盘文件

from  PyPDF2 import PdfFileReader,PdfFileWriterp1_pdf = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"
p2_pdf = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"merge_pdf = 'D:/Data/自动化办公/PDF/merge.pdf'p1_reader = PdfFileReader(p1_pdf)
p2_reader = PdfFileReader(p2_pdf)merge = PdfFileWriter()
# Write p1
for i in range(0,p1_reader.getNumPages()):merge.addPage(p1_reader.getPage(i))
# Write p2
for j in range(0,p2_reader.getNumPages()):merge.addPage(p2_reader.getPage(j))# Write out
with open(merge_pdf,'wb') as f:merge.write(f)

运行结果如下

PDF 添加水印

在今天列举的这么多功能中,我想这个功能是最有用,批量添加水印主要用到 page 对象中的 margePage() 方法,通过将两个页面合并来达到添加水印的效果

因为 PyPDF2 只能操作 pdf 对象,因此在添加水印之前,需要将准备添加的水印存放到一个 pdf 文件中

from  PyPDF2 import PdfFileReader,PdfFileWriter
watermark = 'D:/Data/自动化办公/PDF/watermark.pdf'
input_pdf = 'D:/Data/自动化办公/PDF/merge.pdf'
output = 'D:/Data/自动化办公/PDF/merge_watermark.pdf'watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()# Watermark all the pages
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)

效果如下,从左到右,依次为原图、水印、添加水印后的原图    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XP0ELXsk-1615825692823)(https://images.zeroingpython.top/img/image-20210314005417135.png)]

上面效果不好是因为制作水印时没有考虑到页面布局问题,所以合并时出现一部分缺失;

用以上代码添加水印的好处是,可以对 pdf 指定页田间水印,比如说只对奇数页添加偶数页不管,不但灵活性强而且高效,当然也可以对多个文件进行批量操作

PDF加密解密

pdf加密

对一份 pdf 文件,如果我们不想让其他人能够读取里面的内容,可以通过 pypdf2 对它设置密码,如果只是单个文件的话,建议最好自己找个工具受手动操作一下会高效一点,但若是多个文件,非常建议用下面方法

watermark = 'D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf'
input_pdf = 'D:/Data/自动化办公/PDF/merge.pdf'
output = 'D:/Data/自动化办公/PDF/merge_watermark1.pdf'watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()# Watermark all the pages
for page in range(pdf_reader.getNumPages()):page = pdf_reader.getPage(page)page.mergePage(watermark_page)pdf_writer.addPage(page)
pdf_writer.encrypt(user_pwd='123456',use_128bit=True)
with open(output, 'wb') as out:pdf_writer.write(out)

主要用到 encrypt 函数,需要注意三个参数

  • user_pwd,str,用户密码,用来限制打开读取文件;

  • owner_pwd,str,比用户密码更高一级,提供时可让打开文件不受任何限制,不指定时默认owner_pwd 与 user_pwd 相同;

  • use_128bit 布尔值,用来表示是否使用128位作为密码,False 时代表用 40 位密码,默认为True;

pdf解密

解密是在读取文件时用的,用到 decrypt() 函数

rom PyPDF2 import PdfFileWriter, PdfFileReaderinput_pdf='reportlab-encrypted.pdf'
output_pdf='reportlab.pdf'
password='twofish'pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(input_pdf)
pdf_reader = pdf_reader.decrypt(password)for page in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page))with open(output_pdf, 'wb') as fh:pdf_writer.write(fh)

上面例子中解密原理是 通过将一个加密文件进行读取,并写入到一个非加密 pdf 中

小结

本文介绍了 PyPDF2 库的基本用法,借助它加上代码实例实现了一些基本操作;但在这里提醒一下,所有上面这些操作只适用于批量操作场景,如果对象是单个文件的话建议用常规做法,过于炫技的话只会浪费时间

关于 pdf 内的图文内容提取、写入本文并没有涉猎,源于 pypdf2 对于这方面并不擅长,而 Pdfplumber 和 PDFminer 在文本提取方面要好得多,工欲善其事,必先利其器;在之后的教程中我将会介绍一下这方面的内容,期待大家的关注!

好了以上就是本篇内容的全部内容,最后感谢大家的阅读,我们下期见~

Python 自动化办公 —— PyPDF2 库的基本使用相关推荐

  1. 【python自动化办公】Python自动化之pdf——PyPDF2、pdfplumber、fitz、pdf2image库介绍

    目录 前言 1. 学习python自动化办公目的 2. 未来持续打卡内容 3. 资料来源与思维导图 一.PDF处理库 1.PyPDF2--基础操作 2.pdfplumber--表格抽取 3.fitz- ...

  2. 推荐 | PyPi官网发布第三方库:python-office,专为Python自动化办公而生。

    大家好,这里是法学院毕业的程序员晚枫,专注于Python自动化办公知识分享.技术交流微信

  3. python自动化办公脚本下载-python自动化脚本

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 运维自动化,已经成为运维必不可少的一部分,下面附上自己写的监控nginx_stat ...

  4. python 自动化办公要装哪些模块_Python自动化办公(内容)

    python自动化办公(python操作Excel.Word.PDF.PPT) python使用openpyxl操作excel: python使用PyPDF2和pdfplumber操作pdf: pyt ...

  5. 新手必学的Python自动化办公教程,掌握你就是行业高手

    前言 如今Python在自动化办公领域的表现越来越亮眼,受到了很多非IT的职场人士的推崇,也引得更多的人去了解.学习Python.但是很多初学者都会面临这么一个困惑:想把Python应用在工作中,却不 ...

  6. python自动写作软件_火遍全网!3天学会Python自动化办公!

    如今Python在自动化办公领域的表现越来越亮眼,受到了很多非IT的职场人士的推崇,也引得更多的人去了解.学习Python.但是很多初学者都会面临这么一个困惑:想把Python应用在工作中,却不知从何 ...

  7. 【python自动化办公】好用的在线网站推荐解决pdf格式转化、文字提取、图片质量增强、抠图等

    目录 前言 1. 学习python自动化办公目的 2. 以往学习内容 3. 资料来源 1. 文档在线格式转化--ALL TO ALL 2. PDF在线工具--PDF24 Tools 3. PDF工具合 ...

  8. Python自动化办公文章,开放下载共97页PDF

    发现很多读者对python自动化办公(python操作Excel.Word.PDF.PPT)的文章都很喜欢,并希望能够应用到工作中去. 因此,我直接写了一个文档<python自动化办公系列文章& ...

  9. python自动化办公入门书籍推荐-用python进行办公自动化都需要学习什么知识呢?...

    自动化办公无非是excel.ppt.word.邮件.文件处理.数据分析处理.爬虫这些.我来一一介绍如何学习,找资料! 最近做了个Python办公自动化的Live讲座,不要脸的推一波~ python基础 ...

  10. python自动化办公入门书籍推荐-盘点使用Python进行自动化办公所需要的知识点

    知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? 这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手?python在自动化办公领域越来越受欢迎,批量处理 ...

最新文章

  1. 【Python】插入sqlite数据库
  2. spring IOC容器的扩展
  3. optee中的thread_vector_table线程向量表
  4. 《Linux内核设计与实现》读书笔记(一)-内核简介
  5. Php的if自动转换类型,php输出数据字段类型自动转换函数
  6. DWZ (JUI) 教程 navTab 刷新分析
  7. 颜色空间,图像格式,彩色转灰度函数
  8. Kubernetes的yaml文件中的command使用
  9. 那个成人总会遇到的小问题……
  10. call和ret(f)指令
  11. leetcode 75. 颜色分类(双指针)
  12. Vegas的新功能——触摸编辑
  13. Matpower安装流程
  14. MATLAB结构模态分析
  15. 无聊写个示例程序,改自身PEB欺骗SREng
  16. html插入图片在古诗右侧,古诗词配插图
  17. 使用js获取证券交易实时数据
  18. java知识分享篇(八)
  19. linux 网卡绑定解绑,网卡绑定开机绑定,关机解绑
  20. 内置函数 ,匿名函数

热门文章

  1. kettle连接access问题总结
  2. Bribing FIPA
  3. Web前端工程师知识脉络图
  4. Android剪切板标签,教你使用剪切板——Android中的复制粘贴
  5. fastadmin 表格文字实现换行
  6. Unity 车辆跟随路径点缓动移动
  7. AOC显示器OSD已锁是什么意思?怎么解锁?
  8. MATLAB对数刻度绘图 (不等间距坐标绘图)
  9. 神经网络(单层感知器)
  10. 企业如何选择短信平台