iReg小程序:PDF文件批量创建书签 v2.0

文摘   职场   2024-11-16 07:03   上海  

用Python开发的一个小程序分享给大家,小程序在Windows中运行,可以根据Excel文件(TOC.xlsx)中自定义的页码和书签标题自动为PDF文件创建书签,书签对应的页码可以是连续的:

也可以是不连续的:

生成书签的PDF如下,同时默认的初始视图会修改为“书签面板和页面”:


使用演示如下:

小程序、测试文件、使用说明都打包好了,欢迎大家下载试用:

https://pan.baidu.com/s/1naqJibEXNzlyvH3sNhnJdA?pwd=iReg

小程序使用Python编写,把源代码分享如下,和大家一起学习和交流:

import tkinter  # 导入tkinter库,用于创建图形用户界面import tkinter.filedialog  # 导入tkinter的文件对话框模块,用于选择文件import tkinter.messagebox  # 导入tkinter的消息框模块,用于显示消息import os  # 导入os库,用于处理文件和目录路径from PyPDF2 import PdfWriter, PdfReader  # 从PyPDF2库导入PdfWriter和PdfReader,用于处理PDF文件import openpyxl  # 导入openpyxl库,用于处理Excel文件
class Window(): def __init__(self): self.root = root = tkinter.Tk() # 初始化Tkinter主窗口
# 创建并布局第一个文件选择相关的控件 self.label1 = tkinter.Label(root, text='选择TOC.xlsx') # 创建一个标签,显示“选择TOC.xlsx” self.label1.grid(row=0, column=0) # 将标签放置在网格的第0行第0列 self.entryfile_name1 = tkinter.Entry(root) # 创建一个文本输入框,用于输入或显示文件路径 self.entryfile_name1.grid(row=0, column=1) # 将文本输入框放置在网格的第0行第1列 self.BrowserDirButton1 = tkinter.Button(root, text='浏览', command=self.select_file1) # 创建一个按钮,点击时调用select_file1方法 self.BrowserDirButton1.grid(row=0, column=2) # 将按钮放置在网格的第0行第2列
# 创建并布局第二个文件选择相关的控件 self.label2 = tkinter.Label(root, text='选择PDF文件') # 创建一个标签,显示“选择PDF文件” self.label2.grid(row=1, column=0) # 将标签放置在网格的第1行第0列 self.entryfile_name2 = tkinter.Entry(root) # 创建一个文本输入框,用于输入或显示文件路径 self.entryfile_name2.grid(row=1, column=1) # 将文本输入框放置在网格的第1行第1列 self.BrowserDirButton2 = tkinter.Button(root, text='浏览', command=self.select_file2) # 创建一个按钮,点击时调用select_file2方法 self.BrowserDirButton2.grid(row=1, column=2) # 将按钮放置在网格的第1行第2列
# 创建并布局“批量创建书签”按钮 self.ButtonCov = tkinter.Button(root, text='批量创建书签', command=self.create_bookmarks) # 创建一个按钮,点击时调用create_bookmarks方法 self.ButtonCov.grid(row=2, column=1) # 将按钮放置在网格的第2行第1列
def select_file1(self): # 打开文件选择对话框,选择Excel文件,并将选择的文件路径显示在对应的文本输入框中 file_name = tkinter.filedialog.askopenfilename() if file_name: self.entryfile_name1.delete(0, tkinter.END) # 清除文本输入框中的内容 self.entryfile_name1.insert(tkinter.END, file_name) # 在文本输入框中插入选择的文件路径
def select_file2(self): # 打开文件选择对话框,选择PDF文件,并将选择的文件路径显示在对应的文本输入框中 file_name = tkinter.filedialog.askopenfilename() if file_name: self.entryfile_name2.delete(0, tkinter.END) # 清除文本输入框中的内容 self.entryfile_name2.insert(tkinter.END, file_name) # 在文本输入框中插入选择的文件路径
def create_bookmarks(self): # 加载选择的Excel文件 wb = openpyxl.load_workbook(self.entryfile_name1.get()) sheet1 = wb['Sheet1'] # 获取Excel文件中的第一个工作表
# 读取Excel文件中的“页码”和“书签标题”列,存储到列表中 page_range = [] figure_title = [] for row in range(2, sheet1.max_row + 1): page_range.append(sheet1['A' + str(row)].value) # 读取“页码”列 figure_title.append(sheet1['B' + str(row)].value) # 读取“书签标题”列
# 打开选择的PDF文件 input_pdf = PdfReader(open(self.entryfile_name2.get(), "rb"))
# 创建一个PdfWriter对象,用于写入新的PDF文件 pdf_writer = PdfWriter() for i in range(len(input_pdf.pages)): page = input_pdf.pages[i] pdf_writer.add_page(page) # 将原PDF的每一页添加到PdfWriter对象中 try: # 如果当前页码在Excel文件的“页码”列中,则为该页添加书签 index = page_range.index(i + 1) pdf_writer.add_outline_item(figure_title[index], i) # 使用页面索引添加书签 except ValueError: continue # 如果页码不在列表中,则跳过
# 设置PDF的初始视图为书签面板和页面 pdf_writer.page_mode = '/UseOutlines'
# 将添加了书签的PDF保存到新文件中 with open(os.path.splitext(self.entryfile_name2.get())[0] + '_创建书签.pdf', "wb") as output_stream: pdf_writer.write(output_stream)
# 显示完成消息 tkinter.messagebox.showinfo("iReg", "已完成 ")
def mainloop(self): # 设置窗口的最小和最大尺寸,以及窗口标题,并进入Tkinter主循环 self.root.minsize(380, 120) self.root.maxsize(380, 120) self.root.title('iReg小程序-批量创建书签 v2.0') self.root.mainloop()
if __name__ == "__main__": # 创建Window对象,并启动Tkinter主循环 window = Window() window.mainloop()

iReg
iReg,爱注册——交流药品注册法规,分享药品注册经验
 最新文章