利用python的PyPDF2和PyMuPDF库玩转PDF的提取、合并、旋转、缩放、加密
一、安装PyPDF2和PyMuPDF库
pip install PyPDF2
pip install pymupdf # fitz是pymupdf的子模块
二、工具类代码
from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger
import fitz
import re
import os
'''
根据页码列表从pdf中取出指定的页
pdf_input_path: 原pdf路径
pdf_output_path: 输出pdf路径
page_no_list: 提取页面列表
rotate_angle: 旋转角度
'''
def pdf_separate_by_page_no_list(pdf_input_path, pdf_output_path, page_no_list, rotate_angle=0):
# 初始化一个pdf
output = PdfFileWriter()
# 读取pdf
with open(pdf_input_path, 'rb') as in_pdf:
pdf_file = PdfFileReader(in_pdf)
# 从pdf中取出指定页
for page_no in page_no_list:
output.addPage(pdf_file.getPage(page_no - 1).rotateClockwise(rotate_angle))
# 写出pdf
with open(pdf_output_path, 'ab') as out_pdf:
output.write(out_pdf)
'''
根据起止页码范围(包含开头包含结尾)从pdf中取出所需页
pdf_input_path: 原pdf路径
pdf_output_path: 输出pdf路径
start_page_no: 开始页码
end_page_no: 结束页码
rotate_angle: 旋转角度
'''
def pdf_separate_from_start_to_end(pdf_input_path, pdf_output_path, start_page_no, end_page_no, rotate_angle=0):
# 初始化一个pdf
output = PdfFileWriter()
# 读取pdf
with open(pdf_input_path, 'rb') as in_pdf:
pdf_file = PdfFileReader(in_pdf)
# 从pdf中取出指定页
for i in range(start_page_no - 1, end_page_no):
output.addPage(pdf_file.getPage(i).rotateClockwise(rotate_angle))
# 写出pdf
with open(pdf_output_path, 'ab') as out_pdf:
output.write(out_pdf)
'''
通过多个pdf路径列表,将多个pdf合并
pdf_path_list: 合并pdf路径列表
pdf_output_path: 输出pdf路径
'''
def pdf_merge_from_paths(pdf_path_list, pdf_output_path):
# 初始化一个PDF
file_merger = PdfFileMerger()
# 合并
for pdf in pdf_path_list:
file_merger.append(pdf, import_bookmarks=False) # 合并pdf文件
file_merger.write(pdf_output_path)
'''
通过多个pdf所在父目录,将多个pdf合并
pdf_dir: 合并pdf文件所在父目录
pdf_output_path: 输出pdf路径
'''
def pdf_merge_from_dir(pdf_dir, pdf_output_path):
# 初始化一个PDF
file_merger = PdfFileMerger()
# 读取PDF
pdf_lst = [f for f in os.listdir(pdf_dir) if f.endswith('.pdf')]
pdf_lst = [os.path.join(pdf_dir, filename) for filename in pdf_lst]
# 合并
for pdf in pdf_lst:
file_merger.append(pdf) # 合并pdf文件
file_merger.write(pdf_output_path)
'''
将指定页移动至目标页的前面或后面,直接修改原pdf
pdf_path: 修改pdf路径
aim_page_no: 目标页页码
move_page_no_list: 移动页页码列表
is_behind: 是否移动至目标页的后面
'''
def pdf_move_page_no_list(pdf_path, aim_page_no, move_page_no_list, is_behind=True):
# 初始化一个pdf
output = PdfFileWriter()
with open(pdf_path, 'rb') as in_pdf:
pdf_file = PdfFileReader(in_pdf)
delta = 0 if is_behind else 1
# 第1部分
for i in range(0, aim_page_no - delta):
output.addPage(pdf_file.getPage(i))
# 第2部分:移动页
for i in move_page_no_list:
output.addPage(pdf_file.getPage(i - 1))
# 第3部分:剩下的
for i in range(aim_page_no - delta, len(pdf_file.pages)):
if i + 1 not in move_page_no_list:
output.addPage(pdf_file.getPage(i))
# 写出pdf
with open(pdf_path, 'ab') as out_pdf:
output.write(out_pdf)
'''
将指定页旋转一定角度,直接修改原pdf
pdf_path: 修改pdf路径
rotate_page_no_list: 旋转页页码列表
rotate_angle: 旋转角度
'''
def pdf_rotate_page_no_list(pdf_path, rotate_page_no_list, rotate_angle=0):
# 初始化一个pdf
output = PdfFileWriter()
# 读取pdf
with open(pdf_path, 'rb') as in_pdf:
pdf_file = PdfFileReader(in_pdf)
# 遍历所有页
for i in range(len(pdf_file.pages)):
# 需要旋转页按照规定角度旋转,不需要旋转的页设定旋转角度为0
angle = 0
if i + 1 in rotate_page_no_list:
angle = rotate_angle
output.addPage(pdf_file.getPage(i).rotateClockwise(angle))
# 写出pdf
with open(pdf_path, 'ab') as out_pdf:
output.write(out_pdf)
'''
将pdf转为图片
'''
def covert2pic(doc, page_count, zoom):
if os.path.exists('.pdf'):
os.removedirs('.pdf')
os.mkdir('.pdf')
for pg in range(page_count):
page = doc.load_page(pg)
img_path = '.pdf/%s.png' % str(pg + 1)
trans = fitz.Matrix(int(zoom) / 100.0, int(zoom) / 100.0)
pm = page.get_pixmap(matrix=trans, alpha=False)
pm.save(img_path)
print(page)
doc.close()
'''
将图片转pdf
'''
def pic2pdf(pdf_output_path, page_count):
doc = fitz.open()
for pg in range(page_count):
img_path = '.pdf/%s.png' % str(pg + 1)
img_doc = fitz.open(img_path)
pdf_bytes = img_doc.convert_to_pdf()
img_pdf = fitz.open("pdf", pdf_bytes)
os.remove(img_path)
doc.insert_pdf(img_pdf)
if os.path.exists(pdf_output_path):
os.remove(pdf_output_path)
doc.save(pdf_output_path)
doc.close()
'''
对pdf大小进行缩放, 将原pdf转化为图片类型
pdf_input_path: 原pdf路径
pdf_output_path: 输出pdf路径
zoom: 缩放比例, 80, 100, 120等
'''
def pdf_zoom(pdf_input_path, pdf_output_path, zoom):
doc = fitz.open(pdf_input_path)
page_count = doc.page_count
covert2pic(doc, page_count, zoom)
pic2pdf(pdf_output_path, page_count)
os.removedirs('.pdf')
'''
对pdf进行加密
pdf_input_path: 原pdf路径
pdf_output_path: 输出pdf路径
password: 加密密码
'''
def pdf_encrypt(pdf_input_path, pdf_output_path, password):
# 初始化一个pdf
output = PdfFileWriter()
output.encrypt(password)
# 读取pdf
with open(pdf_input_path, 'rb') as in_pdf:
pdf_file = PdfFileReader(in_pdf)
# 遍历所有页
for page in pdf_file.pages:
output.addPage(page)
# 写出pdf
with open(pdf_output_path, 'ab') as out_pdf:
output.write(out_pdf)
利用python的PyPDF2和PyMuPDF库玩转PDF的提取、合并、旋转、缩放、加密的更多相关文章
- PyMuPDF库(处理PDF)
昨天在公司需要把一份PDF格式认证表转换为图片JPEG格式,所以在网上查询了一些与此相关的python库,最后看网上大多都是使用Wand和PyMuPDF,在安装了Wand库后,导入相应的模块后报错了, ...
- 利用python的requests和BeautifulSoup库爬取小说网站内容
1. 什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约 ...
- 利用python进行数据分析之pandas库的应用(二)
本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 >>> from panda ...
- 利用python进行数据分析之pandas库的应用(一)
一.pandas的数据结构介绍 Series Series是由一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据索引构成.仅由一组数据可产生最简单的Series. obj=Series([4 ...
- 利用Python进行数据分析——数据规整化:清理、转换、合并、重塑(七)(1)
数据分析和建模方面的大量编程工作都是用在数据准备上的:载入.清理.转换以及重塑.有时候,存放在文件或数据库中的数据并不能满足你的数据处理应用的要求.很多人都选择使用通用编程语言(如Python.Per ...
- 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md
学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...
- Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)
PDF文件格式 如今,可移植文档格式(PDF)属于最常用的数据格式.在1990年,PDF文档的结构由Adobe定义.PDF格式的思想是,对于通信过程中涉及的双方(创建者,作者或发送者以及接收者)而言, ...
- 利用python库twilio来免费发送短信
大家好,我是四毛,最近开通了个人公众号“用Python来编程”,欢迎大家“关注”,这样您就可以收到优质的文章了. 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图 ...
- 利用Python进行数据分析——重要的Python库介绍
利用Python进行数据分析--重要的Python库介绍 一.NumPy 用于数组执行元素级计算及直接对数组执行数学运算 线性代数运算.傅里叶运算.随机数的生成 用于C/C++等代码的集成 二.pan ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
随机推荐
- Java学习笔记08
1. static关键字 static可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的是放在静态区中,没有static修饰的成员变量和方法则是属于对象的. 1.1 静态变量 ...
- prometheus node-exporter安装
目录 prometheus node-exporter安装 包安装在linux服务器 Daemonset安装 Docker安装 helm安装 prometheus node-exporter安装 安装 ...
- Vue3实现组件级基类的几种方法
Vue3的组件有三种代码组织方式 纯Option API (不含setup) option API + setup 纯 setup (即composition API) 对于这三种形式,设置基类的方法 ...
- #PowerBi 10分钟学会,以X为结尾的聚合函数
前言 在Power BI中,我们经常需要对数据进行聚合计算,比如求和.求平均.求最大值等. Power BI提供了一系列的聚合函数,可以用来对表中列的值进行聚合然后返回一个值.这些函数通常只需要一个参 ...
- 存下吧!Spring高频面试题总结
Spring是什么? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring的优点 通过控制反转和依赖注入实现松耦合. 支持面向切面的编程,并且把应用业务逻辑和系统 ...
- 2020-10-04:java中GC Root 对象有哪些?
福哥答案2020-10-04:#福大大架构师每日一题# 简单回答:1.局部变量.2.静态引用的对象.3.常量引用的对象.4.JNI引用的对象. 中级回答:1.虚拟机栈(栈帧中的本地变量表)中引用的对象 ...
- 2020-09-29:介绍volatile功能。
福哥答案2020-09-29:#福大大架构师每日一题# 功能如下:1.内存可见.2.禁止指令重排序. 实现如下:1.字节码层面 ACC_VOLATILE 2.JVM层面volatile内存区的读写 都 ...
- java设计模式【抽象工厂模式】
java设计模式[抽象工厂模式] 抽象工厂模式 抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类.在这个模式中,我们只关心产品的抽象接口,而将 ...
- 贪心算法基础及leetcode例题
参考 理论 本质:找到每个阶段的局部最优,然后去推导得到全局最优 两个极端:常识&&很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会 ...
- 基于.NetCore+React单点登录系统
对于有多个应用系统的企业来说,每一个应用系统都有自己的用户体系,这就造成用户在切换不同应用系统时,就要多次输入账号密码,导致体验非常不好,也造成使用上非常不便. 针对这个问题,我们就可以采用单点登录的 ...