将电子书转换为开放格式
数字格式的书籍,也称为电子书,可以在缺乏处理能力和屏幕空间来运行常规 Web 浏览器的设备上阅读。一些出版商,更不用说像古腾堡计划这样的项目,已经提供了成千上万种新旧数字格式的书籍。问题在于硬件(无论是通用 PDA 还是专用设备)以及整个电子书出版行业都比 PC 和 Web 浏览器更加分散。因此,您最近购买的电子书很可能在十年后甚至明天都无法阅读,如果您决定使用笔记本电脑或更换 PDA 的话。为了帮助对抗这种碎片化,本文讨论了一些现有的命令行工具,可以将最流行的电子书格式转换为 ASCII 或 HTML。
实际上,现在几乎没有工具可以将电子书格式导出为 PDF 或 OpenDocument(OpenOffice.org 中使用的新 OASIS 标准),但这不一定是件大事。一旦文本采用 ASCII 或 HTML 格式,就可以使用诸如 w3m 之类的文本浏览器或诸如 html2ps 之类的程序轻松地将其移动到纯文本或 PDF 格式。如果您选择这种转换途径,您今天就可以做到,而且由于它是开放格式,20 年后也可以做到。
在 PalmOS 上,最初也是最常见的电子书格式是 PalmDoc,也称为 AportisDoc 或简称为 Doc,即使它与 Microsoft Word 的 .doc 格式无关。Doc,可通过扩展名 .pdb(Palm 数据库)或 .prc(Palm 资源代码)识别,基本上是一个由串在一起的记录组成的 PalmPilot 数据库。此标准衍生出几种变体,包括 MobiPocket,它在基本格式中添加了嵌入式 HTML 标记。
每本 Palm 电子书都分为三个部分:标头、一系列文本记录和一系列书签记录。通常,标头宽度为 16 字节。一些 Doc 阅读器可能会在运行时扩展宽度以容纳额外的自定义信息。默认情况下,标头包含诸如未压缩文本的总长度、文档中当前查看的位置以及一个由双字节无符号整数组成的数组,给出每个文本记录的未压缩大小。通常,此类记录的最大大小为 4,096 字节,并且每个记录都是单独压缩的。
书签记录由一个 16 字节的名称和一个距文本开头的 4 字节偏移量组成。由于书签是可选的,因此许多 Doc 电子书不包含书签,并且大多数 Doc 阅读器都支持替代的(即不可移植的)方法来指定它们。其他特定于阅读器的扩展可能包括类别、版本号和电子书之间的链接。几乎总是,此信息存储在 .pdb 或 .rc 文件之外。因此,在转换电子书时,您不应期望保留此类数据。
Pyrite Publisher,以前称为 Doc Toolkit,是一套用于 Palm 平台的内容转换工具。目前,仅可以转换某些文本格式,但可以通过 Python 插件扩展功能以支持新格式。Pyrite Publisher 可以直接从 Web 下载要转换的文档;它也可以直接将设置的书签下载到输出数据库。该软件包需要 Python 2.1 或更高版本,可以从命令行或通过基于 wxWindows 的 GUI 使用。该软件以源代码和二进制格式提供,适用于 Linux 和 Windows。如果您选择后一个选项,请记住编译版本期望 Python 位于 /usr 中。Linux 版本可以使用 JPilot 或 pilot-link 将转换后的文件直接安装到 PDA。
Pyrite 在 Fedora Core 2 上安装和运行完美无缺。但是,与下面介绍的其他命令行转换器不同,Pyrite 只能以 ASCII 格式保存,而不能以 HTML 格式保存。可执行文件的名称是 pyrpub。用于转换 .pdb 文件的确切命令使用以下语法
pyrpub -P TextOutput -o don_quixote.txt \ Don_Quixote.pdb
如果您只想快速索引数字图书馆,Pyrite 就足够了。另一方面,重新格式化结果使其在浏览器中更具可读性几乎是微不足道的。清单 1 中的 Perl 代码片段虽然有些丑陋,但足以生成图 1 中显示的 唐吉诃德 版本。
清单 1. 一个简单的 Perl 脚本将 Pyrite 提取的文本转换为 HTML。
#! /usr/bin/perl undef $/; $TEXT = <>; $TEXT =~ s/\n\n/<p>/gm; print <<END_HTML; <html><body> $TEXT </body></html> END_HTML
该脚本加载先前使用 Publisher 生成的整个 ASCII 文本,并且每次它连续找到两个换行符时,它都会将它们替换为 HTML 段落标记。然后将结果打印到标准输出并正确格式化为基本 HTML。要更改对齐方式、字体和颜色,您只需将您最喜欢的样式表粘贴到<html><body>行之后即可。
预计于 2005 年春季发布的 OpenOffice.org 2.0 将能够以 .pdb 格式保存文本。如果它也能够读取此类文件,其批量转换功能(文件→自动导航器→文档转换器)将很好地解决问题。我曾尝试使用 1.9.m65 预览版执行此操作,但得到的只是一个常规输入/输出错误弹出消息。希望此功能将添加到未来版本中。
Pyrite Publisher 主要设计用于从普通 HTML 或文本文件转换到 Palm 平台,而不是反过来。上面讨论的过程实际上无法扩展到诸如将大量 Palm 电子书转换为自定义 HTML(包括超链接和元数据)之类的场景。在这种情况下,最好的解决方案可能是将此语言的标准 XML 或 HTML 模块与 P5-Palm 捆绑包结合使用的 Perl 脚本;这些可以从综合 Perl 档案网络 (CPAN) 获得(请参阅在线资源)。P5-Palm 模块集包括用于读取、处理和写入 PalmOS 设备使用的 .pdb 和 .prc 数据库文件的类。
RocketBook 电子书有几个有趣的特性,包括支持压缩 HTML 文件和包含段落格式摘要以及锚名称位置的索引。在线资源中列出的 RB 格式页面中解释了有关 .rb 文件内部结构的这些以及更多详细信息。Rbmake Rocket Ebook 和 Mobipocket 文件可以使用一组名为 Rbmake 的命令行工具进行反汇编。其主页提供源代码、二进制软件包、邮件列表和联系信息以报告错误。要使用 rbmake,您需要 libxml2,版本 2.3.1 或更高版本;pcre(Perl 兼容正则表达式)库;以及 zlib,用于处理压缩。要从源代码编译(至少在 Fedora Core 2 上),还需要单独安装 pcre-devel 软件包。
Rbmake 的一个优点是源代码以模块化方式结构化。可以编译整个面向对象的 C 例程库,并将其与包的其余部分独立链接,以用于处理 .rb 文件的任何其他程序。这样,如果您想编写自己的超自定义 Rocket Ebook 转换器,或者只是将所有电子书索引到数据库中,您只需要使用实际知道如何读取和写入 .rb 格式的那部分代码,即 RbFile 类。此代码块打开文件,返回组成书本的各节列表,并动态解压缩主程序实际需要的那些节。如果您需要,该库还包括通过 Perl 兼容正则表达式匹配和替换内容部分的功能。
Rbmake 工具应该可以在任何现代 GNU/Linux 发行版上快速且无问题地编译。源代码 tarball 中还包含详尽的 HTML 文档。能够生成 HTML 文件的二进制文件称为 rbburst。它提取原始 .rb 容器中存在的所有组件(文本、图像和信息文件)。图 2 在两个单独的 Mozilla 窗口中显示了 rbburst 在 H. G. Wells 的 隐形人 上运行时生成的文件封面页和目录。
Microsoft 的 Reader 文件,可通过 .lit 扩展名识别,具有传统书籍的许多特性,包括分页、突出显示和注释。它们还支持关键字搜索和超链接,但它们被锁定到一个阅读器平台。
用于转换这些文件的工具简称为 Convert Lit。根据 UNIX 传统,使用 -help 选项运行该程序会列出所有可用的命令行选项。此程序有三种操作模式:爆炸、降级转换和铭刻。爆炸是将现有 .lit 文件转换为符合 OEBPS 标准的软件包所需的模式。OEBPS(开放电子书出版结构)将在本文后面介绍。
图 3 显示了使用 Convert Lit 程序的爆炸功能获得的莎士比亚 仲夏夜之梦 版本。降级转换是相反的过程;它生成一个 .lit 文件,供 Microsoft Reader 兼容设备使用。铭刻是指降级转换将用户定义的标签附加到 .lit 文件。程序的首页(请参阅资源)上解释了确切的语法。
我们已经提到 Convert Lit 创建了一个由不同文件组成的 OEBPS 包。以下是上面示例的完整列表:Contents.htm、copyright.html、~cov0024.htm、cover.jpg、MidSummerNightDream.opf、MobMids.html、PCcover.jpg、PCthumb.jpg、stylesheet.css 和 thumb.jpg。HTML、CSS 和 JPG 文件是可以预料的,但 .opf 文件是什么?它是一个 XML 容器,描述了原始书籍的结构和几个部分的元数据。扩展名 OPF 代表开放电子书包格式。OPF 文件包含对电子书其他部分的引用,以及对其属性的描述。为了更清楚地了解其作用,清单 2 中显示了 MidSummerNightDream.opf 的简短摘录。
清单 2. OPF 是一种基于 XML 的书籍属性格式。
<dc:Title>A Midsummer-Night's Dream</dc:Title> <dc:Creator role="aut" file-as="Shakespeare, William, 1564-1616"> William Shakespeare, 1564-1616 </dc:Creator> <dc:Description>fiction, poetry</dc:Description>
这的实际结果是,即使您想将所有藏书都保留为专有格式,Convert Lit 也可能很有用。您仍然可以在所有 .lit 电子书上运行该程序,并删除除 .opf 文件以外的所有内容。然后,任何快速脚本或成熟的 XML 解析实用程序都可以扫描它们并将所有内容索引到您选择的数据库中。
Convert Lit 还从使用旧 DRM1 版本的电子书文件中删除数字版权管理 (DRM) 感染。如果您有 Microsoft Reader 电子书,您可能拥有 Microsoft Windows 系统和 Microsoft Reader 的许可副本。根据 Convert Lit 网站,您可以在 Windows 上构建和运行 Convert Lit,首先使用 Windows DRM 库将新的 DRM5 电子书转换为 DRM1。
总的来说,我们在本文中仅讨论了命令行处理。但是,如果您有大量不同格式的电子书,则可以使用简单的 shell 脚本一次性转换它们。正如我们已经展示的那样,一旦文本采用 ASCII 或 HTML 格式,可能性是无限的。您可以在循环中添加一两行以使用glimpse或ht::dig进行索引,将所有内容打印到一本 PostScript 书籍中等等。
将电子书(至少是您在不久的将来能够获得的电子书)放入开放格式的解决方案正在制定中。它是开放电子书出版结构 (OEBPS)。其目标是提供基于现有开放标准的基于 XML 的规范,以便为多个电子书平台提供内容。OEBPS 已达到 1.2 版本,由开放电子书论坛维护,该论坛由 85 多个组织(硬件和软件公司、出版商、作者和用户)组成,这些组织参与电子出版。OEBPS 本身不直接处理 DRM。但是,OeBF 权利和规则工作组正在研究这些问题,“以便为电子出版社区提供一套一致且相互支持的规范”。时间会证明会发生什么。
无论如何,构建 OEBPS 的开放标准已经确立。除了 XML 之外,还表示了 Unicode、XHTML 以及 CSS1 和 CSS2 规范的选定部分。Unicode 是一系列编码,使计算机能够毫无歧义地处理数万个字符。XHTML 是 HTML 4 作为 XML 的重新表述。简而言之,OEBPS 可以被描述为只不过是 XHTML 的电子书优化扩展——当某些公司倒闭时不会消失的东西。图形可以是 PNG 或 JPEG 格式。元数据,包括作者、标题、ISBN 等,将通过都柏林核心词汇表进行管理。
OEBPS 有潜力保存您的所有电子书,并确保如果您下载或购买的电子书,即使任何硬件或软件公司倒闭,您的藏书仍将可用。但是,应用于这些“开放”电子书之上的 DRM 方案仍然可能将您的内容锁定到一个供应商。只要您可以获得没有 DRM 的 OEBPS 电子书,OEBPS 就是保证即使所有当前的电子书硬件都消失了,您的藏书仍将保持可用的最佳方式。
本文资源: /article/8208。
Marco Fioretti 是一位硬件系统工程师,对作为 EDA 平台的自由软件以及作为 RULE 项目的现任负责人,对高效桌面感兴趣。Marco 与他的家人住在意大利罗马。