批量替换Word中的表格为图片并保存

之前我在《将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文档:

image-20220731183531601

运行上述代码后:

image-20220731183641986

能够顺利替换表格,若需要更换图片的背景色,可以向process_clipboard_pic()传入指定的颜色值,例如豆沙色背景:

process_clipboard_pic(backgroud_color=(204, 232, 207))

当一张表格长到跨越多页时还存在一些问题,程序只能截图到第一页的内容,这就要求必须人工事先将长表格进行拆分。

我使用WPS的按行拆分功能:

image-20220731184342389

手工拆分表格后再次运行上述代码,已经成功截图完整的表格图片:

image-20220731184556503

注意:如果不需要另存为Word文档,可以直接保存,最后一行代码修改为如下形式即可:

doc.Save()

当然也可以删除最后一行关于保存的代码,人工查看修改结果,决定是保存还是另存为。

建议还是另存为保存原始文档备份,万一哪张表格过长忘记拆分了呢?

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小明-代码实体

喜欢,就关注;爱,就打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值