天天看點

批量替換Word中的表格為圖檔并儲存

之前我在《将Word中的表格以圖檔形式複制到微信發送》分享了如何将指定word中的表格以圖檔形式粘貼

今天群友提問如何将一個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文檔:

批量替換Word中的表格為圖檔并儲存

運作上述代碼後:

批量替換Word中的表格為圖檔并儲存

能夠順利替換表格,若需要更換圖檔的背景色,可以向​

​process_clipboard_pic()​

​傳入指定的顔色值,例如豆沙色背景:

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

當一張表格長到跨越多頁時還存在一些問題,程式隻能截圖到第一頁的内容,這就要求必須人工事先将長表格進行拆分。

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

批量替換Word中的表格為圖檔并儲存

手工拆分表格後再次運作上述代碼,已經成功截圖完整的表格圖檔:

批量替換Word中的表格為圖檔并儲存

注意:如果不需要另存為Word文檔,可以直接儲存,最後一行代碼修改為如下形式即可:

doc.Save()