赞
踩
昨天在群里看到有人问一段代码,竟没有人回复。
可能是发错了群聊,索性直接动手实现了一下。
群友给定代码,有大版本更新了,不适用于当前。
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])
执行如下:

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。