当前位置: 首页 > article >正文

一款基于Python的从常规文档里提取图片的简单工具开发方案

一款基于Python的从常规文档里提取图片的简单工具开发方案


在这里插入图片描述

1. 环境准备

安装必需库

pip install python-docx PyMuPDF openpyxl beautifulsoup4 pillow
pip install pdfplumber  # PDF解析备用方案
pip install tk          # Python自带,无需安装

工具选择

  • 开发环境:VSCode + Python插件
  • 调试工具:Python IDLE(初学者友好)
  • 打包工具:pyinstaller(可选,用于生成exe)

2. 项目架构设计

image-extractor/
├── main.py            # 主程序入口
├── core/
│   ├── docx_extractor.py
│   ├── pdf_extractor.py
│   ├── excel_extractor.py
│   └── html_extractor.py
└── outputs/           # 默认输出目录

3. 核心功能实现

(1) Word文档提取 (docx_extractor.py)

import zipfile
import os
from PIL import Imagedef extract_docx_images(file_path, output_dir):# 解压docx文件with zipfile.ZipFile(file_path, 'r') as zip_ref:# 提取media文件夹内的图片image_files = [f for f in zip_ref.namelist() if f.startswith('word/media/')]for img_file in image_files:# 保存图片到输出目录zip_ref.extract(img_file, output_dir)# 重命名文件src = os.path.join(output_dir, img_file)dst = os.path.join(output_dir, os.path.basename(img_file))os.rename(src, dst)return len(image_files)

(2) PDF文件提取 (pdf_extractor.py)

import fitz  # PyMuPDF
import osdef extract_pdf_images(file_path, output_dir):doc = fitz.open(file_path)img_count = 0for page_num in range(len(doc)):page = doc.load_page(page_num)images = page.get_images(full=True)for img_index, img in enumerate(images):xref = img[0]base_image = doc.extract_image(xref)img_data = base_image["image"]# 保存为PNGimg_path = os.path.join(output_dir, f"pdf_page{page_num}_img{img_index}.png")with open(img_path, "wb") as f:f.write(img_data)img_count += 1return img_count

(3) Excel文件提取 (excel_extractor.py)

from openpyxl import load_workbook
import osdef extract_excel_images(file_path, output_dir):wb = load_workbook(file_path)img_count = 0for sheet in wb.worksheets:for image in sheet._images:# 获取图片数据img = image._dataimg_path = os.path.join(output_dir, f"excel_{sheet.title}_img{img_count}.png")with open(img_path, "wb") as f:f.write(img)img_count += 1return img_count

(4) HTML文件提取 (html_extractor.py)

import requests
from bs4 import BeautifulSoup
import os
import base64def extract_html_images(html_path, output_dir):if html_path.startswith('http'):response = requests.get(html_path)soup = BeautifulSoup(response.text, 'html.parser')else:with open(html_path, 'r') as f:soup = BeautifulSoup(f.read(), 'html.parser')img_tags = soup.find_all('img')img_count = 0for img in img_tags:src = img.get('src')if src.startswith('data:image'):# 处理base64编码图片header, data = src.split(',', 1)img_format = header.split('/')[1].split(';')[0]img_data = base64.b64decode(data)img_path = os.path.join(output_dir, f"html_img{img_count}.{img_format}")with open(img_path, 'wb') as f:f.write(img_data)img_count += 1return img_count

4. 交互界面开发 (main.py)

import tkinter as tk
from tkinter import filedialog, messagebox
from core import docx_extractor, pdf_extractor, excel_extractor, html_extractor
import osclass ImageExtractorApp:def __init__(self, root):self.root = rootself.root.title("多格式图片提取工具")# 文件路径变量self.file_path = tk.StringVar()self.output_dir = tk.StringVar(value="outputs")# 创建界面组件self.create_widgets()def create_widgets(self):# 文件选择tk.Label(self.root, text="选择文件:").grid(row=0, column=0, padx=5, pady=5)tk.Entry(self.root, textvariable=self.file_path, width=40).grid(row=0, column=1)tk.Button(self.root, text="浏览", command=self.select_file).grid(row=0, column=2)# 输出目录tk.Label(self.root, text="输出目录:").grid(row=1, column=0)tk.Entry(self.root, textvariable=self.output_dir, width=40).grid(row=1, column=1)tk.Button(self.root, text="选择目录", command=self.select_output_dir).grid(row=1, column=2)# 执行按钮tk.Button(self.root, text="开始提取", command=self.start_extraction).grid(row=2, column=1, pady=10)# 日志区域self.log_text = tk.Text(self.root, height=10, width=50)self.log_text.grid(row=3, column=0, columnspan=3)def select_file(self):file_types = [('支持的文件类型', '*.docx *.pdf *.xlsx *.html'),('Word文档', '*.docx'),('PDF文件', '*.pdf'),('Excel文件', '*.xlsx'),('网页文件', '*.html')]self.file_path.set(filedialog.askopenfilename(filetypes=file_types))def select_output_dir(self):self.output_dir.set(filedialog.askdirectory())def start_extraction(self):file_path = self.file_path.get()output_dir = self.output_dir.get()if not os.path.exists(output_dir):os.makedirs(output_dir)ext = os.path.splitext(file_path)[1].lower()try:if ext == '.docx':count = docx_extractor.extract_docx_images(file_path, output_dir)elif ext == '.pdf':count = pdf_extractor.extract_pdf_images(file_path, output_dir)elif ext == '.xlsx':count = excel_extractor.extract_excel_images(file_path, output_dir)elif ext == '.html':count = html_extractor.extract_html_images(file_path, output_dir)else:messagebox.showerror("错误", "不支持的文件类型")returnself.log_text.insert(tk.END, f"成功提取 {count} 张图片到 {output_dir}\n")except Exception as e:messagebox.showerror("错误", f"提取失败: {str(e)}")if __name__ == "__main__":root = tk.Tk()app = ImageExtractorApp(root)root.mainloop()

5. 使用说明

操作步骤

  1. 运行 main.py
  2. 点击 浏览 选择文件 (支持.docx/.pdf/.xlsx/.html)
  3. 选择输出目录(默认 outputs)
  4. 点击 开始提取
  5. 查看底部日志区域的提取结果

效果示例

成功提取 5 张图片到 outputs/
成功提取 3 张图片到 outputs/

6. 常见问题解决

Q1: Excel图片无法提取?

  • 原因:openpyxl只能提取嵌入式图片,无法提取浮动图片
  • 解决方案:改用xlrd+图像坐标识别(需更复杂处理)

Q2: PDF提取的图片模糊?

  • 原因:PDF内嵌低分辨率图片
  • 解决方案:使用pdfplumber的更高精度提取模式

Q3: 程序无响应?

  • 原因:大文件处理耗时阻塞主线程
  • 解决方案:改用多线程处理(参考threading模块)

7. 项目扩展建议

  1. 增加批量处理:支持文件夹批量导入
  2. 添加图片预览:在界面中显示缩略图
  3. 支持压缩包:直接解压ZIP/RAR文件并处理内容
  4. 增加格式转换:自动转换HEIC/WEBP等特殊格式

相关文章:

一款基于Python的从常规文档里提取图片的简单工具开发方案

一款基于Python的从常规文档里提取图片的简单工具开发方案 1. 环境准备 安装必需库 pip install python-docx PyMuPDF openpyxl beautifulsoup4 pillow pip install pdfplumber # PDF解析备用方案 pip install tk # Python自带,无需安装工具选择 开发环…...

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具,但从 2024.02 版本起,JetBrains 调整了试用政策,新用户不再享有默认的 30 天免费试用…...

Pytorch实现之BCGAN实现双生成器架构的人脸面部生成

简介 简介:通过双生成器架构与重建损失进行循环的生成训练,实现人脸面部表情合成。 论文题目:BCGAN: Facial Expression Synthesis by Bottleneck-Layered Conditional Generative Adversarial Networks (基于瓶颈分层条件生成对抗网络的面部表情合成) 会议:2021 15th…...

智慧加油站小程序数据库设计文档

智慧加油站系统 - 数据库与API设计文档 1. 数据库设计 1.1 ER模型 系统的核心实体关系如下&#xff1a; 用户(User) ---< 订单(Order) ---< 加油记录(RefuelRecord)| | || | vv v …...

Docker生存手册:安装到服务一本通

文章目录 一. Docker 容器介绍1.1 什么是Docker容器&#xff1f;1.2 为什么需要Docker容器&#xff1f;1.3 Docker架构1.4 Docker 相关概念1.5 Docker特点 二. Docker 安装2.1 查看Linux内核版本2.2 卸载老版本docker&#xff0c;避免产生影响2.3 升级yum 和配置源2.4 安装Dock…...

Linux内核传输层UDP源码分析

一、用户数据包协议&#xff08;UDP&#xff09; 1.UDP数据报头 UDP 提供面向消息的不可靠传输&#xff0c;但没有拥塞控制功能。很多协议都使用 UDP&#xff0c;如用于 IP 网络传输音频和视频的实时传输协议 (Real-time Transport Protocol&#xff0c;RTP)&#xff0c;此类型…...

FPGA学习(二)——实现LED流水灯

FPGA学习(二)——实现LED流水灯 目录 FPGA学习(二)——实现LED流水灯一、DE2-115时钟源二、控制6个LED灯实现流水灯1、核心逻辑2、代码实现3、引脚配置4、实现效果 三、模块化代码1、分频模块2、复位暂停模块3、顶层模块 四、总结 一、DE2-115时钟源 DE2-115板子包含一个50MHz…...

E1-最远距离(stl使用)

题目描述 给定一个数组&#xff0c;请你找出数组中相同元素之间的最远距离。若数组中不存在相同元素&#xff0c;则输出 null。 输入描述 输入一个数组&#xff0c;数组长度不超过 10000。格式请见用例。 输出描述 输出数组中相同元素的最远距离。 用例 输入 [3, 2, 3,…...

Linux如何在设备树中表示和引用设备信息

DTS基本知识 dts 硬件的相应信息都会写在.dts为后缀的文件中&#xff0c;每一款硬件可以单独写一份xxxx.dts&#xff0c;一般在Linux源码中存在大量的dts文件&#xff0c;对于arm架构可以在arch/arm/boot/dts找到相应的dts&#xff0c;一个dts文件对应一个ARM的machie。 dtsi 值…...

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学&#xff0c;一般都是研究其悬…...

Maven核心包:maven-resolver-api

在阅读 nexus-pubic 开源项目过程中&#xff0c;使用了大量的核心组件进行轻量化集成。它的这种构建方式&#xff0c;在阅读过程中不得不感概&#xff0c;节省成本从构建项目的方式上就遥遥领先了。但是 maven核心包&#xff0c;依然使用前几年的aether-spi&#xff0c;却没有更…...

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了&#xff0c;之前也断过一次&#xff0c;使用次数并没有特别多。上方的图是正常的把手状态&#xff0c;断的形状如下方图所示。 这种悬臂梁结构&#xff0c;没有一个良好的圆角过渡&#xff0c;导致应力集中。窗户的开关&#xff0c;对应的是把手的推拉&#xff…...

[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅

074_ai辅助编程_水果程序_fruits_加法 回忆上次内容 上次直接从模块中导入变量、函数 from my_file import pi 导入my_file.pi 并作为 pi 使用 from my_file import pi as my_pi 导入变量 并 重命名 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; …...

【图论】并查集的学习和使用

目录 并查集是什么&#xff1f; 举个例子 组成 父亲数组&#xff1a; find函数&#xff1a; union函数&#xff1a; 代码实现&#xff1a; fa[] 初始化code: find code&#xff1a; 递归实现: 非递归实现: union code : 画图模拟&#xff1a; 路径压缩&#xff1a…...

欢乐力扣:反转链表

文章目录 1、题目描述2、思路 1、题目描述 反转链表。  给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2、思路 借助cur指针和pre双指针来调整链表的前后指向。 # Definition for singly-linked list. # class ListNode: # def __i…...

1.8PageTable

页表的作用 虚拟地址空间映射&#xff1a;页表记录了进程的虚拟页号到物理页号的映射关系。每个进程都有自己的页表&#xff0c;操作系统为每个进程维护一个独立的页表。内存管理&#xff1a;页表用于实现虚拟内存管理&#xff0c;支持进程的虚拟地址空间和物理地址空间之间的…...

什么是大带宽服务器

什么是大带宽服务器&#xff1f; 在深入探讨大带宽之前&#xff0c;让我们先明确带宽的概念。带宽与我们日常所说的宽带有所不同&#xff0c;宽带是运营商为满足家庭或商业上网需求所提供的服务&#xff0c;而带宽则特指数据的传输速度&#xff0c;尤其是上行速度。大带宽服务…...

【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

Compose 实践与探索十二 —— 附带效应

1、SideEffect Google 官方文档对 side effect 有两种翻译&#xff0c;简体中文翻译为附带效应&#xff0c;繁体中文翻译为副作用。这两个翻译我们用哪个都行&#xff0c;关键是如何理解它的含义。 1.1 什么是副作用 我们在日常生活中听到的副作用大多是医学领域中的&#x…...

Kubernetes 控制平面详解 —— 探秘 API Server、Controller Manager、Scheduler 与 etcd

文章目录 Kubernetes 控制平面详解 —— 探秘 API Server、Controller Manager、Scheduler 与 etcd控制平面概述API Server角色与职责工作原理 etcd角色与职责工作原理 Scheduler角色与职责工作原理 Controller Manager角色与职责工作原理 总结 Kubernetes 控制平面详解 —— 探…...

SSM基础专项复习4——Maven项目管理工具(1)

系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架&#xff08;1&#xff09;-CSDN博客 3、SSM基础专项复习3——Spring框架&#xff08;2&#xff09;-CSDN博客 文章目录 系列文章 1. Maven 的概念 1.1. 什么是 Maven 1.2. 什…...

使用c#进行串口通信

一、串口通信协议 1.串口通信协议简介 串口通信&#xff08;serial communication&#xff09;是一种设备间非常常用的串行通信方式&#xff0c;大部分电子设备都支持&#xff0c;电子工程师再调试设备时也经常使用该通信方式输出调试信息。讲到某一种通信协议&#xff0c;离…...

Web开发-PHP应用鉴别修复AI算法流量检测PHP.INI通用过滤内置函数

知识点&#xff1a; 1、安全开发-原生PHP-PHP.INI安全 2、安全开发-原生PHP-全局文件&单函数 3、安全开发-原生PHP-流量检测&AI算法 一、演示案例-WEB开发-修复方案-PHP.INI配置 文章参考&#xff1a; https://www.yisu.com/ask/28100386.html https://blog.csdn.net/…...

蓝桥模拟+真题讲解

今天谁一篇文章哈 &#xff01; 由于本篇文章有些的题目只有图片&#xff0c;因此还望各位见谅。 目录 第一题 题目解析 代码原理 代码编写 填空技巧---巧用python 第二题 题目解析 ​编辑 填空技巧---巧用python 第三题 题目链接 题目解析 必备知识 解题技巧 …...

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言&#xff1a;为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时…...

大模型的参数数量与学习的知识数量之间

大模型的参数数量与学习的知识数量之间 大模型的参数数量与学习的知识数量之间呈现非线性、条件依赖的复杂关系,其本质是**「表达能力」与「知识编码效率」的动态博弈**。以下从五个维度拆解核心逻辑: 一、参数是知识的「载体容量」,但非唯一决定因素 理论上限:参数数量决…...

基于Python的selenium入门超详细教程(第2章)--单元测试框架unittest

学习路线 自动化测试介绍及学习路线-CSDN博客 ​自动化测试之Web自动化&#xff08;基于pythonselenium&#xff09;-CSDN博客 基于Python的selenium入门超详细教程(第1章)--WebDriver API篇-CSDN博客 目录 前言&#xff1a; 一、单元测试 1. 单元测试的定义 2. 单元测…...

日志、类加载器、XML(配置文件)

目录 一、日志1.日志技术的概述2.日志技术的体系a. Logback 3.日志的级别 二、类加载器1.概述2.类加载时机3.类加载过程3.类加载器的分类4.常用方法 三、XML&#xff08;配置文件&#xff09;1.概述2.XML的基本语法3.XML的文档约束a.DTD约束b.schema约束 4.XML文档解析a.Dom4jb…...

Flutter中的const和final的区别

目录 一、核心区别对比表 二、初始化机制深度解析 1. const 的编译期特性 2. final 的运行时特性 三、内存管理差异 1. const 的内存优化 2. final 的独立内存 四、集合类型的本质区别 1. const 集合的完全不可变性 2. final 集合的引用不可变性 五、在 Flutter 中的…...

DAY34 贪心算法Ⅲ

134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 这种环路问题要记一下。 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum0;int totalSum0;int start0;for(int i0;i<gas.size();i){curSumga…...