当前位置: 首页 > 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

相关文章:

  • 搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索
  • 基于Hive和Hadoop的图书分析系统
  • nodejs逐字读取文件示例
  • 防火墙详解(三)华为防火墙基础安全策略配置(命令行配置)
  • 如何恢复被删除的 GitLab 项目?
  • 前端Vue.js与后端Flask/Django协同开发指南
  • 修改DNS地址有什么影响
  • 选择更轻松:山海鲸可视化与PowerBI的深度对比
  • RP2040 C SDK GPIO和IRQ 唤醒功能使用
  • Angular与Vue的全方位对比分析
  • uni-app 封装websocket 心跳检测,开箱即用
  • 原码反码补码移码
  • 快速创建第一个Spring Boot 项目
  • 【Python】Flask-Admin:构建强大、灵活的后台管理界面
  • 避免glibc版本而报错,CentOS等Linux安装node.js完美方法
  • 【Amaple教程】5. 插件
  • Java|序列化异常StreamCorruptedException的解决方法
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • laravel 用artisan创建自己的模板
  • Odoo domain写法及运用
  • PHP CLI应用的调试原理
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 二维平面内的碰撞检测【一】
  • 关于Java中分层中遇到的一些问题
  • 精彩代码 vue.js
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $ git push -u origin master 推送到远程库出错
  • (30)数组元素和与数字和的绝对差
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (七)c52学习之旅-中断
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (已解决)什么是vue导航守卫
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • .NET中winform传递参数至Url并获得返回值或文件
  • /proc/stat文件详解(翻译)
  • @AutoConfigurationPackage的使用
  • [AIGC] Java List接口详解
  • [Android] Binder 里的 Service 和 Interface 分别是什么
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [Cloud Networking] Layer Protocol (continue)
  • [Django开源学习 1]django-vue-admin
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)