pywin32库 -- 读取word文档中的图形

文章目录

前置操作

基于pywin32打开、关闭word应用程序;

python 复制代码
import pythoncom
from win32com.client import Dispatch, GetActiveObject


def get_word_instance():
    """ 获取word进程 实例"""
    pythoncom.CoInitialize()
    try:
        # 获取运行的Word实例
        word_app = GetActiveObject("Word.Application")
    except pythoncom.com_error:
        # 打开word程序
        word_app = Dispatch("Word.Application")
        word_app.Visible = False  # 不显示 Word 界面
        word_app.DisplayAlerts = False
    finally:
        return word_app


def close_word_instance():
    try:
        word = GetActiveObject("Word.Application")
        if word:
            word.Quit()
    except pythoncom.com_error:
        # 杀掉word进程
        pass

解析body中的图形

python 复制代码
graphics = {}
import os
from PIL import ImageGrab, Image


def get_graphic_with_pywin32(doc_path):
    """ 基于pywin32 解析文档主体中的图形 """
    global graphics
    word = get_word_instance()
    doc = word.Documents.Open(doc_path)
    for shape in doc.Shapes:  # 文档主体中的图形
        print("shape:", shape.Name, shape.Type)  # Type为1是图形,Name唯一
		page_id = shape.Anchor.Information(1)
        # shape.Anchor.CopyAsPicture()   个人版不支持
        # image = ImageGrab.grabclipboard()

        # 方案1  图形转图片
        inline_shape = shape.ConvertToInlineShape()
        bdata = inline_shape.Range.EnhMetaFileBits.tobytes()
        from io import BytesIO
        img = Image.open(BytesIO(bdata))
        img.save(shape.Name + ".png")

        # 方案2,若以上方案获取的图片 纵横比失真,则采用该方案
        # inline_shape = shape.ConvertToInlineShape()
        # inline_shape.Range.CopyAsPicture()
        # image = ImageGrab.grabclipboard()

        # 方案3, 图形直接保存   (个人版 报错AttributeError: <unknown>.SaveAsPicture)
        # pic_path = os.path.abspath("./{}_3.png".format(shape.Name))
        # shape.SaveAsPicture(pic_path)  # 绝对路径

解析页眉中的图形

python 复制代码
def get_graphic_with_pywin32(doc_path):
    """ 基于pywin32 解析文档主体中的图形 """
    global graphics
    word = get_word_instance()
    doc = word.Documents.Open(doc_path)
    for section in doc.Sections:
        for header in section.Footers:
            for shape in header.Shapes:
                inline_shape = shape.ConvertToInlineShape()
                bdata = inline_shape.Range.EnhMetaFileBits.tobytes()  # 直接保存无法查看
                img = PillowImage.open(BytesIO(bdata))
                img.save("./{}.png".format(shape.Name))
                with open("./{}.png".format(shape.Name), "rb") as f:
                    bdata = f.read()  # 读取的字节 与 image.tobytes() 不一样
                graphics[shape.Name] = bdata  # Name唯一
相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
Am-Chestnuts1 天前
DeepSeek表格复制到Word变竖线错列?用DS随心转对比几种整理方法
人工智能·word·ds随心转
2501_930707784 天前
使用C#代码为新创建的 Word 文档创建目录
c#·word
SunnyDays10114 天前
Java 拆分 Word 文档教程:按页、分页符和分节符拆分
java·word·分页·拆分
copilot中国版5 天前
Word Copilot|一键提取文档关键信息,告别逐字阅读
word·copilot
天人合一peng7 天前
西北工业大学校外访问系统
word
古少侠7 天前
deepseek转word工具怎么选?DS随心转与4种方案对比实测
人工智能·word·powerpoint
小羊没烦恼!8 天前
Memory 记忆设计讨论:Agent Memory 的安全边界:权限、删除、版本与回执
java·大数据·word·powerpoint·.net
拆房老料8 天前
BaseMetas FileView 1.3.0 发布:大文件更稳,PDF 预览更完整
pdf·word·开源软件·ppt
weixin_416660078 天前
DeepSeek、豆包生成的表格怎么导出Excel,避免内容挤在一列?
word·豆包·deepseek