当前位置: 首页 > news >正文

使用 pypdf 给 PDF 添加目录书签

"""
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.lryc.cn/news/449960.html

相关文章:

  • 2025郑州台球展,河南台球展会,智能台球桌展3月举办
  • Vue下载静态文件
  • 04 B-树
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27
  • 恋爱辅助应用小程序app开发之广告策略
  • iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行
  • Unreal Engine 5 C++: 插件编写03 | MessageDialog
  • 【前端面试题】Vue 3 生命周期钩子的执行顺序详解
  • Apache DolphinScheduler-1.3.9源码分析(一)
  • 高级java每日一道面试题-2024年9月29日-数据库篇-索引怎么定义,分哪几种?
  • 现代LLM基本技术整理
  • EasyX与少儿编程:轻松上手的编程启蒙工具
  • 【C语言指南】数据类型详解(上)——内置类型
  • 视频汇聚/视频存储/安防视频监控EasyCVR平台RTMP推流显示离线是什么原因?
  • 联想电脑怎么开启vt_联想电脑开启vt虚拟化教程(附intel和amd主板开启方法)
  • 手把手教你使用YOLOv11训练自己数据集(含环境搭建 、数据集查找、模型训练)
  • LabVIEW界面输入值设为默认值
  • 【Android 14源码分析】Activity启动流程-1
  • Java 中 synchronized 和 Thread 的使用场合介绍
  • 爬虫库是什么?是ip吗
  • 【MySQL】查询原理 —— B+树查询数据全过程
  • 系统设置 WIFI输入框被挡住解决方案
  • SpringCloud无法注册Nacos和配置中心
  • word2vector训练数据集整理(代码实现)
  • 无心上班,只想为祖国庆生?让ChatGPT帮你搞定工作!
  • 【Python】YOLO牛刀小试:快速实现视频物体检测
  • Vscode超好看的渐变主题插件
  • OceanBase技术解析:自适应分布式下压技术
  • Firebase和JavaScript创建Postback Link逻辑
  • docker配置daemon.json文件