Ricky
Ricky
Published on 2024-12-04 / 44 Visits
1
0

省钱,使用 Python 为 word 文档中的图片批量增加水印

原文首发于建职宝公众号

打工人的苦

最近在工作是碰到一个 word 文档处理的任务,需要将一份用于投标的 word 文档中的所有图片加上水印,要完成这个任务,暂时有两个思路:

  • 方法一:手动添加一个文本框,设置文本样式,再将文本框复制到每张图片上,最后调整每张图片上文本框的位置。
  • 方法二:使用第三方软件添加,但需要购买会员。

如果需要处理的图片较少的话,使用方法一也还是一个不错的选择,但是如果有几百、上千张图片需要处理的话,这么做就有点辛苦了。

如果不想太辛苦,那也许就只能选择方法二氪金充会员了,但是对于本来就不太宽裕的打工人来说,还真是有点雪上加霜。

那么,真的没有别的办法了吗?你别说,还真有,动动手,写上一段程序,就能做到一劳永逸了。

写一段程序

说干就干,打开 Visual Studio Code 撸上一段 Python 代码。

开发界面.jpg

代码开发界面

详细代码如下,有兴趣的读者请自取。友情提示:运行代码前先把自己的 word 文档备份一下

from docx import Document
from PIL import Image, ImageDraw, ImageFont
import io

def add_watermark_to_image(image_bytes, watermark_text):
    """
    为图片添加水印
    """
    try:
        image = Image.open(io.BytesIO(image_bytes))
        draw = ImageDraw.Draw(image)
        
        # 设置水印字体和大小
        font = ImageFont.truetype("C:/Windows/Fonts/STCAIYUN", size=50)
        
        # 获取水印文字的宽高
        text_bbox = draw.textbbox((0, 0), watermark_text, font=font)  # 新方法
        text_width = text_bbox[2] - text_bbox[0]
        text_height = text_bbox[3] - text_bbox[1]
        
        # 计算水印位置
        position = (image.width - text_width - 400, image.height - text_height - 400)
        
        # 添加水印
        draw.text(position, watermark_text, fill=(255, 255, 255, 128), font=font)
        
        # 保存为二进制
        output = io.BytesIO()
        image.save(output, format=image.format)
        return output.getvalue()
    except Exception as e:
        print(f"处理图片时出错:{e}")
        return None

def process_word_images(input_file, output_file, watermark_text):
    """
    批量处理 Word 文档中的图片,添加水印
    """
    try:
        doc = Document(input_file)
        for rel in doc.part.rels.values():
            if "image" in rel.target_ref:  # 检查是否是图片
                try:
                    image_bytes = rel.target_part.blob
                    print(f"正在处理图片:{rel.target_ref}")
                    
                    # 添加水印
                    watermarked_image_bytes = add_watermark_to_image(image_bytes, watermark_text)
                    if watermarked_image_bytes:
                        rel.target_part._blob = watermarked_image_bytes
                except AttributeError:
                    print(f"关系 {rel.target_ref} 无法解析为图片,跳过。")
                    continue
        doc.save(output_file)
        print(f"水印添加完成,保存到:{output_file}")
    except Exception as e:
        print(f"处理 Word 文档时出错:{e}")

# 示例使用
input_word = "input.docx"
output_word = "output.docx"
watermark = "仅供内部流转使用,禁止外传"
process_word_images(input_word, output_word, watermark)

我们来看一看代码的实现效果

加水印前.jpg

加水印前的图片

加水印后.jpg

加水印后的图片

实现效果是不是还不错? 如果觉得文字的内容、大小、字体、位置不合适,也可以在代码中手动更改。这样不管是有多少 word 文档需要处理,每个 word 文档里有多少张图片,都可以在瞬间批量完成任务。

把充会员的钱省下来,点杯奶茶,把手动操作文件的时间省下来,休息一会,好不惬意。

编程能力真的很重要

也许有人会质疑编程能力的重要性,我们来举个可以类比的例子。

现在编程就相当于驾驶自动档的汽车,以 Python 为例,已经有大量的开源库可以使用,实现需求所需要的代码量已经大大降低,再加上 AI 的加持,可以先让 AI 给生成一个基础的框架,再手动调改就可以实现所需要的功能,普通人也完全可以掌握。

专业程序员就像开大巴车和赛车的驾驶员,他们的工作属于更高层次,与普通人开发简单功能并不矛盾。

掌握一定编程能力后,对工作也是好处多多。

  • 好处一:工作省时省力。尤其是重复性的工作,例如每天都要重复做的,大量文件需要重复处理的,使用程序代替人工就特别合适。
  • 好处二:提高工作质量。使用程序自动化处理,可以避免人工处理中容易出现的疏漏和错误。
  • 好处三:避免版权纠纷。Python 开源库中的代码和功能都是可以免费使用的,这样就不需要购买甚至下载破解软件(不提倡任何形式的破解和盗版)了。

声明:

本公众号中的内容和意见仅供参考。本公众号所载信息均为作者本人观点,不代表适用于您所处的具体情境。

本公众号对所有原创内容均保留一切权利,未经许可,任何机构和个人不得以任何形式翻版、复制、发表或引用本公众号所载的任何原创内容。如征得本公众号同意进行引用、刊发的,需在允许的范围内使用,并注明出处为《建职宝》,且不得对相关内容进行任何有悖原意的引用、删节和修改。


Comment