Python将PDF文件转成图片

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2021-01-08 12:49:52
# @Author : KY (owenyk@q.com)
# @Link : http://example.org
# @Version : $Id$

#安装fitz
#pip install fitz
#安装依赖PyMuPDF
#pip install PyMuPDF

import fitz
import re
import os



def pdf2png(file_path, pic_path):
doc = fitz.open(file_path) # 打开PDF文件,生成一个对象
for pg in range(doc.pageCount): #遍历pdf每一个页面
page = doc[pg]
rotate = int(0) #图片计数

# 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
zoom_x = 2.0 #x轴方向
zoom_y = 2.0 #y轴方向
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pm = page.getPixmap(matrix=trans, alpha=False) #获取缩放后的图片
#pm.writePNG('%s.png' % pg)
img_name = "img{}.png".format(rotate) #生成图片文件名
pm.writePNG(os.path.join(pic_path,img_name)) #写入图片文件
print('%s.png 完成' % pg)
if __name__ == '__main__':
file_path = r'###.pdf' #pdf文档路径
pic_path = 'M:\\pic' #图片路径
pdf2png(file_path, pic_path)

如果不使用函数简化写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import fitz

file_path = r'###.pdf' #pdf文档路径
doc = fitz.open(file_path) # 打开PDF文件,生成一个对象
for pg in range(doc.pageCount): #遍历pdf每一个页面
page = doc[pg]
rotate = int(0) #图片计数

# 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
zoom_x = 2.0 #x轴方向
zoom_y = 2.0 #y轴方向
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pm = page.getPixmap(matrix=trans, alpha=False) #获取缩放后的图片
pm.writePNG('%s.png' % pg)
#img_name = "img{}.png".format(rotate) #生成图片文件名
#pm.writePNG(os.path.join(pic_path,img_name)) #写入图片文件
print('%s.png 完成' % pg)

这样转换是会将整个pdf页面转成PNG图片,如需将页面中的部分转换图片可参照下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import fitz
import re
import os


def pdf2pic(path, pic_path):
'''
# 从pdf中提取图片
:param path: pdf的路径
:param pic_path: 图片保存的路径
:return:
'''
# 打开pdf
doc = fitz.open(path)
nums = doc._getXrefLength()
imgcount = 0 # 图像计数

# 遍历每一个对象
for i in range(1, nums):
text = doc._getXrefString(i)
# print(i, text)
# 过滤无用图片
if ('Width 2550' in text) and ('Height 3300' in text) or ('thumbnail' in text):
continue

# 使用正则表达式来查找图片
checkXO = r"/Type(?= */XObject)"
checkIM = r"/Subtype(?= */Image)"

isXObject = re.search(checkXO, text)
isImage = re.search(checkIM, text)

# 不符合条件, continue
if not isXObject or not isImage:
continue
imgcount += 1

# 生成图像
pix = fitz.Pixmap(doc, i)

# 保存图像名
img_name = "img{}.png".format(imgcount)

# 如果pix.n<5,可以直接存为PNG
if pix.n < 5:
try:
pix.writePNG(os.path.join(pic_path, img_name))
pix = None
except:
pix0 = fitz.Pixmap(fitz.csRGB, pix)
pix0.writePNG(os.path.join(pic_path, img_name))
pix0 = None

if __name__ == '__main__':
# pdf路径
path = r'test.pdf'

# 保存的图片路径
pic_path = 'img'

pdf2pic(path, pic_path)

转载于Python使用Fitz库提取PDF格式的图像(适用于各种类型的PDF),利用,fitz,pdf,中,图片,针对,多种类型