之前我在《将Word中的表格以图片形式复制到微信发送》分享了如何将指定word中的表格以图片形式粘贴,参考:https://xxmdmst.blog.csdn.net/article/details/125999841
今天群友提问如何将一个Word中所有的表格替换为图片形式,下面请看我的完整代码:
import os
import win32com.client as win32
from io import BytesIO
import win32clipboard
from PIL import Image, ImageGrab, ImageChops
def crop_image(im, backgroud_color=(255, 255, 255)):
'''裁剪图片边缘空白并给透明通道填充白色背景,作者:小小明'''
bg = Image.new(mode='RGBA', size=im.size)
bbox = ImageChops.difference(im, bg).getbbox()
if bbox:
im = im.crop(bbox)
img = Image.new('RGB', im.size, backgroud_color)
img.paste(im, (0, 0, *im.size), im)
return img
def write_img2clipboard(img):
"""将指定图片写入到剪切板中,作者:小小明"""
win32clipboard.OpenClipboard()
try:
win32clipboard.EmptyClipboard()
out = BytesIO()
img.save(out, "BMP")
# BMP图片有14字节的header,需要额外去除
data = out.getvalue()[14:]
# DIB: 设备无关位图(device-independent bitmap)
win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
finally:
win32clipboard.CloseClipboard()
def process_clipboard_pic(backgroud_color=(255, 255, 255)):
"""将剪切板中的图片裁剪边缘空白并给透明部分添加背景色,作者:小小明"""
img = ImageGrab.grabclipboard()
img = crop_image(img, backgroud_color)
write_img2clipboard(img)
return img
# 获取正在运行的Word应用
wordApp = win32.GetActiveObject("Word.Application")
# 获取当前激活的word文档
doc = wordApp.ActiveDocument
# 遍历所有的表格对象
for t in doc.Tables:
t.Select()
wordApp.Selection.CopyAsPicture()
img = process_clipboard_pic()
# display(img)
t.Delete()
wordApp.Selection.Paste()
# 另存为word文件
doc.SaveAs2(os.path.abspath("替换图片.docx"))
只要我们打开需要批量替换的Word文件,然后执行上述代码,可以看到运行前后的效果。
打开的Word文档:
运行上述代码后:
能够顺利替换表格,若需要更换图片的背景色,可以向process_clipboard_pic()
传入指定的颜色值,例如豆沙色背景:
process_clipboard_pic(backgroud_color=(204, 232, 207))
当一张表格长到跨越多页时还存在一些问题,程序只能截图到第一页的内容,这就要求必须人工事先将长表格进行拆分。
我使用WPS的按行拆分功能:
手工拆分表格后再次运行上述代码,已经成功截图完整的表格图片:
注意:如果不需要另存为Word文档,可以直接保存,最后一行代码修改为如下形式即可:
doc.Save()
- 1
当然也可以删除最后一行关于保存的代码,人工查看修改结果,决定是保存还是另存为。
建议还是另存为保存原始文档备份,万一哪张表格过长忘记拆分了呢?