Python2 将excel转换为PDF,并给PDF添加水印

文章描述了一个使用Python编写的脚本,实现将Excel文件批量转换为PDF,并在转换后的PDF上添加水印的功能。脚本中详细展示了如何操作Excel对象,设置打印方向以及使用PyPDF2库进行PDF合并和水印添加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,先贴代码

代码1:Excel转PDF

# -*- coding:utf-8 -*-
import os

from win32com.client import DispatchEx
from ig.documents.ig_pdf_watermark import Add_watermark  # 另外写的添加水印的代码位置


class PDFConverter(object):
    def __init__(self, pathname, export='.'):
        self._handle_postfix = ['xls', 'xlsx']
        self._filename_list = list()
        self._export_folder = os.path.join("C:\\cdb", 'pdfconver')
        if not os.path.exists(self._export_folder):
            os.mkdir(self._export_folder)
        self._enumerate_filename(pathname)

    def _enumerate_filename(self, pathname):
        '''读取所有文件名'''
        full_pathname = os.path.abspath(pathname)
        if os.path.isfile(full_pathname):
            if self._is_legal_postfix(full_pathname):
                self._filename_list.append(full_pathname)
            else:
                raise TypeError('文件 {} 后缀名不合法!仅支持如下文件类型:{}。'.format(pathname, '、'.join(self._handle_postfix)))
        elif os.path.isdir(full_pathname):
            for relpath, _, files in os.walk(full_pathname):
                for name in files:
                    filename = os.path.join(full_pathname, relpath, name)
                    if self._is_legal_postfix(filename):
                        self._filename_list.append(os.path.join(filename))
        else:
            raise TypeError('文件/文件夹 {} 不存在或不合法!'.format(pathname))

    def _is_legal_postfix(self, filename):
        return filename.split('.')[-1].lower() in self._handle_postfix and not os.path.basename(filename).startswith(
            '~')

    def run_conver(self):
        '''进行批量处理,根据后缀名调用函数执行转换'''
        print('需要转换的文件数:', len(self._filename_list))
        for filename in self._filename_list:
            postfix = filename.split('.')[-1].lower()
            funcCall = getattr(self, postfix)
            print('原文件:', filename)
            funcCall(filename)
        print('转换完成!')

    def xls(self, filename):
        '''xls 和 xlsx 文件转换'''
        name = os.path.basename(filename).split('.')[0] + '.pdf'
        exportfile = os.path.join(self._export_folder, name)
        if os.path.exists(exportfile):  # 如果存在转换后的PDF,删除重新生成
            os.remove(exportfile)
        xlApp = DispatchEx("Excel.Application")
        xlApp.Visible = False
        xlApp.DisplayAlerts = 0
        books = xlApp.Workbooks.Open(filename, False)
        sheet = books.Worksheets(1)  # 获取excel的sheet页
        sheet.PageSetup.Orientation = 2  # 设置excel转换方向为横向
        books.ExportAsFixedFormat(0, exportfile)
        books.Close(False)
        xlApp.Quit()  # 切记,一定要写在添加水印的后面面,不然会报错,太恐怖了
        # 给转换后的PDF添加水印
        pdf_path = Add_watermark().add_pdf_watermark(exportfile)  # 给PDF添加水印
        self.pdf_path = pdf_path

    def xlsx(self, filename):
        self.xls(filename)


if __name__ == "__main__":
    # 支持文件夹批量导入
    # folder = 'test'
    # pathname = os.path.join("C:\\", folder)

    # 也支持单个文件的转换
    pathname = r'C:\cdb\intron_prd\ig.plm\ig\templates'+u'\ACL替代物料通知书模板.xlsx'
    pdfConverter = PDFConverter(pathname)
    pdfConverter.run_conver()

代码2:给PDF添加水印

# -*- coding:utf-8 -*-
# 添加水印
import os

from PyPDF2 import PdfFileReader, PdfFileWriter
from copy import copy

# from cdb import cdbtime
import datetime



class Add_watermark():
    def add_pdf_watermark(self, path1):
        sy = PdfFileReader(r"C:\cdb\intron_prd\ig.plm\ig\templates\watermark.pdf") 
        mark_page = sy.getPage(0)  # 水印所在的页数
        # 读取添加水印的文件
        file_reader = PdfFileReader(path1)
        file_writer = PdfFileWriter()

        for page in range(file_reader.getNumPages()):
            # 读取需要添加水印每一页pdf
            source_page = file_reader.getPage(page)
            new_page = copy(mark_page)  #
            new_page.mergePage(source_page)  # new_page(水印)在下面,source_page原文在上面
            file_writer.addPage(new_page)
        # file_name = u"ACL替代物料通知书" + cdbtime.now('__%Y_%m_%d_%H_%M_%S') + '.pdf'
        file_name = u"ACL替代物料通知书" +  datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")
 + '.pdf'
        pdf_path = os.path.join("C:\\cdb\\pdfconver\\", file_name)
        if os.path.exists(pdf_path):  # 如果存在添加水印后的PDF,删除重新生成
            os.remove(pdf_path)
        with open(pdf_path, 'wb') as out:
            file_writer.write(out)
        return pdf_path

 3.特别的,需要注意这里

books.Close(False)
xlApp.Quit()

 因为我想着转完PDF再关闭,结果系统一直报错,报的我头都大了,报错如下:大家可千万别犯这个错误。

9月份我又遇到这个问题了,经过无数次的修改,还是有问题,最终发现了他真正的报错原因:excel没激活!!!!!!!!

4. 因为excel直接转PDF,当excel列比较多时会将PDF调整为好几页转换,所以需要将excel打印方向设置为横向打印,这样转出来的PDF列就在同一页面了。

sheet = books.Worksheets(1)  # 获取excel的sheet页
sheet.PageSetup.Orientation = 2  # 设置excel转换方向为横向

### 使用 Python 和 Tkinter 创建 GUI 工具以批量为 Word、Excel、PPT 或 PDF 文件添加水印 #### 项目概述 此工具旨在提供一种简便的方法,允许用户通过图形界面选择目标文件夹中的文档(Word、Excel、PPT 或 PDF),为其批量添加指定的水印。该工具基于 Python 的标准库 Tkinter 构建,结合其他第三方库完成特定的功能需求[^1]。 --- #### 主要依赖库 除了内置的 `tkinter` 外,还需要以下库支持不同的文件格式处理: - **PyPDF2**: 用于 PDF 文档的读取和修改。 - **python-docx**: 用于 Word (.docx) 文件的编辑。 - **openpyxl**: 用于 Excel (.xlsx) 文件的操作。 - **python-pptx**: 用于 PowerPoint (.pptx) 文件的处理。 可通过 pip 安装这些库: ```bash pip install pypdf2 python-docx openpyxl python-pptx ``` --- #### 功能模块划分 整个工具分为以下几个主要部分: 1. 用户界面设计; 2. 文件路径的选择与验证; 3. 不同文件类型的水印添加逻辑实现; 4. 日志记录功能。 --- ### 实现细节 #### 1. 界面设计 使用 Tkinter 设计一个简洁直观的界面,让用户可以选择源文件夹位置、设定水印文字内容以及触发批处理操作。 ##### 示例代码:基本窗口结构 ```python import tkinter as tk from tkinter import filedialog, messagebox, simpledialog # 初始化主窗口 root = tk.Tk() root.title("批量加水印工具") root.geometry("600x400") # 标签显示说明信息 label_info = tk.Label(root, text="请选择文件夹水印应用于其中的所有文档", font=("Arial", 12)) label_info.pack(pady=10) # 输入框用于展示选定目录 entry_path = tk.Entry(root, width=50) entry_path.pack(pady=10) # 按钮用于打开文件浏览器选取文件夹 def select_folder(): folder_selected = filedialog.askdirectory() entry_path.delete(0, tk.END) entry_path.insert(tk.END, folder_selected) button_select = tk.Button(root, text="选择文件夹", command=select_folder) button_select.pack(pady=10) # 获取水印文本 watermark_text = "" def get_watermark(): global watermark_text watermark_text = simpledialog.askstring("输入水印", "请输入水印内容:") if watermark_text: messagebox.showinfo("成功", f"水印设置为: {watermark_text}") button_set_watermark = tk.Button(root, text="设置水印", command=get_watermark) button_set_watermark.pack(pady=10) # 执行按钮 def process_files(): folder_path = entry_path.get() if not folder_path or not watermark_text: messagebox.showerror("错误", "请先选择文件夹设置水印!") return try: add_watermarks(folder_path, watermark_text) messagebox.showinfo("完成", "所有文件均已成功添加水印.") except Exception as e: messagebox.showerror("异常", str(e)) button_process = tk.Button(root, text="开始处理", command=process_files) button_process.pack(pady=20) # 运行主循环 root.mainloop() ``` --- #### 2. 文件路径选择与验证 通过 `filedialog.askdirectory()` 函数可以让用户方便地浏览计算机上的任意文件夹作为待处理的目标区域;同时需确保所选路径有效且包含至少一个兼容格式的支持文件[^2]。 --- #### 3. 添加水印的具体方法 根据不同类型的办公软件文档分别编写各自的水印植入算法: ##### A. 对于 PDF 文件 借助 PyPDF2 来加载原始页面,在每一页之上叠加透明层放置定制化的字符串形式标记[^1]。 ###### 示例代码片段 ```python from PyPDF2 import PdfReader, PdfWriter from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas def create_watermarked_pdf(input_file, output_file, watermark_content): reader = PdfReader(input_file) writer = PdfWriter() c = canvas.Canvas("temp_wm.pdf", pagesize=letter) c.setFontSize(50) c.rotate(-45) c.drawString(150, 300, watermark_content) c.save() wm_reader = PdfReader("temp_wm.pdf") water_mark_page = wm_reader.pages[0] for page_num in range(len(reader.pages)): current_page = reader.pages[page_num] current_page.merge_page(water_mark_page) writer.add_page(current_page) with open(output_file, 'wb') as out_f: writer.write(out_f) ``` ##### B. 针对 Microsoft Office 类型 (Word/Excel/PPT) 利用对应的专业扩展包逐帧访问内部数据单元格或幻灯片对象逐一附加备注性质的文字描述[^1]。 ###### 示例代码片段 - Word 版本 ```python from docx import Document def apply_word_watermark(doc_filepath, new_doc_filepath, mark_txt): document = Document(doc_filepath) sections = document.sections for section in sections: header = section.header paragraph = header.paragraphs[0] if header.paragraphs else header.add_paragraph() paragraph.text += "\n\n" + mark_txt document.save(new_doc_filepath) ``` --- #### 4. 记录日志 每次成功的转换动作都应追加一条时间戳附带详情的日志条目存盘以便后续审查用途[^1]。 --- ### 结论 综上所述,本文介绍了一款基于 Python 编写的多功能自动化办公辅助脚本的设计思路及其关键技术要点解析过程。最终成品不仅具备良好的用户体验效果而且还能满足实际业务场景下的多样化需求[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值