文章目录
前置操作
基于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唯一