Pdf生成书签


原文链接: Pdf生成书签

这篇文章将讲述如何为 PDF 添加书签目录,但并也不局限于此,你还可以用同样的方法修改已有的书签目录。

这几天在学习编译原理的语法分析,打算看一看《Parsing Techniques》这本经典书籍。
结果打开之前下载的 PDF 一看,六百多页的 PDF 连个书签目录都没有,找起来特别费劲。

于是就根据它的目录页面,给它添加一个书签版的目录,方便以后浏览。

如果你熟悉 Vim,整个过程大概只需要五分钟左右。

工具:

Vim(重点)
FreePic2Pdf
PdgCntEditor

Vim 不用解释了,能胜任各种文本编辑工作的万能编辑器,用了几年之后还会时不时地带来惊喜。这里用 Vim 的正则表达式做了各种替换和删除操作,原本很麻烦的事情在 Vim 中只需要几个命令就能解决,你可以使用其它正则替换工具,但不建议用普通编辑器来完成,因为几分钟能搞定的事情将需要折腾半天才能完成了。

后面两个小工具是配套使用的,FreePic2Pdf 是用于修改 PDF 的工具,可以将一组图片转换成一个 PDF 文件,也可以对某个 PDF 文件进行修改,包括目录和参数等等。PdgCntEditor 是专门编辑目录的工具,用它可以更方便地对 PDF 目录进行修改。

接下来就是 PDF 书签目录的制作过程。
生成 PdgCntEditor 目录

  1. 提取目录信息

从 PDF 中复制目录文本,并粘贴到 Vim 中:

  1. 删除多余文本

通常 PDF 复制的文本格式都或多或少会有一些问题,特别是当你跨页复制时,会有页眉和页脚的文字夹杂在目标文本中间。

因此,通过命令 :%s/\d\zs\D\+$//g 删除页码后面多余的文本:

由于书中给的是三级目录,数量太多反而不好查找,因此可以只保留到二级目录,把三级目录删除,命令 :g/^\d\+.\d\+.\d/d:

  1. 整理格式

目标格式:

一级目录A 页码

二级目录a   页码

一级目录B 页码

二级目录b   页码

PdgCntEditor 中对目录的分级是根据缩进(Tab)来确定的,因此一级目录不用缩进,二级目录行首应该有一个缩进,此处已经删除了三级目录,如果没删除的话,应该有两个缩进。

页码应该跟在目录名之后,中间用一个 Tab 隔开。

所以这里只需要给二级目录添加一个缩进即可,命令 :%s/\v^\ze(\d+.\d+)/\t/:

然后将目录名和页码中间的字符串替换为 Tab,命令 :%s/\v(\s.)+\s/\t/:

  1. 页码重定位

这是一个很常见的问题,书籍目录页中标注的页码通常不等于实际 PDF 页码,但往往是存在一个固定的差值。

上面看到目录中的 Introduction 页码为 1,但实际上是 23:

实际的页码比目录中给出的页码大 22,即偏移值为 +22。

因此,我们将所有的页码都加上 22,命令 :%s/\d+$/\=submatch(0)+22/:

现在,我们得到了一个规范的目录了。
将目录导入到 PDF 中

制作好目录之后,我们打开 FreePic2Pdf 程序,点击“更改PDF”:

接着选择“从 PDF 取书签”,这步是为了得到接口文件,即使 PDF 本身并没有书签:

然后选择“往 PDF 挂书签”,点击图中标号 2 处,会打开 PdgCntEditor 让你编辑目录信息:

将上面生成的目录文本粘贴进来,保存后关闭:

最后点击“开始”完成书签目录的导入:

`