自己给PDF增加书签

PDF 电子书是穷学生和胖学生的福音,但很多 PDF 文件下载下来是没有加上书签的。于是乎我先找了找软件,结果这些傻X软件的增加书签功能都是付费的。然后再找,找到一个用 py 脚本[1]。很好。

这个脚本的用法是:

[脚本名.py] [PDF文件路径] [书签文件路径] [偏移量]

比如:

> PDFbookmark.py ebook.pdf toc.txt 14

偏移量是给全部页码都增加的,因为一般 PDF 文件的第一页都不会是真正的第一页。书签文件要遵循一定的写法。大概像是这样:

封面 -13
译者序 -10
前言 -9
目录 -4
第1章 面向对象编程 1
  1.1 面向过程的编程风格与面向对象的编程风格 1
    1.1.1 面向过程的编程风格 1
    1.1.2 面向对象的编程风格 2
    1.1.3 关系 3
    1.1.4 课后练习 3
  1.2 类与抽象数据类型 3
    1.2.1 信息隐藏 3
    1.2.2 封装 4
    1.2.3 抽象数据类型 4
    1.2.4 课后练习 5

最多标到三级标题。一级标题无缩进,二级标题一点缩进,三级标题更多一点缩进。

看下源码,大概就是用了 PyPDF 这个库,可以给 PDF 写书签。一开始打开书签文件一行行读它,按照缩进的多少判断是哪一级标题。维护一个存有每个书签行缩进量的数组,当要找当前行的父标题是谁的时候,就从这个缩进量数组从后往前找第一个缩进量小于当前行缩进量的数组下标。

后来鉴于从网上找的目录一般都全部没有缩进,所以我写了个额外的函数处理缩进。这个函数的作用是给一二三级标题加上 0,2,4 个空格。现在这个脚本的用法扩展为:

原来:[脚本名.py] [PDF文件路径] [书签文件路径] [偏移量]
增加:[脚本名.py] [书签文件路径]

增加的用法例子:

> PDFbookmark.py toc.txt

再后来鉴于从网上找的 PDF 文件很多都已经加了一些完全没有任何用处的书签,再给脚本加上了去除书签的功能。全部的用法和源码已经上传 github,详情见 pdf_bookmarker

> pdf_bookmarker.py
Usage:

Add Bookmarks
         pdf_bookmarker.py [pdf] [bookmark_txt] [page_offset]
Remove Bookmarks
         pdf_bookmarker.py -r [pdf]
Add Indents
         pdf_bookmarker.py [bookmark_txt]

参考

[1] https://www.zhihu.com/question/344805337/answer/1116258929
[2] https://github.com/pmaupin/pdfrw/issues/52

原文地址:https://www.cnblogs.com/tandandan/p/13734969.html