前言
昨天在群里看到有人问一段代码,竟没有人回复。
可能是发错了群聊,索性直接动手实现了一下。
群友给定代码,有大版本更新了,不适用于当前。
目录
- 安装
Python
环境 以及相关依赖 - 创建目录
res-pdf
将需要转换文件 移至该目录下 - 运行程序
一、安装
环境: Python 3.9.6
官网:Download
Win64:下载
安装后,cmd 执行如下命令
# 更换 pip 镜像源, 加快下载依赖的速度
pip config set global.index-url http://pypi.douban.com/simple/
pip config set install.trusted-host pypi.douban.com
# 安装依赖
pip install fitz pymupdf
二、完整代码
# -*- coding: utf-8 -*-
"""
@Author: kong
@File : pdf-img.py
@Date : 2023-05-25 05:54:30
@GitHub: https://github.com/kongxiaoaaa
@notes : PDF 自动提取 并 动态创建图集
"""
import time
import os
from pathlib import Path
from fitz import fitz
def doc_to_img(doc, img_count, pdf_name, save_dir):
"""文档提取图片
Args:
`doc`: 文档对象
`img_count`: 图片数量
`pdf_name`: 文档名称
`save_dir`: 文档存储路径
Return:
"""
# 遍历doc,获取每一页
for page in doc:
try:
img_count += 1
lstImage = list(page.get_images())
# 取第一个元组
xref0 = lstImage[0]
# 元组转化为列表
xref1 = list(xref0)
# 最终取得xref
xref = xref1[0]
# 获取文件扩展名,图片内容 等信息
img = doc.extract_image(xref)
# 合成最终图像完整路径名
imageFilename = os.path.join(
save_dir,
pdf_name + "_" +
("%s-%s." % (img_count, xref) + img["ext"])
)
# 存储图片
with open(imageFilename, mode="wb") as file_obj:
file_obj.write(img["image"])
except Exception as err:
_ = err
continue
return img_count
def run(path: Path, save_dir: Path):
''' 从pdf中提取图片
Args:
`path`: pdf的路径
`save_dir`: 图片保存的路径
Return:
'''
# 开始时间
start_time = time.time()
# 分离出文件名和路径
pdfsplit = os.path.split(path)
# 获取文件名
pdfname = pdfsplit[-1]
pdfsplit1 = os.path.splitext(pdfname)
# 获取不带扩展名的文件名
pdf_name = pdfsplit1[0]
# 文档对象
with fitz.Document(path) as doc:
# 图片计数
img_count = 0
# 获取pdf文件对象总数
lenXREF = doc.xref_length()
# 打印PDF的信息
print(f"\n文件名:{path}, 页数: {len(doc)}, 对象: {lenXREF - 1}")
img_count = doc_to_img(doc, img_count, pdf_name, save_dir)
# 结束时间
end_time = time.time()
print(f"运行时间:{end_time - start_time}s")
print(f"提取了{img_count}张图片\n-------------------")
def read_pdf_dir() -> list:
"""读取pdf所在目录
Args:
Return:
返回所有 PDF 目录
"""
pdf_dir: Path = Path(__file__).parent / "res-pdf"
pdf_list = [_ for _ in pdf_dir.glob("*.pdf")]
return pdf_list
def create_pdf_imgs_dir(pdf_loads: list):
"""为每一个PDF创建一个图集
Args:
`pdf_loads`: pdf 文件路径
Return:
生成器返回当前PDF的路径
"""
for pdf_local in pdf_loads:
pdf_dir = Path(str(pdf_local).strip(".pdf"))
if not pdf_dir.exists():
pdf_dir.mkdir()
yield pdf_local, pdf_dir
if __name__ == "__main__":
"""
1. 请创建一个名为 res-pdf 的文件夹
2. 将需要提取的 pdf 放在其中
3. 运行程序
"""
dirs = read_pdf_dir()
# 遍历创建图片集
for load_info in create_pdf_imgs_dir(dirs):
run(load_info[0], load_info[1])
执行如下: