1、使用内置模块zipfile提取
1.1 读取Word文件结构
我们需要先将.docx文件视为一种特殊的zip存档,因为.docx文件本质上是XML和其他资源(如图片)的集合,压缩在一个zip文件中。通过Python的内置zipfile模块,我们可以访问这些资源。
import zipfile
import os
def extract_images_from_word(docx_path, output_folder):
# 解压.docx文件
with zipfile.ZipFile(docx_path, 'r') as docx_zip:
# 遍历解压后的文件列表,查找图片
for filename in docx_zip.namelist():
if filename.endswith(('.jpg', '.jpeg', '.png', '.gif')):
# 临时保存图片文件
with docx_zip.open(filename) as img_file, open(os.path.join(output_folder, filename.replace('/', '_')), 'wb') as img_out:
img_out.write(img_file.read())1.2 提取并保存图片
docx_path = 'C:/Users/xxxx/Desktop/xxxxx.docx'
extract_images_from_word(docx_path, './output')
上述代码片段展示了如何利用zipfile解压.docx文件 ,识别其中的图片文件(常见格式如.jpg,.jpeg,.png,.gif),并将它们保存到指定的输出文件夹。
2、使用Python-docx库操作
2.1 安装与导入
为了从Word文档中提取图片,我们可以利用python-docx库,它提供了丰富的API来操作.docx文件。首先 ,确保你的环境中安装了此库。如果尚未安装 ,可以通过pip命令轻松安装:
pip install python-docx
接下来,在你的Python脚本中导入必要的模块:
from docx import Document2.2 遍历Word文档图片
使用python-docx,你可以打开一个Word文档并遍历其中的段落与表格 ,查找包含图片的元素。图片通常存储在InlineShape对象中,可通过访问段落或表格单元格的属性来获取。
def extract_images(document_path):
document = Document(document_path)
for paragraph in document.paragraphs:
for inline_shape in paragraph.inline_shapes:
if inline_shape.type == inline_shape.PICTURE:
yield inline_shape
for table in document.tables:
for row in table.rows:
for cell in row.cells:
for inline_shape in cell.inline_shapes:
if inline_shape.type == inline_shape.PICTURE:
yield inline_shape2.3 图片提取实现
提取图片的具体实现包括保存图片到本地文件系统。以下代码展示了如何将找到的图片保存为.png格式:
现在,结合上述两个函数,你可以从指定的Word文档中提取所有图片:
document_path = 'example.docx'
output_folder = 'extracted_images'
# 提取文档中的图片
shapes = extract_images(document_path)
# 保存图片
save_extracted_images(shapes, output_folder)
通过这段代码,Word文档中的每张图片都会被逐个提取并保存到指定的output_folder目录下 ,每个图片文件名按照提取顺序编号命名。
3、使用COM接口自动化 🤖
3.1 Python调用Word COM
利用Python调用Word的COM接口是一种强大的方式来操作Word文档,包括提取图片。这需要你的系统上安装有Microsoft Word。通过pywin32库,可以实现与Word的交互。首先 ,确保安装pywin32:
pip install pywin32
接着 ,通过以下代码实例展示如何启动Word应用程序并准备提取图片:
import os
import win32com.client
# 初始化Word应用程序
word = win32com.client.Dispatch("Word.Application")
word.Visible = False # 设置为False ,不显示Word界面
# 打开文档
doc_path = 'example.docx'
doc = word.Documents.Open(doc_path)3.2 批量导出图片
利用Word的COM接口遍历文档中的图片,并逐一导出。以下代码演示了这一过程:
def export_images_via_com(doc, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历文档中的每个形状 ,查找图片
for shape in doc.InlineShapes:
if shape.Type == 3: # 图片类型标识
image_path = os.path.join(output_folder, f'image_{shape.Id}.png')
shape.Range.Export(filename=image_path, filter='PNG')
doc.Close(True) # 关闭文档 ,不提示保存更改
word.Quit() # 退出Word应用
# 调用函数导出图片
export_images_via_com(doc, 'extracted_images_com')
这段代码会遍历Word文档中的所有图片(InlineShapes),判断它们是否为图片类型(类型标识为3) ,然后导出为PNG格式至指定的output_folder目录下。请注意,图片的命名规则是基于其在文档中的ID,确保了每个图片的唯一性。
通过上述方法 ,你可以利用Python和Word的COM接口高效地批量提取Word文档中的图片。这种方式特别适用于需要深入Word文档内部结构进行操作的场景。
4、使用extract_images_from_docx模块
4.1 模块安装步骤
extract_images_from_docx是一个专门设计用于从.docx文件中提取图片的Python模块,它简化了图片提取过程。首先 ,你需要通过pip安装这个模块:
pip install extract_images_from_docx4.2 快速提取图片示例
一旦安装完成,使用extract_images_from_docx模块来提取Word文档中的图片变得非常直接。以下是一个简单的代码示例 ,展示了如何快速实现图片提取功能:
from extract_images_from_docx import extract_images
# 指定Word文档路径
doc_path = 'example.docx'
# 指定图片提取后的保存目录
output_folder = 'extracted_images_module'
# 使用函数提取图片
images_extracted = extract_images(doc_path, output_folder)
print(f'成功提取了{len(images_extracted)}张图片到"{output_folder}"目录下。')
这段代码首先导入了extract_images函数,然后指定了待处理的Word文档路径以及图片提取后的存放目录。调用该函数后,文档中的所有图片会被自动提取并保存到指定目录 ,同时打印出成功提取的图片数量。
通过extract_images_from_docx模块 ,即便是复杂的Word文档结构也不再成为图片提取的障碍,它以简洁的接口封装了底层细节,让开发者能够高效地完成任务。
5、使用PyMuPDF(fitz)高级操作
5.1 fitz库简介与安装
PyMuPDF(也称为fitz)是一个功能强大的PDF与文档处理库,它支持包括Word在内的多种文档格式。PyMuPDF以其高效的性能和丰富的功能集而著称,能够轻松解析文档并提取其中的图片。要开始使用 ,首先确保通过pip安装PyMuPDF:
pip install pymupdf5.2 解析Word提取图像
使用PyMuPDF从Word文档中提取图片相当直接。以下代码示例展示了如何实现这一功能:
import os
import fitz # PyMuPDF
def extract_images_with_fitz(doc_path, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 打开文档
doc = fitz.open(doc_path)
for page_num in range(len(doc)):
page = doc.load_page(page_num)
# 获取页面上的所有图片
images = page.get_images(full=True)
for img_index, img_info in enumerate(images):
# 提取图片数据
base_image = doc.extract_image(img_info[0])
image_bytes = base_image["image"]
# 保存图片
image_path = os.path.join(output_folder, f'image_{page_num}_{img_index}.png')
with open(image_path, 'wb') as img_file:
img_file.write(image_bytes)
doc.close()
# 指定Word文档路径和输出目录
doc_path = 'example.docx'
output_folder = 'extracted_images_fitz'
extract_images_with_fitz(doc_path, output_folder)
这段代码首先打开了指定的Word文档,并对每一页进行遍历。通过get_images(full=True)方法获取页面上的所有图片信息,随后利用extract_image()方法提取图片数据,并将其保存为PNG格式到指定的输出目录。这种方法的优势在于它能够处理嵌入在文档中的各种图像,并且执行效率高,非常适合处理大型文档。
6、使用Aspose.Words for Python
6.1 引入第三方强援
Aspose.Words for Python 是一款功能强大的库,专为处理Word文档而设计,支持无需Microsoft Word安装即可创建、修改及转换Word文档。它在图片提取方面提供了高度精准的控制 ,特别适合于需要高级特性和企业级解决方案的场景。安装Aspose.Words可通过pip命令完成:
pip install aspose-words6.2 精准图片提取流程
使用Aspose.Words提取Word文档中的图片 ,步骤直接且高效。下面的代码展示了如何实现这一功能:
from aspose.words import Document
import os
def extract_images_aspose(doc_path, output_folder):
doc = Document(doc_path)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for i, img in enumerate(doc.get_child_nodes(NodeType.PICTURE, True)):
image_stream = img.image_data
filename = os.path.join(output_folder, f'image_{i+1}.png')
with open(filename, 'wb') as file:
file.write(image_stream)
doc_path = 'sample.docx'
output_folder = 'aspose_extracted_images'
extract_images_aspose(doc_path, output_folder)
这段代码首先加载Word文档,然后遍历文档中所有的图片节点(通过NodeType.PICTURE定位),并将图片数据写入到指定的输出文件夹中,每个图片文件按序号命名。
6.3 性能与兼容性考量
Aspose.Words的优势在于其广泛的支持性和高度的兼容性 ,能够处理各种版本的Word文档格式,包括DOC、DOCX等 ,且不受操作系统限制,无论是Windows、Linux还是Mac OS都能稳定运行。性能方面 ,它针对批量处理进行了优化,适合大规模文档处理任务 ,但需要注意的是 ,由于其丰富的功能和高质量的输出,资源消耗相比一些轻量级库可能会更高。
选择Aspose.Words作为图片提取解决方案时 ,考虑到它无需依赖Microsoft Office环境 ,提供了全面的文档处理API ,以及对复杂文档结构的优秀处理能力,对于追求高性能和高兼容性的项目而言 ,是值得信赖的选择。
7、总结
在自动化办公领域,Python以其强大的库支持和灵活性,成为处理文档的利器。本文介绍了六种使用Python提取Word文档中图片的方法,包括利用内置的zipfile模块、Python-docx库、COM接口、extract_images_from_docx模块、PyMuPDF(fitz)以及Aspose.Words for Python。每种方法都针对不同的使用场景和需求,从简单的文件结构读取到专业的跨平台处理,为开发者提供了丰富的选择。无论是基础的图片提取,还是需要深入文档结构的复杂操作,Python都能提供高效的解决方案。本文还对各种方法进行了比较,帮助读者根据自身需求选择最合适的工具,让文档中的图片提取变得简单而高效。
领取专属 10元无门槛券
私享最新 技术干货