揭开PDG和PDF书签制作的小秘密(上)
(图片上传数量有限制,不发了,已生成了PDF文件)
今天,我们一起探讨PDG文件中的书签。相信大家在CX下载某本书后,在PDG文件的同一目录下一般会有BookContents.dat和bookinfo.dat两个文件。bookinfo.dat文件可以直接用“记事本”打开,里面记录了书的相关信息,有:书名、作者、页数、SS号、出版日期等。
但BookContents.dat文件用记事本打开会乱码(这是因为里面采用了ZLIB压缩算法),其实这个文件中保存了PDG的书签信息,下面我们来看看如何获取它里面的内容。
其实,在这之前,许多高手都已经开发了相应的软件。像cheming大侠,在下面的帖子里
http://www.readfree.net/htm/200807/4621995.html
http://www.readfree.net/bbs/read.php?tid=216685&fpage=5
已经揭示了BookContents.dat的内部结构,并开发了BookContents.dat Editor等软件。
今天,我想换一个角度,不用大侠们现成的工具,自己用平常的工具,获取BookContents.dat内容,这会加深我们的理解。
首先,用UltraEdit打开某本书的BookContents.dat文件,最好事先备份一个,再打开。
然后,点工具栏上“切换十六进制模式”按钮,如图:
图中,我划红色框的部分是书签文件的头部,也是我们需要改动的部分;其它部分(即从28h以后的部分)是书签的具体内容,这部分是压缩存储的,我们后续的工作是要把这一部分解压。
下面,先改书签头部。方法如下:
在红色的部分里共有三行,把第一、第二行都删除,然后把第三行的头三个字节改成“1F 8B 08”,其余部分都改成“00”(红色以外的部分不要改)。
注:删除前两行方法是,先把光标定位到文件首字节,再选择“编辑”“十六进制功能”“十六进制增加/删除…”,如图:
然后,点“删除”,输入“32”字节,按“确定”完毕。
改后,如下图所示:
接着,把BookContents.dat另存为BookContents1.dat.gz(注意:加后缀名“.gz”)。
再用WinRar解压BookContents1.dat.gz文件,此时会弹出“CRC循环冗余校验”的错误,不去管它,单击“关闭”。此时,你会发现虽然有错误所示,但文件还是解压出来了BookContents1.dat。
此时,再用“记事本”打开你的“BookContents1.dat”,会发现它已经变成了文本格式。
BookContents1.dat文件中的每一行,代表一个书签,以“封面页 | 00 | 1 | 0 | 1 |”为例:
第一位:“封面页”是书签的名称;
第二位:“00”控制书签的缩进,在同一级别的编号依次递增,每缩进一层,增加两位编号,编号以“十六进制”表示。
第三位:“1”书签导航的页码。
第四位:“0”我还不太清楚,高手可以告诉我。
最后一位:“1”是书签的类别(主要有:封面页1、书名页2、版权页3、前言页4、目录页5、正文页6、插页7、附录页8、封底页9)
综上,我们可以看到,其实BookContents.dat的结构并不复杂,最主要的原理就是:它在28h以后的部分是gzip压缩存储的,这也是我们为什么可以用WinRar解压的根本原因。下次,我来介绍“PDF Reference学习札记(二)”探讨PDF的书签。只有当我们清楚了PDG和PDF两种书签的实现方式,这样我们开发bkcntEditor.exe等软件就易如反掌了。
|