Word 图片提取转 PPT(林博士专用版)
读取 .docx 文档全部内容、识别并提取其中所有图片,按文档流顺序逐张插入新建的空白 PPT,每页一张图,保持原始清晰度与比例;若传入多个文档,每个文档单独输出一个同名的 .pptx(如 xxx_原文.docx → xxx_原文.pptx)。
核心原则:顺序正确(文档流顺序)、清晰度无损(原始字节嵌入)、每页一图、等比适配居中。
使用时机
- 用户要求「读取 Word 文档的全部内容并识别其中所有图片」并提取
- 用户要求把 Word 里的图片做成 PPT,每页一张图(如教程截图、讲义图片合集)
- 用户要求保留原图清晰度与比例,多文档各自独立输出
- 支持单个 docx 或整个文件夹批量处理(每个文档单独输出一个同名 pptx)
环境准备
优先使用已装好 python-pptx 与 Pillow 的 venv,依次尝试:
C:/Users/1/.workbuddy/binaries/python/envs/default/Scripts/python.exeC:/Users/1/.workbuddy/binaries/python/envs/office/Scripts/python.exe
若都不存在或缺少依赖,用托管 Python 建环境(约 1 分钟):
"C:/Users/1/.workbuddy/binaries/python/versions/3.13.12/python.exe" -m venv "C:/Users/1/.workbuddy/binaries/python/envs/default"
"C:/Users/1/.workbuddy/binaries/python/envs/default/Scripts/python.exe" -m pip install --quiet python-pptx Pillow
注意:pip 输出中 ~ 开头的 "Ignoring invalid distribution" 警告无害,可忽略。
执行
使用本技能自带脚本 scripts/docx_images_to_ppt.py(本目录下):
# 整个文件夹批量处理(输出到 <文件夹>/PPT输出/)
<venv_python> scripts/docx_images_to_ppt.py "C:/path/to/文件夹"
# 单个文档
<venv_python> scripts/docx_images_to_ppt.py "C:/path/to/文档.docx"
# 指定输出目录 / 递归子文件夹
<venv_python> scripts/docx_images_to_ppt.py "源" -o "输出目录" --recursive
脚本内置:提取 → 生成 → 自动重新打开校验(页数必须等于图片数)。处理量约 100 张图/秒,大批量(2000+ 图)建议后台运行。
关键技术要点(勿走弯路)
- 图片顺序:必须解析
word/document.xml中r:embed的 rId 出现顺序,再经document.xml.rels映射到word/media/文件——不能按 media 文件名排序,也不要用 python-docx 的inline_shapes(会遗漏浮动/锚定 anchor 图片)。脚本已正确实现。 - 识别全部图片:脚本会读取文档文本流中所有
r:embed引用,无论图片是内联(inline)还是浮动(anchor)都一并提取,不遗漏。 - 无损清晰度:图片原始字节经
io.BytesIO直接交给add_picture,禁止用 PIL 重存或压缩;缩放只影响显示框尺寸(EMU),不影响嵌入数据。 - 页面适配:16:9(13.333×7.5 in),按图片 96dpi 自然尺寸计算,
min(可用宽/自然宽, 可用高/自然高)等比 contain 缩放并居中,小图不放大超出自然尺寸以外的逻辑由比例 min 保证。 - 格式:脚本支持 python-pptx 认识的全部格式(png/jpeg/gif/bmp/tiff);若遇到 wmf/emf 会报错,需先转换格式。
- 文件名:输出 pptx 与源 docx 同名(仅扩展名不同),
_原文/_导读等后缀自然保留;多文档各自独立输出,互不合并。
交付
- 完成后用文件列表 + 每文档图片数/页数汇总向用户报告
- 用 present_files 展示生成的 pptx(可批量传入多个路径)
- 大文件夹场景若不确定目标目录,先向用户确认是哪个文件夹再动手