Word 2013中如何编程提取文档内链接/插入图片的文件名(不含扩展名)
解决方案:提取单个Word文档中链接的.emf图片文件名
我刚好处理过类似的需求,给你一个基于Python的轻量方案,能直接从单个Word文档里提取所有链接/插入的.emf图片文件名(不含扩展名),适配网络驱动器的存储场景,而且不需要批处理:
前置准备
首先需要安装python-docx库,它能直接解析docx的内部结构,处理图片相关的属性:
pip install python-docx
核心代码实现
下面的代码会遍历文档里的所有嵌入式和浮动式图片,筛选出.emf格式的,然后提取不含扩展名的文件名,还会自动去重:
from docx import Document import os def extract_emf_image_names(doc_path): # 打开目标Word文档 doc = Document(doc_path) emf_file_names = [] # 遍历文本流中的嵌入式图片 for inline_img in doc.inline_shapes: # 判断是否为图片类型 if inline_img.type == 3: # 获取图片路径:区分链接式和嵌入式 if inline_img.is_linked: img_full_path = inline_img.link_path else: # 嵌入式图片从docx内部关联信息提取文件名 blip_obj = inline_img._inline.graphic.graphicData.pic.blipFill.blip img_full_path = blip_obj.embed if hasattr(blip_obj, 'embed') else blip_obj.link # 筛选.emf格式的图片 if img_full_path.lower().endswith('.emf'): # 提取不含扩展名的文件名 file_name = os.path.splitext(os.path.basename(img_full_path))[0] emf_file_names.append(file_name) # 遍历浮动式图片(不在文本流中的图片) for floating_img in doc.shapes: if floating_img.shape_type == 13: if floating_img.is_linked: img_full_path = floating_img.link_path if img_full_path.lower().endswith('.emf'): file_name = os.path.splitext(os.path.basename(img_full_path))[0] emf_file_names.append(file_name) # 去重后返回结果 return list(set(emf_file_names)) # 示例调用:替换成你的网络驱动器文档路径 if __name__ == "__main__": target_doc = r"\\your-network-drive\docs\target-document.docx" extracted_names = extract_emf_image_names(target_doc) print("提取到的.emf图片文件名(不含扩展名):") for name in extracted_names: print(f"- {name}")
代码说明
- 覆盖所有图片类型:同时遍历
inline_shapes(文本内的嵌入式图片)和shapes(浮动式图片),避免漏掉任何位置的图片 - 兼容链接/嵌入图片:通过
is_linked属性区分链接式图片(直接获取网络路径)和嵌入式图片(从docx内部关联信息提取文件名) - 适配网络路径:Python支持直接使用SMB网络路径(比如
\\server\share\file.docx),不需要额外映射驱动器 - 自动去重:用
set过滤掉重复插入的同一张图片,保证结果唯一
如果你的已有导出工具已经将嵌入式图片导出到本地目录,也可以直接遍历该目录下的.emf文件提取文件名,不过上面的代码不需要依赖导出工具,直接从docx文件解析获取。
内容的提问来源于stack exchange,提问作者JKoh




