PdgCntEditor: To edit PDF, DjVu and PDG contents in text or tree mode. 作者：马健 邮箱：stronghorse_mj@hotmail.com 主页：老马的原创空间 FAQ 使用说明 一、软件安装/删除 二、软件使用 命令行参数 一般性说明 文本模式 树形模式 编解码模式 应用示例 PDF中的特殊目标 附录A 鸣谢 附录B 正则表达式语法 附录C 版本更新记录 # FAQ Q：PdgCntEditor是什么？ A：这是一个目录（书签）编辑器，具有下列特点： 在文件格式上，支持PDF、DjVu、PDG（包括bookcontents.dat和catalog.dat）。PDF不支持加密PDF。 在编辑界面上，提供文本、树形两种编辑模式，以满足不同的需要。 提供PDG目录编解码功能，有兴趣的用户可以用它对PDG目录文件内部数据格式进行研究。 可以不解包直接编辑zip文件中的PDG目录文件，编辑结果直接存入zip。 能够与UnicornViewer（UV）联动，从UV中启动以编辑当前正在阅读的文件目录，存盘后会自动通知UV刷新目录。 支持符合FreePic2Pdf接口文件格式的目录文件（FreePic2Pdf_bkmk.txt），并能从DjVuToy、FreePic2Pdf中启动，对PDF、DjVu目录文件进行编辑。 除常规的查找、替换、编辑等功能外，还提供“总在最上面”、“半透明”等功能，方便对照原文对目录进行编辑。 提供繁体、简体转换功能，方便使用。 文本编辑模式下支持正则表达式替换，采用微软为VBScript、JavaScript准备的正则表达式引擎，因此语法与ASP、JSP中的正则表达式语法一致。 注意：使用本软件的一切后果（包括法律后果）由使用者自行承担，使用前请先对需要编辑的文件做好备份，以免后悔。 尤其对于PDF文件，不保证编辑后还能正常打开。 Q：为什么要开发PdgCntEditor？ A：理由如下： PDG文件的原版目录经常有错，最常见的错误是：目录没有按章节进行分级、目录中存在错别字、目录页码错误。这些错误均可用PdgCntEditor轻松修正。 很多PDG、PDF、DjVu书籍本身是没有目录的，这时可以用PdgCntEditor创建。 DjVuToy、FreePic2Pdf以前一直缺乏一个好用的目录编辑器，现在可以用这个了。 Q：PdgCntEditor收费吗？ A：PdgCntEditor是一个“友情软件”（Friendware），用户在承诺不用于商业目的，也不对文件及其附件进行任何更改的条件下，不需要为使用该软件付任何费用，最多是在BBS上看到我发帖子灌水时（我的ID一般是strnghrs），进去捧个人场，作为友情回报；或者在年节时发个email问声好（所以叫“友情软件”）。我承诺绝不在程序中暗藏任何商业广告、木马，但不承诺为使用PdgCntEditor的后果承担任何责任。如果您需要将它用于商业目的，或加入您的网站，请与我联系，否则保留追究一切责任的权利。 Q：文本编辑模式有什么特点？ A：在文本编辑模式下，用制表符（TAB）构成的缩进来表示目录分级关系。文本编辑器仿照一般IDE设计，支持TAB、Shift+TAB和回车自动缩进，熟悉IDE的用户可能会喜欢。 文本编辑模式比较适合对目录文字、页码进行大量录入、编辑的情况，如为没有目录的书籍创建目录。 Q：树形编辑模式有什么特点？ A：树形编辑模式用图形化的界面展示目录分级关系，并且可以折叠、展开分级目录，适合一般人员使用。 树形编辑模式下调整目录分级比较直观，但是文字、页码编辑不如文本模式方便。因此如果是创建新目录文件，可以先进入文本模式，录入或粘贴文字、页码信息，然后再切换到树形模式调整目录分级。 Q：编解码功能有什么特点？ A：编解码模式主要有两个功能： 1、将目录文件解码成文本文件。bookcontents.dat解码后的内容其实就是正版超星浏览器生成的Contents.dat内容，catalog.dat解码后的内容则是一个标准XML文件。 2、将文本文件编码成目录文件。文本文件内容同上。 这个功能的作用包括： 1、如果PdgCntEditor生成的目录文件不幸在超星浏览器中打不开，可以解码后手工修正，然后再编码成目录文件。 2、可以供感兴趣的人士研究PDG目录文件的格式。其实编码过程就是把文本文件用zlib进行压缩，再加上一个文件头；解码过程则反之。多看上几次，说不定你自己都能写一个PDG目录 编解码器了。 ## 使用说明 一、软件安装/删除 本软件安装非常简单：创建一个目录，用WinZip或WinRAR将下载下来的ZIP包解压缩到该目录即可。 本软件的删除也很简单：直接删除从ZIP包中解压缩出来的所有文件及运行过程中生成的文件即可。 ZIP包中包括下列文件： PdgCntEditor.exe。这是软件的主程序。 PdgCntEditor.htm。本帮助文件。 如果您下载到的ZIP包中还包括其它文件，毫无疑问不是我放进去的，有广告或木马之嫌疑，请立即删除。 另外程序运行过程中还会生成以下文件： PdgCntEditor.ini。这个是参数保存文件，第一次更改参数后生成。退出PdgCntEditor，删除此文件，再重启PdgCntEditor，即可恢复缺省参数。 PdgCntEditor.pwd。ZIP文件口令表，纯文本文件。 PdgCntEditor.rpx。正则表达式保存文件，如果在正则表达式输入界面中点击“保存”，则会生成此文件。 二、软件使用 命令行参数 软件命令行参数如下： PdgCntEditor [-m:text|tree|codec] [path] -m: 指定编辑模式，可以是文本（text）、树形（tree）或编解码（codec），缺省为文本。 path：要编辑的文件路径，由盘符、文件夹、文件名三部分构成。可以直接指定zip文件，软件自动搜索其中的目录文件。如果路径中包含空格，需要在路径前后加半角双引号。 例如： PdgCntEditor -m:codec 将以编解码模式启动本软件。 PdgCntEditor -m:tree "D:\mm\Windows Server 2003技术内幕 基础篇.zip" 将以树形编辑模式打开指定的zip文件。 一般性说明 1、工具条按钮提示 本软件的大部分功能体现在工具条按钮上，将鼠标移动到按钮上停止不动约1秒，将自动弹出按钮功能提示。 各按钮功能简述如下表。其中红字是文本编辑界面独有，绿字是树形界面独有。
类别 | 按钮 | 功能说明 | 快捷键
文件 | 打开 | 打开需要编辑的文件，效果与从资源管理器拖拽过来等同 | Ctrl+O
保存 | 保存当前正在编辑的文件 | Ctrl+S
繁体、简体转换 | 对正在编辑的目录内容进行繁简体转换 |
切换编辑模式 | 从文本模式切换到树形模式，或反之 | Ctrl+T
编辑 | 剪切 | 把当前选定内容剪切到剪贴板 | Ctrl+X
复制 | 把当前选定内容复制到剪贴板 | Ctrl+C
粘贴 | 把剪贴板内容粘贴到当前光标处 | Ctrl+V
撤消 | 撤销上一步编辑操作 | Ctrl+Z
查找 | 查找指定的文本内容 | Ctrl+F
重复 | 重复上一次查找 |
替换 | 替换指定的文本内容 | Ctrl+R
正则表达式替换 | 按照正则表达式匹配查找，内置常用表达式，正则表达式详细语法见附录B |
选择全部 | 选定全部目录内容 | Ctrl+A
选定区域移至最左侧 | 所选定的目录内容去掉全部缩进或空白，全部变成一级目录 |
自动切分页码 | 在最左侧数字前面自动添加TAB分隔符，使数字成为页码 |
选定区域自动缩进 | 对于1.1、1.1.1这样规律性的目录，自动进行缩进 |
加减选定区域的页码 | 按照指定的增量，更改所选定范围内的目录项页码 |
粘贴页码 | 从光标所在行开始，用剪贴板中的数字（可以是多行）替换目录项的页码 |
所选条目左移一栏 | 所选目录项左移，即减小目录级数 | Shift+TAB
所选条目右移一栏 | 所选目录项右移，即增加目录级数 | TAB
所选条目上移一行 | 所选目录项上移一行，目录级数保持不变 | Ctrl+↑
所选条目下移一行 | 所选目录项下移一行，目录级数保持不变 | Ctrl+↓
在当前条目前添加同级条目 | 在当前目录项前添加一个新目录项，与前目录项同级 |
在当前条目后添加同级条目 | 在当前目录项后添加一个新目录项，与前目录项同级 | Enter
插入子条目 | 在当前目录项下面添加一个新目录项，成为当前目录项的首个子目录项 |
追加子条目 | 在当前目录项的子目录末尾添加一个新目录项，成为当前目录项的末尾子目录项 |
删除 | 删除选定目录项 | Del
展开全部 | 展开全部树形结构 |
全部折叠 | 折叠全部树形结构 |
删除空行 | 删除所有空行 |
其他 | PDF目录选项 | 比较复杂，后面详细说明 |
制表符宽度 | 设置显示TAB分隔符时的空白宽度 |
字体 | 对编辑界面的字体、字号进行设置，在高分辨率屏幕上通常选择较大字号 |
catalog.dat字符编码 | 选择保存catalog.dat文件时的字符编码，对于繁体目录建议选择utf-8编码 |
总在最上面 | 使本软件界面总是漂浮在其他软件界面之上 |
透明度 | 通常与“总在最上面”配合使用，防止完全遮挡，便于对照原文对目录进行校对 |
Zip密码 | zip/uvz文件密码管理。打开加密文件时会自动用密码表中的密码匹配 |
关于 | 显示本软件的版本等信息 |
使用说明 | 打开本使用说明 | F1
2、内容更改提示 如果目录内容已被改变，窗口标题条名称后面会加一个星号，在退出时会提示用户保存。 3、通用快捷键
功能 | 快捷键
退出程序 | ESC
Ctrl+Home | 移到文件头
Ctrl+End | 移到文件尾
Shift+箭头键 | 选择区域
PDF选项 PDF选项对PDF目录进行控制，可以在打开PDF后进行设置，存盘时生效。由于PdgCntEditor的PDF目录编辑功能是从FreePic2Pdf搬过来的，因此选项与FreePic2Pdf接口文件中的选项类似，可以参考FreePic2Pdf接口说明。另外PdgCntEditor对PDF的控制能力相对较弱，没有分段页码等功能。如果需要这些功能，请使用FreePic2Pdf。
选项 | 说明
基准页 | 目录基准页码。作用见后面叙述，此值必须大于等于1。此值为绝对页码：从PDF文件的第一页（绝对页码为1）开始连续编排。
点击目录后页面缩放 | 点击目录项后，在PDF浏览器中页面的显示比例。
打开PDF时显示目录 | 如果此选项被选中，在PDF文件浏览器中打开PDF文件即显示目录，否则不显示。
展开所有目录 | 如果此选项被选中，在PDF文件浏览器中打开PDF文件即所有目录，否则只显示顶级目录。
每个目录项均包含目录项文字和目录项对应页面。目录项对应页码可以是正整数或负整数，0视为无效。从PDF选项中“基准页”规定的页码值开始算，基准页码及其之后的页码为正数，之前的页码为负数。即如果目录项对应的页面就是基准页，则目录项对应页码为1；如果目录项对应的页面是基准页面的后一页，则目录项对应页码为2；如果目录项对应的页面是基准页的前一页，则目录项对应页码为-1。 用基准页对目录项页码进行调节，可以方便手工录入目录：在录入的时候，只需对照实体书的目录页录入目录标题，目录项对应页码直接照书上目录对应页码录入；然后将基准页设置为正文第一页的绝对页码即可。 文本模式 文本模式与一般IDE界面相似，支持Ctrl+A（全选）、Ctrl+C（复制）、Ctrl+V（粘贴）、Ctrl+Z（撤销）等快捷键，回车后新行自动缩进。 文本模式下，用TAB缩进表示目录分级关系。每个目录条目占据一行，行首TAB数表示级数，条目文字后再跟一个TAB，然后是条目对应的页码。如果没有对应的页码，则文字后无TAB。 TAB显示宽度可以通过点击“制表符宽度”按钮进行设置。 为了便于输入页码，文本模式下按照PDG文件类型分成了8个输入窗口，分别对应封面页、书名页、版权页、前言页、目录页、正文页、附录页、封底页。对于有内容的窗口，其页签上会带一个加号作为提示。 树形模式 树形模式下，用图形化的界面展示目录分级关系，并且可以折叠、展开分级目录。左移、右移、左齐折叠起来的条目，该折叠条目下的所有子条目随之左移、右移、左齐。 树形模式下每个目录条目占据一行，文字与页码之间用半角符号“|”进行分隔。 与文本模式不同，树形模式下所有类型的目录条目均在一个框内展现，非正文页的页码通过加前缀来区别，前缀同PDG文件前缀，分别是：cov（封面页）、bok（书名页）、leg（版权页）、fow（前言页）、!（目录页）、att（附录页）、bac（封底页）。前缀后直接是页码，不需要补零。 支持的快捷键：
功能 | 快捷键
回车 | 开始编辑所选条目。编辑完成后，按回车确认，按ESC撤销编辑
空格 | 打开、折叠目录树
Ctrl+鼠标左键 | 选定鼠标点击的条目
Shift+鼠标左键 | 选定两次点击之间的所有条目
编解码模式 一、启动 编解码模式只能通过命令行参数进入。可以用批处理，也可以创建快捷方式，然后指定命令行参数，见前面命令行说明。 二、解码 选择“编码后的目录文件”，可以是bookcontents.dat或catalog.dat，但不能是zip，然后点“解码”，解码后生成bookcontents.txt或catalog.txt。 bookcontents.txt就是正版超星浏览器生成的Contents.dat，catalog.txt则是一个XML文件。 三、编码 选择“解码后的文本文件”，文件格式必须符合Contents.dat或XML格式，然后选择“编码后的目录文件”，点“编码”即可。 应用示例 一、编辑现有目录，调整目录分级 1、运行软件，打开需要编辑的目录文件。 2、切换到树形编辑模式。 3、点“全选”，再点“左齐”，将所有条目全部左齐。 4、选择需要缩进的条目，通过“右移一栏”、“左移一栏”调整分级直到满意。 5、编辑过程中如果觉得窗口不够大，可以用鼠标拖动窗口右、下边框进行缩放，或直接点右上角的“最大化”按钮。 6、如果需要对文字或页码进行编辑，选中需要编辑的条目，按回车开始编辑，按回车或ESC退出编辑。 7、点“保存”保存修改。 8、点右上角的“关闭”退出。 二、创建新目录 1、运行软件，进入文本编辑模式。 2、手工录入，或OCR后粘贴，或从网上粘贴目录内容，对照PDG的目录页输入页码。输入页码时可以点“透明度”按钮，将窗口设置成半透明。如果页码直接来自OCR结果，可以点“全选”，再点“自动切分页码”，在行末的页码数字前自动插入一个TAB；点“自动缩进”，自动尝试对诸如1.1、1.1.1、1.1.2的项目设置缩进。 3、确认输入内容无误后，存盘。 4、切换至树形界面，准备调整目录分级。 5、通过“右移一栏”、“左移一栏”调整分级直到满意。编辑过程中如果觉得窗口不够大，可以用鼠标拖动窗口右、下边框进行缩放，或直接点右上角的“最大化”按钮。 6、如果需要对文字或页码进行编辑，选中需要编辑的条目，按回车开始编辑，按回车或ESC退出编辑。 7、点“保存”保存修改。 8、点右上角的“关闭”退出。 三、创建繁体目录文件 1、如果原始目录文件是简体的，先打开，然后点“繁体、简体转换”，转换成繁体。 2、如果是Contents.dat，存盘后在简体中文Windows下 才可显示；如果是catalog.dat，存盘前先点“catalog.dat字符编码”，选择“utf-8”，然后再存盘 ，则可在非简体中文Windows下也能显示。 PDF中的特殊目标 PDF的目录（Outline）除了指向页码外，还允许指向某个名称、动作，甚至某个外部文件。在本软件中，采用某些特殊字符加以区别： 对于“已命名的目标”（Named Destinations），如果是字符串则直接显示名称，但是名称不能以数字开头，否则必须在数字前加字符“#”；如果是name则在name前加斜杠。 对于“已命名的动作”（Named Action），动作名称前面加字符“!”。 对于外部PDF文件，文件名前面加字符“^”，如果还需要指定页码，则在文件名后加TAB，再加页码。 ## 附录A 鸣谢 本软件在开发过程中得到网上读书园地成员车明（BECompanion）、hstong的大力支持与协助。目录文件编解码采用了zlib源代码。ZIP文件处理采用了Info-ZIP源代码。 在此对以上组织和个人表示深切的谢意！ ## 附录B 正则表达式语法（引自《VBScipt 用户指南》） 一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。 这里有一些可能会遇到的正则表达式示例：
正则表达式 | 匹配
--- | ---
^[ \t]*$ | 匹配一个空白行。
\d{2}-\d{5} | 验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。
<(.*)>.*<\/\1> | 匹配一个 HTML 标记。
字符串替换实例
字符串 | <A HREF=../mrx/arc/mrx_003b.txt>
正则表达式 | <A HREF=([\d\D].*)txt>
替换为 | <A HREF=$1txt target=center>
结果 | <A HREF=../mrx/arc/mrx_003b.txt target=center>
下表是元字符及其在正则表达式上下文中的行为的一个完整列表：
字符 | 描述
--- | ---
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。
* | 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ | 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
? | 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} | n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。
{n,} | n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} | m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。
(?:pattern) | 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) | 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。
(?!pattern) | 负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始
x|y | 匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] | 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] | 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b | 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。
\cx | 匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。
\d | 匹配一个数字字符。等价于 [0-9]。
\D | 匹配一个非数字字符。等价于 [^0-9]。
\f | 匹配一个换页符。等价于 \x0c 和 \cL。
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。
\r | 匹配一个回车符。等价于 \x0d 和 \cM。
\s | 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t | 匹配一个制表符。等价于 \x09 和 \cI。
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn | 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num | 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。
\n | 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。
\nm | 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。
\nml | 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。
\un | 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (©)。
## 附录B 版本更新记录 Version 3.12 错误修正：如果原PDF使用了xref stream，书签保存后在Acrobat中打开不报错，在其他PDF浏览器中打开可能会报xref损坏。 Version 3.11 错误修正：PDF书签存盘时出错退出。 Version 3.10 新增功能：文本编辑界面中增加“粘贴页码”按钮，方便通过OCR自制目录。 新增功能：文本编辑界面中增加“所选条目上移一行”、“所选条目下移一行”，方便调整目录项顺序。 功能增强：文本编辑界面的“选定区域移至最左侧”、“选定区域自动缩进”能够自动去掉空白行。 功能增强：文本编辑界面的“选定区域自动缩进”能够自动将除页码前的那个TAB字符以外的所有TAB字符自动替换成空格，避免多余的TAB字符干扰自动缩进判断。 错误修正：由于没有区别named destination的Dest究竟是name还是string，导致某些PDF编辑目录后目录失效。 本帮助文件中增加对工具条按钮的说明，同步发行本软件的详细系列教程。 Version 3.09 错误修正：编辑PDF目录时，如果引用的外部PDF文件名中有中文，会出现乱码。 Version 3.08 功能增强：在提取PDF目录时，兼容某些不符合《PDF Reference 1.7》的情况。 Version 3.07 错误修正：如果需要编辑的目录文件很大，在文本编辑模式下“加减选定区域的页码”、“选定区域自动缩进”功能速度慢到以为是假死。 错误修正：某些zip文件打开有问题。 Version 3.06 错误修正：某些PDF文件编辑目录后不能打开。 Version 3.05 新增功能：在文本编辑界面的工具条上增加“删除空行”按钮。 错误修正：zip/uvz文件路径长度到100多中文字符后，就会打不开。 Version 3.04 错误修正：如果PDF的catalog段中含有00，则PDF目录编辑后存盘失败。 Version 3.03 错误修正：在文本编辑模式下，如果选择“选定区域自动缩进”，则在行首没有数字的情况下，某些特殊中文字符后会自动加入空格。 Version 3.02 错误修正：当正则表达式中含有中文字符时，正则表达式保存出错。 Version 3.01 错误修正：如果zip文件中文件夹名称中含半角中括号，保存PDG目录失败。 Version 3.00 功能修正：“catalog.dat字符编码”从“GB2312/Big5”改为更通用的“GB2312/UTF-8”。 错误修正：在文本编辑界面下，关闭“替换”对话框后，光标位置会改变。 错误修正：如果PDF目录中使用了“Named Destination”，并且Named Destination所指向的Unicode字符不完整，则获取目录时会有问题。 错误修正：如果catalog、pages对象是对象流，则编辑PDF目录后文件打不开。 错误修正：如果PDF目录项指向外部PDF，编辑后可能会出错。 取消ANSI版发行，改为发行Unicode版。 Version 2.04 错误修正：如果FreePic2Pdf_bkmk.txt文件不以\r或\n结尾，则最后一行 目录会被忽略。 错误修正：树形编辑界面下，不能正常读取Unicode编码的FreePic2Pdf_bkmk.txt文件。 错误修正：编辑PDF目录时，如果未选择“展开所有目录”选项，则生成的PDF文件中的多级目录项不符合PDF规范要求，在某些浏览器下阅读可能有问题。 Version 2.03 错误修正：读取PDF目录时，如果目录含特殊字符（如\n），会造成目录截断。 Version 2.02 错误修正：读取PDF目录时，如果目录含特殊字符（如\r），会造成目录截断。 Version 2.01 编辑PDF目录时，去掉对象流检查与限制。 Version 2.00 新增功能：在“PDF选项”中，增加“名称转页码”选项。 功能增强：支持Unicode编码的FreePic2Pdf接口文件。 错误修正：某些PDF中的Unicode编码的“已命名的目标”（Named Destinations）会导致取目录错误。 错误修正：如果同级目录数量过多，会出错退出。 对软件结构进行重构，避免代码分支。 Version 1.11 功能增强：在正则表达式输入对话框中，增加“帮助”按钮。 功能修正：压缩文件密码支持大小写敏感。 英文版缺省界面改为文本编辑界面。 Version 1.10 错误修正：如果原PDF经过旋转、裁剪，编辑目录后页面定位不正确。 Version 1.09 功能增强：对含无效字符的文件路径能够给出提示。 Version 1.08 错误修正：某些DjVu、PDF目录读取错误。 Version 1.07a 错误修正：简体中文版工具条后半部分错位。 Version 1.07 错误修正：在树形界面下编辑BookContents.dat、catalog.dat，附属页面的页码会丢失。 Version 1.06 错误修正：对于PDG目录，某个节点下的同级子节点过多时，会自动往上窜一级。 错误修正：编辑PDF目录后，PdfToy的“文件结构”检查会报错。 Version 1.05 错误修正：某些PDF目录提取不到页码。 Version 1.04 去除最大行数3000行的限制。 加强繁简转换时的纠错能力。 Version 1.03 新增功能：正则表达式输入界面中增加“保存”、“调入”按钮，用于保存、调入自定义表达式。 新增功能：对于PDF目录(Outline)，支持高字节在前的Unicode字符。 新增功能：对于PDF目录，支持Named Action。 新增功能：对于PDF目录，支持到外部PDF的链接。 Version 1.02 错误修正：“自动切分页码”功能不能正确处理负数页码。 错误修正：帮助文件中正则表达式例子结果有误。 错误修正：编辑DjVu目录会产生内存漏洞。 Version 1.01 新增功能：在文本模式中，增加“正则表达式替换”功能，采用微软为VBScript、JavaScript准备的正则表达式引擎，因此语法与ASP、JSP中的正则表达式语法一致。 Version 1.00 功能增强：PDF目录支持Named Destinations，即Acrobat中所称的“已命名的目标”。 错误修正：打开某些非标准目录的PDF时，目录页码显示不出。 Version 0.14 错误修正：文本模式的“全部替换”功能可能造成死循环。 Version 0.13 功能增强：文本模式的“查找”、“替换”功能在搜索到文件尾部或头部时，能够自动折回继续查找。 Version 0.12 功能增强：目录每行的最大长度从1024字节放宽至16KB，以满足某些BT目录。 Version 0.11 错误修正：在给采用Cross-Reference Stream的PDF挂目录后，PDF打不开。 Version 0.10 新增功能：加、减选定区域的页码。 新增功能：支持从资源管理器直接拖拽文件到界面上，代替手工选择文件。 功能增强：处理文本PDG的目录时，XML解析器换成微软的解析器，以支持转义字符。 Version 0.09 错误修正：在给某些PDF加挂目录后，PDF文件打不开。 Version 0.08 错误修正：在树形编辑界面中编辑bookcontents.dat，如果有条目未输入页码，存盘结果有错。 错误修正：打开PDF目录时，如果目录项不是Unicode字符，则会自动截断。 Version 0.07 错误修正：从UnicornViewer启动PdgCntEditor编辑散页PDG的bookcontents.dat，如果文件夹下原来没有bookcontents.dat文件，则不能正常保存。 Version 0.06 错误修正：不能正常打开、保存uvz文件。 Version 0.05 新增功能：支持PDF、DjVu目录编辑。 Version 0.04 新增功能：支持索引页（前缀为ins）。PDG命名规范中有这种页面，但是真正的PDG中基本上不存在这种页面，索引页都算到正文页或附录页中去。现在可以用PdgRenamer命名出这种页面。 Version 0.03 新增功能：“所选区域自动缩进”。用于自动缩进诸如1.1、1.1.1、1.1.2的项目。使用前最好先点“全选”，而且在树形模式下用要比在文本模式下用更快。另外此功能并不能包打天下，必要的人工检查和调整还是需要的。 Version 0.02 新增功能：能够编辑符合FreePic2Pdf接口文件格式的目录文件（FreePic2Pdf_bkmk.txt），并能从DjVuToy、FreePic2Pdf中启动，对 目录文件进行编辑。 新增功能：文本编辑界面中的“自动切分页码”按钮，用来将OCR出来的页码与文字分开，即在行末的数字前面插入一个TAB字符。使用此功能前请先点“全选”或手工选定需要切分的文本行。 功能增强：文本编辑界面中，编辑框支持的内容突破32 KB限制。 Version 0.01 支持bookcontents.dat、catalog.dat、zip。 支持文本、树形、编解码。