python:修改pdf的书签
我觉得修改pdf书签总体来说最方便的方式就是:
导出pdf书签为文本文件,修改书签文本文件后再导入到pdf中。
1.直接修改pdf书签
python中比较好用的pdf处理的库是pymupdf:
pip install pymupdf # pip安装pymupdf库
让人疑惑的是库名是pymupdf,但是导入库要用 "import fitz"
import fitz # 导入pymupdf库
doc = fitz.open("test.pdf") # 获取一个pdf对象
toc = doc.get_toc() # get_toc()方法获取pdf对象的书签
print(toc) # toc是一个二维的列表。
get_toc()方法获取的书签是一个为二维列表。如果pdf中只有一条书签。获取到书签将会是下面的这种形式:
out[1]:
[[1, '目录', 3]]
- 上面输出的数字1代表的是书签的缩进级别。这个缩进级别数字是最小是1。如果大于1,比如是2,要求上一个书签的缩进仅别必须要小于或者等于2。根据这个规则,第一个书签的缩进仅别必需要是1.
- 字符串"目录"是书签的名字。
- 数字3是书签跳转的页码。
知道了toc中数据的意义,我们就可以直接按需要修改书签:
toc[0][1] = 'test' # 将书签名字"目录"修改为”test“
out[2]:
[[1, 'test', 3]] # 从终端输出可以看出toc中的数据已经修改成功了
doc.set_toc(toc) # 将修改后的书签数据导入到pdf对象中。
# set_toc()方法具体说是先删除pdf对象的书签数据,再导入给定的书签数据
doc.saveIncr() # 保存修改到本地pdf文件中,不需要指定路径。
2. 导出pdf书签
如果pdf中书签很多,直接在命令行中操作很麻烦。最好导出数据为文本文件,在文本文件上手动修改文本文件。又因为书签数据是一个"表格",即二维列表,比较好的方式是导出为csv格式的文件。
import csv
with open ("toc.csv","w",newline="") as f:
writer=csv.writer(f,delimiter=";") # 在csv中指定用”;“分隔数据
writer.writerows(toc) # 将一个二维列表一次写入到csv文件中。注意是writerows而不是writerrows。
上面代码导出的文件,类似下面的形式:
1;起步;12
2;Git 简史;16
2;Git 基础;16
2;命令行;19
书签的缩进仅别不是很直观,不方便修改。最好稍微修改一下代码用四个空格代表缩进:
with open ("toc.csv","w",newline="") as f:
writer=csv.writer(f,delimiter=";")
for i in toc:
i[0] = " "*(i[0]-1) # 将缩进的数字转换成空格。如果缩进是1,没有空格。如果是2,将2转换成4个空格,以此类推
writer.writerows(toc)
这样。导出的csv文件是下面这种形式,缩进变得很直观:
;起步;12
;Git 简史;16
;Git 基础;16
;命令行;19
更进一步,我们也可以删除第一个“;”,但是没有多大必要。
3. 修改书签文本文件
3.1 修改书签的缩进级别
直接修改就好了。但还是有一点技巧。
一般的pdf,我们只需要两个级别的缩进就好了。比如说:pdf中有很多章,需要将这些章设为一级书签;每章中有很多小节,将章中的节设为二级书签。
此时我们先给每个行前面插入四个空格,然后再删除不需要的缩进。因为章的数目总比节的数目要少。这些都能通过正则替换直接完成,比如在vim中:
:s/^/ ^/g # 在每行前面插入四个空格
:s/^\s\+\(;第*\+章\)/\1/g # 删除部分缩进
3.2 修改书签跳转页码
比较常见的情况是,需要将每个书签跳转的页码增加或者减少一个数字。此时,在vim中,可以用n+ctrl+a为每行的第一个数字增加n,n+ctrl+x为每行的第一个数字减少n。也可以在导入书签时在脚本中处理。
比如在 豆瓣读书上,我们复制了一本书的目录如下:
第一章 性别“女” 001
消失的声音 003
女孩的游戏 013
让我看见你 022
美丽的脆弱 029
上面的页码数字都是"正文页码”,但是正文的第一页常常不是pdf的第一页,此时就需要将上面的页码数字都增加一个固定数字。
3.3 修改复制而来的书签文本。
比如我们修改将前面从豆瓣读书上复制来的目录,具体操作步骤是:
- 先在每一行前面增加一个“;” 。在vim中是执行:s/^/;/g
- 在后面的数字前面增加一个分号。:s/\(\d\+\)$/;\1/g。直接将空格替换成分号不可行,因为书签名字中间也有空格。
- 修改书签跳转页码,每个页码增加一个数字。参看前面。
- 修改缩进。参看前面。
我们复制而来的书签千差万别,需要根据实际情况进行修改。
4. 导入书签数据
- 第一个问题就是,为了直观看到缩进,我们将代表缩进的数字改为了空格。我们需要在导入书签前将这些空格转换成一个数字,或者导入的时转换成数字,才能导入到pdf中。
- 其次,用csv库读取csv文件为一个列表,一般会将所有字段都视作为一个字符串。pandas读取csv比较方便也更智能,如果csv中某一列所有数据都是数字,将自动视该列为数字而不是字符串。
因为前面用的csv库,所以导入数据我们也用csv库。
with open(toc.csv,"r") as f:
reader = csv.reader(f,delimiter = ";")
toc=[] # 定义一个空列表,用来存储书签数据
for i in reader :
toc.append(i) # 在列表尾部插入数据
for i in toc : # 处理toc中数据,如将一些字符串转为数字
i[2] = int(i[2]) # 将每行的第三个字段转换成一个数字
i[0] = int(i[0].count(" ")/4+1) # 如果toc.csv中的空格没有转换成一个数字执行这一步转换
# 统计第一个字段的空格数目,每四个空格将缩进数字加1
导入书签的完整代码:
import fitz
import os
import csv
# 默认书签文本文件文件名是"out_toc.txt"
# out_toc.txt中每一行三个字段,第一个字段用每四个空格代表书签的缩进+1
# 默认out_toc.txt和pdf文件在同一目录
# 运行脚本,会提示输入pdf文件路径,可以输入相对路径和绝对路径
def pdf_path():
pdf=input("输入pdf路径:")
if pdf[0] == "~" :
pdf_path = "/home/menghua"+pdf.replace("~","")
elif pdf[0] == "." :
pdf_path = os.getcwd() + pdf.replace(".","")
elif pdf[0] != "/" :
pdf_path=os.getcwd() + "/" + pdf
else :
pdf_path=pdf
if os.path.exists(pdf_path) and pdf_path[-3:] == "pdf" :
print(pdf_path)
return (pdf_path)
else :
print("pdf文件不存在:"+pdf_path)
return(0) if __name__ == "__main__":
pdf_path = pdf_path()
if pdf_path == 0:
os._exit() toc_path = os.path.dirname(pdf_path) + "/" + "out_toc.txt"
if os.path.exists(toc_path):
with open(toc_path,"r") as f:
reader = csv.reader(f,delimiter = ";")
toc=[]
for i in reader:
toc.append(i)
for i in toc :
i[0] = int(i[0].count(" ")/4+1)
i[2] = int(i[2])
else :
print("书签文件(" + "out_toc.txt" + ")不存在。")
doc = fitz.open(pdf_path)
doc.set_toc(toc)
#保存修改
doc.saveIncr()
python:修改pdf的书签的更多相关文章
- C# 读取PDF多级书签
在PDF中,书签作为一种导航的有效工具,能帮助我们快速地定位到文档中的指定段落.同时,书签也能让人对文档结构一目了然,在某种程度上也可作为目录使用.对于C#操作PDF中的书签,在上一篇文章中介绍了具体 ...
- 使用iTextSharp修改PDF文件(一)
这个iTextSharp确实是个好东西,可以创建.读取PDF格式的文档,虽然我的需求比较简单,但我首先还是基本上.完整地看完了它的相关文档,不喜欢英文的同志,可以搜索一篇<用C#制作PDF文件全 ...
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- 疯狂Python讲义PDF高清完整版免费下载|百度网盘
百度网盘:疯狂Python讲义PDF高清完整版免费下载 提取码:uzba 内容简介 <疯狂Python讲义>既是一本适合初学者入门Python的图书(一个8岁的小朋友在未出版前已学习了本书 ...
- 用Python去除PDF水印
今天介绍下用 Python 去除 PDF (图片)的水印.思路很简单,代码也很简洁. 首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面. 这张图片是前几天整理<数据 ...
- python压缩pdf(指定缩放比例)
python压缩pdf(指定缩放比例) 原理 pdf文件处理使用https://pymupdf.readthedocs.io/en/latest/index.html库可以轻松实现,该库的官方说明文档 ...
- Python绘制PDF文件~超简单的小程序
Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...
- 翻译文章“AST 模块:用 Python 修改 Python 代码”---!!注意ironpathyon未实现此功能
https://github.com/upsuper/blog/commit/0214fdd084c4adf2de2ed9912d644fb59ce13a1c +Title: [翻译] AST 模块: ...
- python制作pdf电子书
python制作pdf电子书 准备 制作电子书使用的是python的pdfkit这个库,pdfkit是 wkhtmltopdf 的Python封装包,因此在安装这个之前要安装wkhtmltopdf 安 ...
- 怎么修改PDF文档图片内容
我们想要修改PDF文件的时候应该怎么做呢,PDF文件不同于其他的文件,PDF文件的编辑需要借助PDF编辑器才能够对文件进行编辑修改,那么要怎么修改PDF文档图片内容呢,有许多的小伙伴都想知道该怎么做, ...
随机推荐
- c语言趣味编程(4)抓交通肇事犯
一.问题描述 一辆卡车违反交通规则,撞人后逃跑.现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征. 甲说:牌照的前两位数字是相同的: 乙说:牌照的后两位数字是相同的,但与前两位不同: 丙是 ...
- SpringBoot自定义cron表达式注册定时任务
springBoot自定义cron表达式注册定时任务 一.原理 1.使用Spring自带的TaskScheduler注册任务 2.注册后返回:ScheduledFuture,用于取消定时任务 3.注册 ...
- 这可能是最全面的MySQL面试八股文了
什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...
- Python-HwTestReport的简单使用
一.工具包下载 https://github.com/hongweifuture/HwTestReport(出自此大神) 二.使用示例(直接上代码) 1.将 HwTestReport.py 导入项目 ...
- 自动化部署(Gitlab)
小程序可持续化自动部署 一.安装gitlab-runner 官方地址:https://docs.gitlab.com/runner/install/ windows安装如下: nodejs的环境变量一 ...
- 聚合短信PHP代码示例短信接口调用CURL方法
聚合的短信相信大家已经做多了吧,网上的代码看了下就是感觉太繁琐了,不过网上的也是比较好的,用的是post方法,更安全,因我们的项目是在服务器上请求,又绑定了白名单 ,所以弄了个简单点的自己用,参考如下 ...
- 2022-07-17:1、2、3...n-1、n、n、n+1、n+2... 在这个序列中,只有一个数字有重复(n)。 这个序列是无序的,找到重复数字n。 这个序列是有序的,找到重复数字n。
2022-07-17:1.2.3-n-1.n.n.n+1.n+2- 在这个序列中,只有一个数字有重复(n). 这个序列是无序的,找到重复数字n. 这个序列是有序的,找到重复数字n. 答案2022-07 ...
- uni-app 背景图片
背景图片 uni-app 支持使用在 css 里设置背景图片,使用方式与普通 web 项目大体相同,但需要注意以下几点: 支持 base64 格式图片. 支持网络路径图片. 小程序不支持在 css 中 ...
- .NET6项目连接数据库方式方法
前言 接上一篇Linux系统下创建dotnet项目,这一篇我们聊聊.NET6环境下dotnet项目连接数据库的方式方法,包括数据库字符串该如何配置.看了很多博主写的文章,连接数据库字符串配置的方式和位 ...
- 深入理解 python 虚拟机:破解核心魔法——反序列化 pyc 文件
深入理解 python 虚拟机:破解核心魔法--反序列化 pyc 文件 在前面的文章当中我们详细的对于 pyc 文件的结构进行了分析,pyc 文件主要有下面的四个部分组成:魔术. Bite Filed ...