# -*- coding: utf-8 -*-
"""
Word 文档图片批量提取工具
使用方法：双击运行，或命令行执行 python 提取Word图片工具.py
"""

import zipfile
import os
import sys
import shutil
import tempfile

def extract_images_from_docx(docx_path, output_dir=None):
    """
    从 .docx 文件中提取所有图片
    
    参数:
        docx_path: Word 文件路径
        output_dir: 图片输出目录（默认在文件同级创建 "提取的图片" 文件夹）
    """
    if not os.path.isfile(docx_path):
        print(f"[错误] 文件不存在: {docx_path}")
        return []

    if not docx_path.lower().endswith('.docx'):
        print(f"[错误] 仅支持 .docx 格式文件")
        return []

    # 默认输出目录
    if output_dir is None:
        base_name = os.path.splitext(os.path.basename(docx_path))[0]
        output_dir = os.path.join(os.path.dirname(docx_path), f"{base_name}_提取的图片")

    os.makedirs(output_dir, exist_ok=True)

    extracted = []

    try:
        with zipfile.ZipFile(docx_path, 'r') as z:
            # Word 文档中的图片存放在 word/media/ 目录下
            media_files = [f for f in z.namelist() if f.startswith('word/media/')]

            if not media_files:
                print(f"[提示] 未在文档中找到图片")
                return []

            for i, media_file in enumerate(media_files, 1):
                # 获取原始文件名和扩展名
                filename = os.path.basename(media_file)
                name, ext = os.path.splitext(filename)

                # 生成输出文件名（按顺序编号）
                output_filename = f"图片_{i:03d}{ext}"
                output_path = os.path.join(output_dir, output_filename)

                # 提取文件
                with z.open(media_file) as src, open(output_path, 'wb') as dst:
                    dst.write(src.read())

                extracted.append(output_path)
                file_size = os.path.getsize(output_path)
                size_str = format_size(file_size)
                print(f"  [{i}/{len(media_files)}] {output_filename}  ({size_str})")

    except zipfile.BadZipFile:
        print(f"[错误] 文件损坏或不是有效的 .docx 文件")
        return []
    except Exception as e:
        print(f"[错误] 提取失败: {e}")
        return []

    return extracted


def format_size(size_bytes):
    """格式化文件大小"""
    if size_bytes < 1024:
        return f"{size_bytes} B"
    elif size_bytes < 1024 * 1024:
        return f"{size_bytes / 1024:.1f} KB"
    else:
        return f"{size_bytes / (1024 * 1024):.1f} MB"


def main():
    print("=" * 50)
    print("    Word 文档图片批量提取工具")
    print("=" * 50)
    print()

    # 支持拖拽文件到脚本上（命令行参数）
    if len(sys.argv) > 1:
        docx_path = sys.argv[1]
    else:
        docx_path = input("请输入 Word 文件路径（可拖拽文件到窗口）: ").strip()

    # 去掉可能的引号
    docx_path = docx_path.strip('"').strip("'")

    if not docx_path:
        print("[错误] 未输入文件路径")
        input("\n按回车键退出...")
        return

    print(f"\n文件: {docx_path}")
    print(f"\n正在提取图片...\n")

    extracted = extract_images_from_docx(docx_path)

    if extracted:
        output_dir = os.path.dirname(extracted[0])
        print(f"\n[完成] 共提取 {len(extracted)} 张图片")
        print(f"[保存位置] {output_dir}")

        # Windows 下自动打开文件夹
        try:
            os.startfile(output_dir)
        except Exception:
            pass
    else:
        print("\n[完成] 未提取到任何图片")

    input("\n按回车键退出...")


if __name__ == '__main__':
    main()
