# -*- coding: utf-8 -*-
'''提取图片内容
使用 fitz 打开文档,获取文档详细数据
遍历每一个元素,通过正则找到图片的索引位置
使用 Pixmap 将索引对应的元素生成图片
通过 size 函数过滤较小的图片
'''
import os
import re
import fitz
自定义函式名extract_pic_info(filepath, pic_dirpath)
"""
提取PDF中的图片
@param filepath:pdf文件路径
@param pic_dirpath:要保存的图片目录路径
@return:
"""
def extract_pic_info(filepath, pic_dirpath):
if not os.path.exists(pic_dirpath):
os.makedirs(pic_dirpath)
# 使用正则表达式来查找图片
check_XObject = r"/Type(?= */XObject)"
check_Image = r"/Subtype(?= */Image)"
img_count = 0
"""1. 打开pdf,打印相关信息"""
pdf_info = fitz.open(filepath)
xref_len = pdf_info.xref_length()
# 打印PDF的信息
print("文件名:{}, 页数: {}, 对象: {}".format(filepath, len(pdf_info), xref_len-1))
"""2. 遍历PDF中的对象,遇到是图像才进行下一步,不然就continue"""
for index in range(1, xref_len):
text = pdf_info.xref_object(index)
is_XObject = re.search(check_XObject, text)
is_Image = re.search(check_Image, text)
# 如果不是对象也不是图片,则不操作
if is_XObject or is_Image:
img_count += 1
# 根据索引生成图像
pix = fitz.Pixmap(pdf_info, index)
pic_filepath = os.path.join(pic_dirpath, 'img_' + str(img_count) + '.png')
"""三、 将图像存为png格式"""
if pix.n >= 5:
# 先转换CMYK
pix = fitz.Pixmap(fitz.csRGB, pix)
# 存为PNG
pix.write_png(pic_filepath)
# 提取图片内容
extract_pic_info(r'E:\learn\PDF相关处理\PDF提取图片\PDF图片.pdf', 'E:\learn\PDF相关处理\PDF提取图片')