python自动为PDF文件导入书签

python自动为PDF文件导入书签

目录文本的具体格式

1章 绪论$1
    1.1模块与接口$1
    1.2 工具和软件$3
    1.3树语言的数据结构$3
    程序设计:直线式程序解释器$7
    推荐阅读$8
    习题$92章 词法分析$10
    2.1词法单词$10
    2.2正则表达式$11
    2.3有限自动机$13
    2.4非确定有限自动机$15
        2.4.1将正则表达式转换为NFA$16
        2.4.2NFA转换为DFA$18
    2.5 Lex:词法分析器的生成器$20
    程序设计:词法分析$22
    推荐阅读$23
    习题$23

每四个空格符为一个缩进,代表该书签为第几级目录.书签后边使用$符号分隔书签名与书签指向的页数,按照该格式处理好的书签文本可配合以下代码完成为PDF文件自动添加书签的操作

代码分析

import re
from PyPDF2 import PdfFileReader as pdf_read, PdfFileWriter as pdf_write

pdf_write = pdf_write()
with open('测试用.pdf', 'rb') as f:
    pdf = pdf_read('测试用.pdf')
    pages = pdf.getNumPages()
    #将测试用.pdf里面的内容拷贝到pdf_write这个pdf对象中
    for i in range(pages):
        page_1 = pdf.getPage(i)
        pdf_write.addPage(page_1)

directory_list = []
#读取txt文本中的目录信息(每行作为一个字符串存放到directory_list中)
with open("目录.txt", 'r', encoding='utf-8') as f:
    directory_list = f.readlines()


#最多支持40级目录层数
bookmark_list = [None]*40
#为PDF对象添加书签
for i,line in enumerate(directory_list):
    if re.search(r'\S', line):
        #提取书签名称(去掉前面的制表符,去掉$包括后边的页数)
        mark = re.search(r'\S.*(?=\$)', line).group()
        #提取出书签指向的页数(使用$分隔目录和页数, 你也可以使用其它符号,此时代码应作相应修改)
        page_num_str = re.search(r'(?<=\$)\d*', line).group()
        page_num_str = page_num_str.rstrip()
        print(int(page_num_str))
        if(int(page_num_str)):
            #此处为书签指向的页数增加偏移量(具体的数字取决与pdf文件)
            page_num = int(page_num_str) + 12
        else:
            page_num = 0
        #计算该目录的级数(四个空格符表示一级)
        num = line.count('    ')
        print(num)
        #将不同级数的目录名存放在列表中, 添加书签
        if num == 0:
            bookmark_list[num] =  pdf_write.addBookmark(mark, page_num)
        else:
            bookmark_list[num] =  pdf_write.addBookmark(mark, page_num, bookmark_list[num-1])

#将添加好书签的pdf对象写入到new.pdf文件中
with open('new.pdf', 'wb') as f:
    pdf_write.write(f)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值