导言

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的安装和使用是

  1. pip install numpy # numpy 包的安装
  2. import numpy # numpy 包的导入

但是对于 PyMuPDF 这个包就不一样了,安装和使用的包名是不一样的,这个是历史遗留下来的原因,知道有这回事就行。

PyMuPDF 的安装是这样子的

  1. pip install PyMuPDF

image.png
PyPI 源:https://pypi.org/project/PyMuPDF/

PyMuPDF 的导入是这样子的

  1. import fitz

image.png

PDF 各种功能

拆分与提取

拆分与提取 PDF 文件的,使用的是 clean 命令,同时该命令也可以用于文档加密,压缩、删除页面等操作,基本说明如下:

  1. python -m fitz clean -h
  2. usage: fitz clean [-h] [-password PASSWORD]
  3. [-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}]
  4. [-owner OWNER] [-user USER] [-garbage {0,1,2,3,4}]
  5. [-compress] [-ascii] [-linear] [-permission PERMISSION]
  6. [-sanitize] [-pretty] [-pages PAGES]
  7. input output
  8. -------------- optimize PDF or create sub-PDF if pages given --------------
  9. positional arguments:
  10. input PDF filename
  11. output output PDF filename
  12. optional arguments:
  13. -h, --help show this help message and exit
  14. -password PASSWORD password
  15. -encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}
  16. encryption method
  17. -owner OWNER owner password
  18. -user USER user password
  19. -garbage {0,1,2,3,4} garbage collection level
  20. -compress compress (deflate) output
  21. -ascii ASCII encode binary data
  22. -linear format for fast web display
  23. -permission PERMISSION
  24. integer with permission levels
  25. -sanitize sanitize / clean contents
  26. -pretty prettify PDF structure
  27. -pages PAGES output selected pages, format: 1,5-7,50-N

以下命令只需在终端运行即可:

参数:2-N 代表去除第一页

  1. python -m fitz clean -sanitize -pages 2-N F:\视觉工程师必须知道的工业相机50问.pdf F:\去除第一页.pdf

其他功能清自行尝试

提取字体和图像(非PDF页面)

将字体或图像从选定的 PDF 页面提取到所需目录,基本说明如下:

  1. python -m fitz extract -h
  2. usage: fitz extract [-h] [-images] [-fonts] [-output OUTPUT] [-password PASSWORD]
  3. [-pages PAGES]
  4. input
  5. --------------------- extract images and fonts to disk --------------------
  6. positional arguments:
  7. input PDF filename
  8. optional arguments:
  9. -h, --help show this help message and exit
  10. -images extract images
  11. -fonts extract fonts
  12. -output OUTPUT output directory, defaults to current
  13. -password PASSWORD password
  14. -pages PAGES only consider these pages, format: 1,5-7,50-N

视觉工程师必须知道的工业相机50问.pdf 文件中的图片和字体提取到 提取结果 文件夹中

  1. python -m fitz extract -images -fonts -output F:\提取结果 F:\视觉工程师必须知道的工业相机50问.pdf
  2. saved 9 fonts to 'F:\提取结果'
  3. saved 6 images to 'F:\提取结果'

image.png

合并多份文档

合并多份 PDF 文档,使用的是 join 命令,可以指定页面进行合并,同时需要关注 PDF 是否需要密码才能打开,基本说明如下

  1. python -m fitz join -h
  2. usage: fitz join [-h] -output OUTPUT [input [input ...]]
  3. ---------------------------- join PDF documents ---------------------------
  4. positional arguments:
  5. input input filenames
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. -output OUTPUT output filename
  9. specify each input as 'filename[,password[,pages]]'

以下命令只需在终端运行即可:
合并两份文档的全部

  1. python -m fitz join -output "F:\合并两份文档.pdf" "F:\视觉工程师必须知道的工业相机50问.pdf" "F:\Modern CMake文档.pdf"

合并两份文档的部分,选择 视觉工程师必须知道的工业相机50问 文件的第一页和 Modern CMake文档.pdf 的 5 到最后一页进行合并,下面语句中有两个 ,, 是因为要合并的文档不需要密码,如果需要密码,就把两个逗号替换成 密码即可。

  • 5-N 代表第五页开始到文档的末尾
    1. python -m fitz join -output F:\合并两份文档.pdf F:\视觉工程师必须知道的工业相机50问.pdf,,1 "F:\Modern CMake文档.pdf",,5-N

PDF转换成图片

这个功能没办法像上面那样一个命令就能解决,不过通过查看文档,我们也不难写出代码

  1. import sys, fitz, os, datetime
  2. def pyMuPDF_fitz(pdfPath, imagePath):
  3. startTime_pdf2img = datetime.datetime.now()#开始时间
  4. print("imagePath="+imagePath)
  5. pdfDoc = fitz.open(pdfPath) # 打开文件
  6. for pg in range(pdfDoc.pageCount): # 遍历所有页面
  7. page = pdfDoc[pg]
  8. rotate = int(0) # 页面旋转角度
  9. # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
  10. # 此处若是不做设置,默认图片大小为:792X612, dpi=96
  11. zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)
  12. zoom_y = 1.33333333
  13. mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
  14. pix = page.getPixmap(matrix=mat, alpha=False)
  15. if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在
  16. os.makedirs(imagePath) # 若图片文件夹不存在就创建
  17. pix.writePNG(imagePath+'/'+'images_%s.png' % pg)#将图片写入指定的文件夹内
  18. endTime_pdf2img = datetime.datetime.now()#结束时间
  19. print('pdf2img时间=',(endTime_pdf2img - startTime_pdf2img).seconds)
  20. if __name__ == "__main__":
  21. pdfPath = './视觉工程师必须知道的工业相机50问.pdf'
  22. imagePath = './提取结果'
  23. pyMuPDF_fitz(pdfPath, imagePath)

image.png

一个神奇的 PDF 处理网站
语雀内容

以上就是 PDF 处理的几个常用功能,希望能够帮到你,喜欢的朋友感谢三连~~~

参考:
https://pymupdf.readthedocs.io/en/latest/index.html
https://www.jianshu.com/p/f57cc64b9f5e

PDF的各种操作,我用Python来实现(附网站和操作指导).md