之前我在《将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文檔:
運作上述代碼後:
能夠順利替換表格,若需要更換圖檔的背景色,可以向
process_clipboard_pic()
傳入指定的顔色值,例如豆沙色背景:
process_clipboard_pic(backgroud_color=(204, 232, 207))
當一張表格長到跨越多頁時還存在一些問題,程式隻能截圖到第一頁的内容,這就要求必須人工事先将長表格進行拆分。
我使用WPS的按行拆分功能:
手工拆分表格後再次運作上述代碼,已經成功截圖完整的表格圖檔:
注意:如果不需要另存為Word文檔,可以直接儲存,最後一行代碼修改為如下形式即可:
doc.Save()