目录文本的具体格式
第1章 绪论$1
1.1模块与接口$1
1.2 工具和软件$3
1.3树语言的数据结构$3
程序设计:直线式程序解释器$7
推荐阅读$8
习题$9
第2章 词法分析$10
2.1词法单词$10
2.2正则表达式$11
2.3有限自动机$13
2.4非确定有限自动机$15
2.4.1将正则表达式转换为NFA$16
2.4.2将NFA转换为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)