Python获取docx所有图片保存
1. 简介
在日常开发中,我们经常会遇到需要从docx文档中提取图片并保存的需求。本文将教会你如何使用Python获取docx文档中的所有图片,并保存到本地。
2. 整体流程
整个过程可以分为以下几个步骤:
步骤 | 描述 |
---|---|
步骤一 | 打开docx文档 |
步骤二 | 获取文档中的所有图片 |
步骤三 | 保存图片到本地 |
下面我们将详细介绍每一个步骤需要做什么,并提供相应的代码示例。
3. 步骤一:打开docx文档
首先,我们需要使用第三方库python-docx来处理docx文档。可以通过在命令行中运行以下命令来安装该库:
pip install python-docx
安装完毕后,我们可以使用如下代码来打开docx文档:
from docx import Document
def open_docx(file_path):
doc = Document(file_path)
return doc
在这段代码中,我们导入了Document
类,并定义了一个open_docx
函数用于打开docx文档。传入docx文档的路径作为参数,函数将返回一个Document
对象。
4. 步骤二:获取文档中的所有图片
在打开了docx文档之后,我们需要获取文档中的所有图片。Python-docx库提供了InlineShapes
和Shapes
两个属性来获取文档中的图片。
def get_images_from_docx(doc):
images = []
# 获取InlineShapes中的图片
inline_shapes = doc.inline_shapes
for inline_shape in inline_shapes:
if inline_shape.has_picture:
images.append(inline_shape)
# 获取Shapes中的图片
shapes = doc.shapes
for shape in shapes:
if shape.has_picture:
images.append(shape)
return images
在这段代码中,我们创建了一个空列表images
用于存储获取到的图片。我们首先遍历InlineShapes
中的图片,如果图片存在则将其添加到images
列表中。然后遍历Shapes
中的图片,同样将其添加到images
列表中。
5. 步骤三:保存图片到本地
获取到所有的图片后,我们需要将这些图片保存到本地。每个图片都有一个image
属性,它包含了图片的二进制数据。我们可以使用PIL
库来读取和保存图片。
首先,我们需要安装PIL库:
pip install pillow
安装完毕后,我们可以使用如下代码来保存图片:
from PIL import Image
def save_images(images, output_dir):
for img in images:
image = img.image
image_data = image.blob
# 使用PIL库读取图片
pil_image = Image.open(image_data)
# 保存图片
image_name = img.title + '.png'
image_path = os.path.join(output_dir, image_name)
pil_image.save(image_path, 'PNG')
在这段代码中,我们遍历了所有的图片,首先从图片对象中获取到图片的二进制数据image_data
。然后使用PIL库的Image.open
函数读取图片,接着使用Image.save
函数将图片保存到本地。
6. 完整代码示例
from docx import Document
from PIL import Image
import os
def open_docx(file_path):
doc = Document(file_path)
return doc
def get_images_from_docx(doc):
images = []
# 获取InlineShapes中的图片
inline_shapes = doc.inline_shapes
for inline_shape in inline_shapes:
if inline_shape.has_picture:
images.append(inline_shape)
# 获取Shapes中的图片
shapes = doc.shapes
for shape in shapes:
if shape.has_picture:
images.append(shape)
return images
def save_images(images, output_dir):
for img in images:
image = img.image
image_data = image.blob
# 使用PIL库读取图片
pil_image = Image.open(image_data)
# 保存图片
image_name = img.title + '.png'
image_path = os.path.join(output_dir, image_name)
pil_image.save(image_path, '