Pdf生成书签
这篇文章将讲述如何为 PDF 添加书签目录,但并也不局限于此,你还可以用同样的方法修改已有的书签目录。
这几天在学习编译原理的语法分析,打算看一看《Parsing Techniques》这本经典书籍。
结果打开之前下载的 PDF 一看,六百多页的 PDF 连个书签目录都没有,找起来特别费劲。
于是就根据它的目录页面,给它添加一个书签版的目录,方便以后浏览。
如果你熟悉 Vim,整个过程大概只需要五分钟左右。
工具:
Vim(重点)
FreePic2Pdf
PdgCntEditor
Vim 不用解释了,能胜任各种文本编辑工作的万能编辑器,用了几年之后还会时不时地带来惊喜。这里用 Vim 的正则表达式做了各种替换和删除操作,原本很麻烦的事情在 Vim 中只需要几个命令就能解决,你可以使用其它正则替换工具,但不建议用普通编辑器来完成,因为几分钟能搞定的事情将需要折腾半天才能完成了。
后面两个小工具是配套使用的,FreePic2Pdf 是用于修改 PDF 的工具,可以将一组图片转换成一个 PDF 文件,也可以对某个 PDF 文件进行修改,包括目录和参数等等。PdgCntEditor 是专门编辑目录的工具,用它可以更方便地对 PDF 目录进行修改。
接下来就是 PDF 书签目录的制作过程。
生成 PdgCntEditor 目录
- 提取目录信息
从 PDF 中复制目录文本,并粘贴到 Vim 中:
- 删除多余文本
通常 PDF 复制的文本格式都或多或少会有一些问题,特别是当你跨页复制时,会有页眉和页脚的文字夹杂在目标文本中间。
因此,通过命令 :%s/\d\zs\D\+$//g
删除页码后面多余的文本:
由于书中给的是三级目录,数量太多反而不好查找,因此可以只保留到二级目录,把三级目录删除,命令 :g/^\d\+.\d\+.\d/d:
- 整理格式
目标格式:
一级目录A 页码
二级目录a 页码
一级目录B 页码
二级目录b 页码
PdgCntEditor 中对目录的分级是根据缩进(Tab)来确定的,因此一级目录不用缩进,二级目录行首应该有一个缩进,此处已经删除了三级目录,如果没删除的话,应该有两个缩进。
页码应该跟在目录名之后,中间用一个 Tab 隔开。
所以这里只需要给二级目录添加一个缩进即可,命令 :%s/\v^\ze(\d+.\d+)/\t/:
然后将目录名和页码中间的字符串替换为 Tab,命令 :%s/\v(\s.)+\s/\t/:
- 页码重定位
这是一个很常见的问题,书籍目录页中标注的页码通常不等于实际 PDF 页码,但往往是存在一个固定的差值。
上面看到目录中的 Introduction 页码为 1,但实际上是 23:
实际的页码比目录中给出的页码大 22,即偏移值为 +22。
因此,我们将所有的页码都加上 22,命令 :%s/\d+$/\=submatch(0)+22/:
现在,我们得到了一个规范的目录了。
将目录导入到 PDF 中
制作好目录之后,我们打开 FreePic2Pdf 程序,点击“更改PDF”:
接着选择“从 PDF 取书签”,这步是为了得到接口文件,即使 PDF 本身并没有书签:
然后选择“往 PDF 挂书签”,点击图中标号 2 处,会打开 PdgCntEditor 让你编辑目录信息:
将上面生成的目录文本粘贴进来,保存后关闭:
最后点击“开始”完成书签目录的导入: