一、安装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的提取、合并、旋转、缩放、加密的更多相关文章

  1. PyMuPDF库(处理PDF)

    昨天在公司需要把一份PDF格式认证表转换为图片JPEG格式,所以在网上查询了一些与此相关的python库,最后看网上大多都是使用Wand和PyMuPDF,在安装了Wand库后,导入相应的模块后报错了, ...

  2. 利用python的requests和BeautifulSoup库爬取小说网站内容

    1. 什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约 ...

  3. 利用python进行数据分析之pandas库的应用(二)

    本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 >>> from panda ...

  4. 利用python进行数据分析之pandas库的应用(一)

    一.pandas的数据结构介绍 Series Series是由一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据索引构成.仅由一组数据可产生最简单的Series. obj=Series([4 ...

  5. 利用Python进行数据分析——数据规整化:清理、转换、合并、重塑(七)(1)

    数据分析和建模方面的大量编程工作都是用在数据准备上的:载入.清理.转换以及重塑.有时候,存放在文件或数据库中的数据并不能满足你的数据处理应用的要求.很多人都选择使用通用编程语言(如Python.Per ...

  6. 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md

    学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...

  7. Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)

    PDF文件格式 如今,可移植文档格式(PDF)属于最常用的数据格式.在1990年,PDF文档的结构由Adobe定义.PDF格式的思想是,对于通信过程中涉及的双方(创建者,作者或发送者以及接收者)而言, ...

  8. 利用python库twilio来免费发送短信

    大家好,我是四毛,最近开通了个人公众号“用Python来编程”,欢迎大家“关注”,这样您就可以收到优质的文章了. 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图 ...

  9. 利用Python进行数据分析——重要的Python库介绍

    利用Python进行数据分析--重要的Python库介绍 一.NumPy 用于数组执行元素级计算及直接对数组执行数学运算 线性代数运算.傅里叶运算.随机数的生成 用于C/C++等代码的集成 二.pan ...

  10. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

随机推荐

  1. 【必知必会的MySQL知识】⑤DQL语言

    目录 一.前言 二.基础查询 2.1 语法 2.2 实践操作 三.条件查询 3.1 语法 3.2 where 语句操作符 3.3 实践操作 四.排序查询 4.1 语法格式 4.2 实践操作 五.分组查 ...

  2. git仓库过渡,同时向两个仓库推送代码

    公司部门被大佬收购,产品项目迁移新公司仓库,过渡期间产品上线流程继续使用原公司的,新公司部署新系统后通过域名重定向逐渐将用户引流到新系统上完成切换,最后关闭原公司系统及上线流程. 过渡期间新功能代码需 ...

  3. 2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边,记录在二维数组edges里, 比如ed

    2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边,记录在二维数组edges里, 比如ed ...

  4. 2022-04-14:小美有一个长度为n的数组, 为了使得这个数组的和尽量大,她向会魔法的小团进行求助。 小团可以选择数组中至多两个不相交的子数组, 并将区间里的数全都变为原来的10倍。 小团想知道他

    2022-04-14:小美有一个长度为n的数组, 为了使得这个数组的和尽量大,她向会魔法的小团进行求助. 小团可以选择数组中至多两个不相交的子数组, 并将区间里的数全都变为原来的10倍. 小团想知道他 ...

  5. 2021-04-03:给定两个字符串str1和str2,想把str2整体插入到str1中的某个位置,形成最大的字典序,返回字典序最大的结果。

    2021-04-03:给定两个字符串str1和str2,想把str2整体插入到str1中的某个位置,形成最大的字典序,返回字典序最大的结果. 福大大 答案2021-04-03: 1.暴力法. 2.DC ...

  6. 2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 输入:arr = [2,3,4,7,11], k = 5。 输出:9

    2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k . 请你找到这个数组里第 k 个缺失的正整数. 输入:arr = [2,3,4,7,11], k = 5. 输出:9 ...

  7. 7-8 切分表达式——写个tokenizer吧 (20 分)

    1.题目描述: [先说点出题背景] 这个题是为低年级同学.学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂.如果是高年级.学过了正则表达式(Regular Expression) ...

  8. Ubuntu 18.04 (Bionic) 简单快速的安装mongodb

    按步骤走,不带脑子式安装(注意4.0版本mongodb官方已经不再支持,以下代码中可以修改mongodb版本号安装,目前最新版为6.0,如果懒得改直接用也可以,文章后边第三章第一条代码会直接升级为最新 ...

  9. Error: Failed to download resource "python"

    最近在mac 部署flutter开发环境遇到一些IOS开发工具安装的问题,为解决问题到处寻找答案,浪费了大量时间,故在此记录一下避免再次入坑 执行flutter doctor检测环境 开始安装缺失工具 ...

  10. 2023-05-25:给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的表达式 其中每个运算符 op1,op2,… 可以是加、减、乘、除之一 例如

    2023-05-25:给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的表达式 其中每个运算符 op1,op2,- 可以是加.减.乘.除之一 例如 ...