PDF添加水印完整python代码

# -*- coding: utf-8 -*-

from tkinter import *
from tkinter import messagebox
from reportlab.pdfgen import canvas
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from PyPDF2 import PdfReader, PdfWriter
import os

class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(self):
        '''以下是GUI页面设置'''
        self.label01 = Label(self, text="文件路径:").grid(row=0, column=0)
        self.entry01 = Entry(self)
        self.entry01.grid(row=0, column=1)

        self.label02 = Label(self, text="文件名称:").grid(row=1, column=0)
        self.entry02 = Entry(self)
        self.entry02.grid(row=1, column=1)

        self.label03 = Label(self, text="水印文字内容:").grid(row=2, column=0)
        self.entry03 = Entry(self)
        self.entry03.grid(row=2, column=1)

        self.label04 = Label(self, text="水印文字大小:").grid(row=3, column=0)
        self.entry04 = Entry(self)
        self.entry04.grid(row=3, column=1)
        self.label05 = Label(self, text="(注:输入10-40之间)").grid(row=3, column=2)

        self.label06 = Label(self, text="水印文字角度:").grid(row=4, column=0)
        self.entry05 = Entry(self)
        self.entry05.grid(row=4, column=1)
        self.label07 = Label(self, text="(注:输入整数)").grid(row=4, column=2, sticky=W)

        Button(self, text="确认", command=self.create_add_watermark).grid(row=5, column=1, sticky=W)
        Button(self, text="取消", command=self.quit_tk).grid(row=5, column=1, sticky=E)

    def create_add_watermark(self):
        input_file = self.entry01.get() # 获取文件路径
        input_filename = self.entry02.get() + ".pdf" # 获取文件名称
        input_pdf = os.path.join(input_file, input_filename) # 进行拼接形成完成路径

        output_filename = self.entry02.get() + "-(水印版).pdf" # 获取输出文件名称
        output_pdf = os.path.join(input_file, output_filename) # 将添加的水印输出到同一文件夹

        watermark_name = self.entry03.get() # 获取水印文字
        # 让水印文字形成列表,用for循环生成对应水印文字的位置
        watermark_texts = [(watermark_name, (i * 100, j * 120)) for i in range(8) for j in range(10)]

        watermark_pdf = "temp_watermark.pdf" # 临时创建一个pdf文件,用于存储水印文件,后面有进行移除
        c = canvas.Canvas(watermark_pdf) # 创建pdf画板

        font_size = int(self.entry04.get()) # 获取字体大小
        pdfmetrics.registerFont(TTFont("SimHei", "SimHei.ttf")) # 注册字体,以适应中文字体
        c.setFont("SimHei", font_size) # 设置字体及大小
        c.setFillGray(0.8, 0.3) # 设置字体的透明度情况

        font_rotate = int(self.entry05.get())
        # 将以上文字及对应文字位置写入临时pdf文档,并保存
        for text, position in watermark_texts:
            c.saveState()
            c.translate(position[0], position[1])
            c.rotate(font_rotate)
            c.drawCentredString(0, 0, text)
            c.restoreState()
        c.save()

        with open(input_pdf, "rb") as input_file: # 打开读取要添加水印的文档
            input_pdf_reader = PdfReader(input_file)
            output_pdf_writer = PdfWriter()

            with open(watermark_pdf, "rb") as watermark_file: # 打开临时水印文档
                watermark_pdf_reader = PdfReader(watermark_file)
                watermark_page = watermark_pdf_reader.pages[0] # 获取页数

                for i in range(len(input_pdf_reader.pages)): # 按页数一页一页写入
                    page = input_pdf_reader.pages[i]
                    page.merge_page(watermark_page)
                    output_pdf_writer.add_page(page)

            with open(output_pdf, "wb") as output_file:
                output_pdf_writer.write(output_file) # 保存水印文档

        os.remove(watermark_pdf) # 移除临时水印文档
        messagebox.showinfo("完成", f"水印已添加,文件保存为:{output_pdf}")

    def quit_tk(self):
        self.master.destroy() # GUI进行销毁退出

if __name__ == "__main__":
    root = Tk()
    root.geometry("500x300+200+200")
    root.title("PDF文档添加水印—V1.0 小新制作")
    app = Application(master=root)
    root.mainloop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值