python-docx识别word中的图片
时间: 2025-04-06 15:13:03 浏览: 51
### 如何使用 `python-docx` 提取 Word 文档中的图片
虽然 `python-docx` 主要用于操作文档的内容(如段落、表格等),但它并不直接支持提取嵌入的图片文件。然而,可以通过一些间接方法来实现这一目标。
#### 方法概述
为了从 Word 文档中提取图片,可以利用以下两种方式之一:
1. **解析 XML 结构**:通过访问底层的 `.docx` 文件结构并查找存储在 `word/media/` 路径下的图像文件。
2. **第三方工具辅助**:如果需要更简单的解决方案,可以选择其他专门处理 Office 文件的库(如 `zipfile` 或者 `mammoth`)作为补充手段。
以下是基于上述思路的具体代码示例以及解释说明。
---
#### 方案一:手动解析 `.docx` 文件内部结构
`.docx` 实际上是一个压缩包形式的文件集合,在其中有一个特定目录叫做 `/word/media/`,该位置存放着所有的嵌入式媒体资源(包括图片)。因此可以直接解压此档案并通过读取这些路径完成任务。
```python
import zipfile
from pathlib import Path
def extract_images_from_docx(docx_path, output_folder):
"""
从 .docx 文件中提取所有图片到指定输出文件夹
参数:
docx_path (str): 输入 DOCX 文件的位置.
output_folder (str): 输出图片的目标文件夹.
"""
with zipfile.ZipFile(docx_path, 'r') as zip_ref:
media_files = [f for f in zip_ref.namelist() if f.startswith('word/media/')]
# 创建输出文件夹
Path(output_folder).mkdir(parents=True, exist_ok=True)
for file_name in media_files:
image_data = zip_ref.read(file_name)
target_file = Path(output_folder) / Path(file_name).name
with open(target_file, "wb") as img_out:
img_out.write(image_data)
extract_images_from_docx("example.docx", "./output_images/")
```
这种方法绕过了 `python-docx` 对象模型层面的操作而深入到了实际的数据层面上去寻找所需的信息[^3]。
---
#### 方案二:结合 `python-docx` 和自定义逻辑定位具体图片
尽管无法单纯依赖 `python-docx` 来获取图片对象本身,但我们仍然能够借助它找到那些包含图片引用关系的部分——即段落或者表单单元格内的描述符标签 `<a:blip>` 等标记,并进一步追踪其对应的物理地址。
下面展示了一个简化版的例子用来示范如何扫描整个文档树形节点从而发现潜在候选区域:
```python
from docx import Document
from lxml import etree
def find_image_references(document):
""" 查找 word/document.xml 中的所有 blip 图片 ID 参考"""
nsmap = {
'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
'wp': 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'
}
xml_content = document._element.xml
root = etree.fromstring(xml_content.encode())
images = []
for elem in root.iter():
tag = etree.QName(elem.tag).localname
if tag == 'graphicData':
for child in list(elem):
if 'pic' in str(child.tag):
embed_id = None
for subchild in list(child):
attrib_keys = {k.split('}')[-1]: v for k,v in dict(subchild.attrib).items()}
if 'embed' in attrib_keys.keys():
embed_id = attrib_keys['embed']
if embed_id is not None:
images.append(embed_id)
return set(images)
# 加载文档实例化过程省略...
document = Document('example.docx')
image_ids = find_image_references(document)
print(f"Found Image Embed IDs: {list(image_ids)}")
```
这段脚本会返回一组唯一的字符串表示每一个被识别出来的图形组件关联的身份编号[^4]。
注意这里仅提供了理论框架指导;真实场景下可能还需要额外考虑更多细节因素比如命名空间冲突等问题解决办法等等。
---
### 注意事项
- 上述两套方案各有优劣权衡之处,请依据项目需求选取合适的技术路线实施开发工作。
- 如果只是简单的需求建议优先尝试第一种做法因为它更加直观易懂同时也具备较高的兼容性和稳定性表现良好。
阅读全文
相关推荐


















