PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
导言
PDF 处理是日常工作中的常见需求,包括 PDF 合并、删除、提取等。更复杂的任务如:将 PDF 转换成 图像。
下面通过几个简单的例子和一份代码,帮助大家解决上面的需求,操作非常简单。
在文末我会提供一份源码和一个神奇的 PDF 处理网站帮你解决 PDF 处理的烦恼。
PyMuPDF 介绍
为什么使用 Python,那还不是 Python 有着强大的第三方工具包,我们想要的功能兴许就有。
PyMuPDF 就是我们需要的工具,官方文档对他的简介是
PyMuPDF 是针对 MuPDF 的 Python 绑定,它是一个轻量级 PDF 和 XPS 查看器。MuPDF 可以访问 PDF,XPS,OpenXPS,CBZ(漫画书档案),FB2 和 EPUB(电子书)格式的文件。这些是扩展名为.pdf,.xps,.oxps,.cbz,.fb2 或.epub 的文件(因此您可以使用 Python 开发电子书查看器)。
官方文档:https://pymupdf.readthedocs.io/en/latest/intro.html
这里有个细节需要说明的是,Python 的第三方包一般是安装的名称和导入的名称是一样的,比如 numpy 的安装和使用是
pip install numpy # numpy 包的安装
import numpy # numpy 包的导入
但是对于 PyMuPDF 这个包就不一样了,安装和使用的包名是不一样的,这个是历史遗留下来的原因,知道有这回事就行。
PyMuPDF 的安装是这样子的
pip install PyMuPDF
PyPI 源:https://pypi.org/project/PyMuPDF/
PyMuPDF 的导入是这样子的
import fitz
PDF 各种处理
拆分与提取
拆分与提取 PDF 文件的,使用的是 clean
命令,同时该命令也可以用于文档加密,压缩、删除页面等操作,基本说明如下:
python -m fitz clean -h
usage: fitz clean [-h] [-password PASSWORD]
[-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}]
[-owner OWNER] [-user USER] [-garbage {0,1,2,3,4}]
[-compress] [-ascii] [-linear] [-permission PERMISSION]
[-sanitize] [-pretty] [-pages PAGES]
input output
-------------- optimize PDF or create sub-PDF if pages given --------------
positional arguments:
input PDF filename
output output PDF filename
optional arguments:
-h, --help show this help message and exit
-password PASSWORD password
-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}
encryption method
-owner OWNER owner password
-user USER user password
-garbage {0,1,2,3,4} garbage collection level
-compress compress (deflate) output
-ascii ASCII encode binary data
-linear format for fast web display
-permission PERMISSION
integer with permission levels
-sanitize sanitize / clean contents
-pretty prettify PDF structure
-pages PAGES output selected pages, format: 1,5-7,50-N
以下命令只需在终端运行即可:
参数:2-N 代表去除第一页
python -m fitz clean -sanitize -pages 2-N F:视觉工程师必须知道的工业相机50问.pdf F:去除第一页.pdf
其他功能请自行尝试
提取字体和图像(非 PDF 页面)
将字体或图像从选定的 PDF 页面提取到所需目录,基本说明如下:
python -m fitz extract -h
usage: fitz extract [-h] [-images] [-fonts] [-output OUTPUT] [-password PASSWORD]
[-pages PAGES]
input
--------------------- extract images and fonts to disk --------------------
positional arguments:
input PDF filename
optional arguments:
-h, --help show this help message and exit
-images extract images
-fonts extract fonts
-output OUTPUT output directory, defaults to current
-password PASSWORD password
-pages PAGES only consider these pages, format: 1,5-7,50-N
将 视觉工程师必须知道的工业相机50问.pdf
文件中的图片和字体提取到 提取结果
文件夹中
python -m fitz extract -images -fonts -output F:提取结果 F:视觉工程师必须知道的工业相机50问.pdf
saved 9 fonts to 'F:提取结果'
saved 6 images to 'F:提取结果'
合并多份文档
合并多份 PDF 文档,使用的是 join
命令,可以指定页面进行合并,同时需要关注 PDF 是否需要密码才能打开,基本说明如下:
python -m fitz join -h
usage: fitz join [-h] -output OUTPUT [input [input ...]]
---------------------------- join PDF documents ---------------------------
positional arguments:
input input filenames
optional arguments:
-h, --help show this help message and exit
-output OUTPUT output filename
specify each input as 'filename[,password[,pages]]'
以下命令只需在终端运行即可:合并两份文档的全部
python -m fitz join -output "F:合并两份文档.pdf" "F:视觉工程师必须知道的工业相机50问.pdf" "F:Modern CMake文档.pdf"
合并两份文档的部分,选择 视觉工程师必须知道的工业相机50问
文件的第一页和 Modern CMake文档.pdf
的 5 到最后一页进行合并,下面语句中有两个 ,,
是因为要合并的文档不需要密码,如果需要密码,就把两个逗号替换成 密码即可。
- 5-N 代表第五页开始到文档的末尾
python -m fitz join -output F:合并两份文档.pdf F:视觉工程师必须知道的工业相机50问.pdf,,1 "F:Modern CMake文档.pdf",,5-N
PDF 转换成图片
这个功能没办法像上面那样一个命令就能解决,不过通过查看文档,我们也不难写出代码
import sys, fitz, os, datetime
def pyMuPDF_fitz(pdfPath, imagePath):
startTime_pdf2img = datetime.datetime.now()#开始时间
print("imagePath="+imagePath)
pdfDoc = fitz.open(pdfPath) # 打开文件
for pg in range(pdfDoc.pageCount): # 遍历所有页面
page = pdfDoc[pg]
rotate = int(0) # 页面旋转角度
# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)
zoom_y = 1.33333333
mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pix = page.getPixmap(matrix=mat, alpha=False)
if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在
os.makedirs(imagePath) # 若图片文件夹不存在就创建
pix.writePNG(imagePath+'/'+'images_%s.png' % pg)#将图片写入指定的文件夹内
endTime_pdf2img = datetime.datetime.now()#结束时间
print('pdf2img时间=',(endTime_pdf2img - startTime_pdf2img).seconds)
if __name__ == "__main__":
pdfPath = './视觉工程师必须知道的工业相机50问.pdf'
imagePath = './提取结果'
pyMuPDF_fitz(pdfPath, imagePath)
旋转 10 度的结果
神奇的网站明天再放出,哈哈哈~~~
以上就是 PDF 处理的几个常用功能,希望能够帮到你,喜欢的朋友感谢三连~~~
参考:
- https://pymupdf.readthedocs.io/en/latest/index.html
- https://www.jianshu.com/p/f57cc64b9f5e
- asp.net动态增加服务器端控件并提交表单
- c# asp.net 实现分页(pager)功能
- 一次数据库无法登陆的"问题"及排查(r2第11天)
- popcorn-js视频Video框架简单用法
- 一次数据库响应缓慢的问题排查(r2第9天)
- 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
- C# 读取指定文件夹下所有文件
- ASP.NET 实现Base64文件流下载PDF
- MVC自定义视图引擎地址
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
- impdp异常中断导致的问题(r2第8天)
- 利用autocomplete.js实现仿搜索效果(ajax动态获取后端[C#]数据)
- sql语句的简化(r2第7天)
- Ajax jsonp 跨域请求实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android的App启动时白屏的问题解决办法
- Android获取本机各种类型文件的方法
- Android保存联系人到通讯录的方法
- Android学习之本地广播使用方法详解
- Android编程获取图片数据的方法详解
- Android垂直滚动控件ScrollView使用方法详解
- Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
- Android ExpandableRecyclerView使用方法详解
- Android开发之SD卡文件操作分析
- Android学习之Broadcast的简单使用
- Android 仿微信自定义数字键盘的实现代码
- RN在Android打包发布App(详解)
- Android开发之使用SQLite存储数据的方法分析
- Android进度条控件progressbar使用方法详解
- Android自定义view利用Xfermode实现动态文字加载动画