使用 pypdf 给 PDF 添加目录书签

server/2024/10/22 17:23:49/
"""
dir.txt的形式
第1章 计算机系统基础知识 1
1.1 嵌入式计算机系统概述 1
1.2 数据表示 4
1.2.1 进位计数制及转换 4
1.2.2 数值型数据的表示 6
第2章 嵌入式系统硬件基础知识 56
2.1 数字电路基础 56
2.1.1 信号特征 56
2.1.2 组合逻辑电路和时序逻辑电路 56
2.2 嵌入式微处理器基础 63
2.2.1 嵌入式微处理器的结构和类型 65
2.2.2 嵌入式微处理器的异常与中断 71
"""import pypdf# TODO 需要提前设置的变量
original_pdf_name = '嵌入式系统设计师教程__第2版.pdf'  # pdf文件名
directory_file_name = "dir.txt"  # 目录所在文件名
first_chapter_origin_num = 1  # 第一章在目录上的页码
first_chapter_actual_num = 10  # 第一章的页码# TODO 以下内容无需更改
offset = first_chapter_actual_num - first_chapter_origin_num - 1  # 偏置writer = pypdf.PdfWriter()  # 创建一个PdfWriter类
input1 = open(original_pdf_name, "rb")  # 打开需要添加书签的PDF
writer.append(input1)  # 将PDF读入writer中,然后进行书签的编辑f = open(directory_file_name, 'r', encoding='utf8')  # 打开目录文件
lines = f.readlines()  # 读取目录的所有行
num_lines = len(lines)  # 标题的总个数txt = []
bookmark_parent_0 = None
bookmark_parent_1 = Nonefor line in lines:line = line.strip()  # 去掉末尾的'\n'title = line.split(' ')  # 根据line中空格' '进行分割level = line.count('.')  # 有n个'.'就是n+1级标题page_title = title[0] + ' ' + title[1]page_num = int(title[-1]) + offsetif level == 0:bookmark_parent_0 = writer.add_outline_item(title=page_title, page_number=page_num, parent=None)elif level == 1:bookmark_parent_1 = writer.add_outline_item(title=page_title, page_number=page_num, parent=bookmark_parent_0)else:writer.add_outline_item(title=page_title, page_number=page_num, parent=bookmark_parent_1)print(line.strip())print(txt)# Write to an output PDF document
output = open('05_' + original_pdf_name, "wb")
writer.write(output)# Close File Descriptors
writer.close()
output.close()f.close()  # 关闭文件
print('f.closed=', f.closed)

更详细的pypdf使用参考

使用 Python 给 PDF 添加目录书签_python word转pdf按标题生成书签-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_35629563/article/details/133499112


http://www.ppmy.cn/server/126264.html

相关文章

回溯大总结

目录 0、基础什么是回溯?回溯法解决的问题回溯模板 1、组合问题77. 组合216.组合总和III17. 电话号码的字母组合39. 组合总和:40.组合总和II 0、基础 什么是回溯? 回溯是一种穷举的搜索算法,并不是一个高效的算法,当…

【Linux】Linux环境基础开发工具使用

Linux开发工具 Linux编辑器-vim使用 1. vim的基本概念 vim的三种模式,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。 正常/普通/命令模式: …

【C++】set容器和map容器的基本使用

一、序列式容器和关联式容器 1、STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系,…

在Kali Linux VNC服务器上安装RDP服务

在Kali Linux VNC服务器上安装RDP服务,主要是通过安装和配置xrdp来实现的。xrdp是一个开源的远程桌面协议(RDP)服务器,它允许用户通过RDP客户端(如Windows的远程桌面连接)连接到Linux桌面。以下是在Kali Li…

自动驾驶系列—深度剖析自动驾驶芯片SoC架构:选型指南与应用实战

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

毕业设计选题:基于ssm+vue+uniapp的家庭记账本小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构,现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解,需要注意的一点是。ibeacon 分为两个部分,一个是作为广播者,一个是作为观…

OpenCV视频I/O(2)视频采集类VideoCapture之检索视频流的各种属性函数get()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 返回指定的 VideoCapture 属性。 VideoCapture 的 get() 函数用于检索视频流的各种属性。这个函数允许你查询视频源的状态和配置,例如…