这段代码主要做了以下几件事:
定义一个generate_bookmarks函数,该函数从一个文本文件中读取书签信息,并将这些信息存储在一个列表中。每个书签是一个元组,包含三个元素:级别、标题和页码。
在generate_bookmarks函数中,首先打开书签文件并读取所有行。对于每一行,如果它不是空行,就提取出标题和页码。标题是通过分割行并去除前后的'.'字符得到的。页码是通过分割行并去除前后的'. ()'字符得到的。
对于每个标题,使用正则表达式检查它是否只包含中文字符。如果是,就将书签的级别设置为2。否则,书签的级别由'.'的数量决定。
使用unicodedata.normalize('NFKC', title)将标题中的全角字符转换为半角字符。
定义了一个add_bookmarks_to_pdf函数,该函数将书签添加到PDF文件中。首先,创建一个PdfWriter对象,并从输入的PDF文件中读取所有页面。然后,对于每个书签,根据其级别将其添加到PDF文件的大纲中。最后,将带有书签的PDF文件写入到输出路径。
最后,调用generate_bookmarks函数生成书签,然后调用add_bookmarks_to_pdf函数将书签添加到PDF文件中。
from PyPDF2 import PdfReader, PdfWriter
import re
import unicodedata
def generate_bookmarks(bookmark_file_path):
bookmarks = []
with open(bookmark_file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
if line.strip() == '':
continue
title = line.split('!')[0].strip('.').strip()
title = unicodedata.normalize('NFKC', title) #将全角字符改成半角字符
page_num_str = line.strip('. ()').split('(')[-1].strip(')\n')
page_num = int(page_num_str) if page_num_str.isdigit() else 0
if re.match("^[\u4e00-\u9fa5]*$", title):#全中文正则表达式
level = 2
else:
level = line.count('.') + 1
bookmark = (level,title,page_num)
bookmarks.append(bookmark)
return bookmarks
bookmarks = generate_bookmarks('c:\\Users\\user1\\Desktop\\bookmark.txt')
def add_bookmarks_to_pdf(input_pdf_path, output_pdf_path, bookmarks):
pdf_writer = PdfWriter()
pdf_reader = PdfReader(input_pdf_path)
for page in range(len(pdf_reader.pages)):
pdf_writer.add_page(pdf_reader.pages[page])
parent_bookmark = None
for level,title, pagenum in bookmarks:
if level == 1:
parent_bookmark = pdf_writer.add_outline_item(title, pagenum+15)#15是偏移量-1
elif level == 2:
pdf_writer.add_outline_item(title, pagenum+15, parent=parent_bookmark)
with open(output_pdf_path, 'wb') as fh:
pdf_writer.write(fh)
add_bookmarks_to_pdf('D:\\Private\\课本\\材料科学基础_张联盟.pdf', 'D:\\Private\\课本\\材料科学基础_张联盟_with_bookmarks.pdf', bookmarks)
书签文本文件
文本直接从PDF粘贴,书签列表获取方式因人而异
效果
代码by cursor 调试by me