Python给PDF文件添加书签

这段代码主要做了以下几件事:

  1. 定义一个generate_bookmarks函数,该函数从一个文本文件中读取书签信息,并将这些信息存储在一个列表中。每个书签是一个元组,包含三个元素:级别、标题和页码。

  2. 在generate_bookmarks函数中,首先打开书签文件并读取所有行。对于每一行,如果它不是空行,就提取出标题和页码。标题是通过分割行并去除前后的'.'字符得到的。页码是通过分割行并去除前后的'. ()'字符得到的。

  3. 对于每个标题,使用正则表达式检查它是否只包含中文字符。如果是,就将书签的级别设置为2。否则,书签的级别由'.'的数量决定。

  4. 使用unicodedata.normalize('NFKC', title)将标题中的全角字符转换为半角字符。

  5. 定义了一个add_bookmarks_to_pdf函数,该函数将书签添加到PDF文件中。首先,创建一个PdfWriter对象,并从输入的PDF文件中读取所有页面。然后,对于每个书签,根据其级别将其添加到PDF文件的大纲中。最后,将带有书签的PDF文件写入到输出路径。

  6. 最后,调用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)

书签文本文件

bookmark.txt

文本直接从PDF粘贴,书签列表获取方式因人而异

效果

书签效果

代码by cursor 调试by me

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容