最近,我发现我的曾祖父在 20 世纪初写了两本书:一本关于航海,另一本关于他担任 纽约市消防局长的职业生涯。这些书受众较小,但由于它们是我家族历史的一部分,我想保存每本书的数字副本。但是,我在想,哪种便携式文档格式最适合这项工作?
我一开始就决定不选择 PDF。虽然这种格式适合印刷前的检查,但似乎注定要不断地增加功能,而且它生成的文件难以检查和编辑。我想要一种更智能的格式,具有类似的功能。我想到了两种:漫画书归档和 DjVu。
漫画书归档
漫画书归档是一种简单的格式,顾名思义,最常用于漫画书。你可以在 Comic Book Plus 和 The Digital Comic Museum 等网站上看到漫画书归档的示例。
漫画书归档的最大特点也是其最弱之处:它太简单了,几乎更像是一种约定,而不是一种格式。事实上,漫画书归档只是一个 ZIP、TAR、7Z 或 RAR 归档文件,分别赋予扩展名 .cbz、.cbt、.cb7 或 .cbr。它没有存储元数据的标准。
然而,它们非常容易创建。
创建漫画书归档
- 创建一个包含图像文件的目录,并重命名这些图像,使它们具有固有的顺序
$ n=0 && for i in *.png ; do mv $i `printf %04d $n`.png ; ((n+=1)); done
- 使用你喜欢的归档工具归档这些文件。根据我的经验,CBZ 是最受支持的。
$ zip comicbook.zip -r *.png
- 最后,使用适当的扩展名重命名该文件。
$ mv comicbook.zip comicbook.cbz
生成的文件应该可以在你的大多数设备上打开。在 Linux 上,Evince 和 Okular 都可以打开 CBZ 文件。在 Android 上,文档查看器 和 Bubble 可以打开它们。
解压缩漫画书归档
从漫画书归档中取回数据也很容易:只需解压缩 CBZ 文件即可。
由于你最喜欢的归档工具可能无法将 .cbz 扩展名识别为有效的归档文件,因此最好将其重命名回其本机扩展名
$ mv comicbook.cbz comicbook.zip
$ unzip comicbook.zip
DjVu
AT&T 在 20 多年前开发的一种更高级的格式是 DjVu(发音为 "déjà vu")。它是一种具有先进压缩技术的数字文档格式,并且可以在比你可能意识到的更多的应用程序中查看,包括 Evince、Okular、在线 DjVu.js、DjVu.js 查看器 Firefox 扩展、GNU Emacs、Android 上的 文档查看器,以及 Sourceforge 上的开源、跨平台 DjView 查看器。
你可以在 djvu.org 上阅读更多关于 DjVu 的信息并找到示例 .djvu 文件。
DjVu 具有几个吸引人的功能,包括图像压缩、轮廓(书签)结构以及对嵌入文本的支持。使用免费和开源工具可以很容易地检查和编辑它。
安装 DjVu
开源工具链是 DjVuLibre,你可以在你的发行版的软件仓库中找到它。例如,在 Fedora 上
$ sudo dnf install djvulibre
创建 DjVu 文件
.djvu 是一个已经被编码为 DjVu 文件的图像。.djvu 可以包含一个或多个图像(存储为“页面”)。
要手动生成 DjVu,你可以使用两种编码器之一:c44 用于高质量图像,cjb2 用于简单的双色调图像。每个编码器接受不同的图像格式:c44 可以处理 .pnm 或 .jpeg 文件,而 cjb2 可以处理 .pbm 或 .tiff 图像。
如果你需要预处理图像,你可以使用 Image Magick 在终端中执行此操作,使用 -density 选项来定义你所需的图像分辨率
$ convert -density 200 foo.png foo.pnm
然后你可以将它转换为 DjVu
$ c44 -dpi 200 foo.pnm foo.djvu
如果你的图像很简单,比如白色页面上的黑色文本,你可以尝试使用更简单的编码器将其转换。如果需要,首先使用 Image Magick 将其转换为兼容的中间格式
$ convert -density 200 foo.png foo.pbm
然后将其转换为 DjVu
$ cjb2 -dpi 200 foo.pbm foo.djvu
你现在有了一个简单的、单页的 .djvu 文档。
创建多页 DjVu 文件
虽然单页 DjVu 可能有用,但考虑到 DjVu 有时出色的压缩率,它最常被用作多页格式。
假设你有一个包含许多 .djvu 文件的目录,你可以使用 djvm 命令将它们捆绑在一起
$ djvm -c pg_1.djvu two.djvu 003.djvu mybook.djvu
与 CBZ 归档不同,捆绑图像的名称对其在 DjVu 文档中的顺序没有影响,而是保留你在命令中提供的顺序。如果你有先见之明,以自然的排序顺序(001.djvu、002.djvu、003.djvu、004.djvu 等)命名它们,你可以使用通配符
$ djvm -c *.djvu mybook.djvu
操作 DjVu 文档
使用 djvm 编辑 DjVu 文档很容易。例如,你可以将页面插入到现有的 DjVu 文档中
$ djvm -i mybook.djvu newpage.djvu 2
在本例中,页面 *newpage.*_djvu_ 成为文件 *_mybook_*_._djvu 中的新第 2 页。
你也可以删除页面。例如,从 *mybook.djvu* 中删除第 4 页
$ djvm -d mybook.djvu 4
设置轮廓
你可以向 DjVu 文件添加元数据,例如轮廓(通常称为“书签”)。要手动执行此操作,请创建一个包含文档轮廓的纯文本文件。DjVu 轮廓以类似于 Lisp 的结构表示,以开头的 bookmarks 元素开头,后跟书签名和页码
(bookmarks
("Front cover" "#1")
("Chapter 1" "#3")
("Chapter 2" "#18")
("Chapter 3" "#26")
)
括号定义轮廓中的级别。轮廓目前只有顶层书签,但任何部分都可以通过延迟其结束括号来拥有一个子部分。例如,要向第 1 章添加一个子部分
(bookmarks
("Front cover" "#1")
("Chapter 1" "#3"
("Section 1" "#6"))
("Chapter 2" "#18")
("Chapter 3" "#26")
)
轮廓完成后,保存该文件并使用 djvused 命令将其应用于你的 DjVu 文件
$ djvused -e 'set-outline outline.txt' -s mybook.djvu
打开 DjVu 文件以查看轮廓。

嵌入文本
如果你想存储你正在创建的文档的文本,你可以将文本元素(在 djvused 术语中为“隐藏文本”)嵌入到你的 DjVu 文件中,以便 Okular 或 DjView 等应用程序可以选择文本并将其复制到用户的剪贴板。
这是一个复杂的操作,因为为了嵌入文本,你必须首先拥有文本。如果你可以访问一个好的 OCR 应用程序(或者有时间和决心来转录印刷页面),你可能拥有该数据,但然后你必须将文本映射到位图图像。
一旦你有了文本和每一行(或者,如果你喜欢,每个单词)的坐标,你可以编写一个 djvused 脚本,其中包含每个页面的块
select; remove-ant; remove-txt
# -------------------------
select "p0004.djvu" # page 4
set-txt
(page 0 0 2550 3300
(line 1661 2337 2235 2369 "Fires and Fire-fighters")
(line 1761 2337 2235 2369 "by John Kenlon"))
.
# -------------------------
select "p0005.djvu" # page 5
set-txt
(page 0 0 2550 3300
(line 294 2602 1206 2642 "Some more text here, blah blah blah."))
每一行的整数表示每一行 X 和 Y 坐标的最小值和最大值(**xmin**、**ymin**、**xmax**、**ymax**)。每一行都是一个以像素为单位测量的矩形,原点位于页面的 *左下角*。
你可以将嵌入的文本元素定义为单词、行和超链接,并且可以使用矩形以外的形状映射复杂的区域。你还可以嵌入专门定义的元数据,例如以小写字母表示的 BibTex 键(年份、书名、编辑、作者等)和借用自 PDF 规范的 DocInfo 键,始终以大写字母开头(标题、作者、主题、创建者、制作、创建日期、修改日期等)。
自动化 DjVu 创建
虽然能够手工制作一个精细的 DjVu 文档很好,但如果你将 DjVu 作为日常格式采用,你会注意到你的应用程序缺少一些在更普遍的 PDF 中可用的便利功能。例如,很少(如果有)应用程序提供方便的 *打印到 DjVu* 或 *导出到 DjVu* 选项,就像它们对 PDF 所做的那样。
但是,你仍然可以通过将 PDF 作为中间格式来使用 DjVu。
不幸的是,轻松、自动地进行 DjVu 转换所需的库是在 CPL 下获得许可的,CPL 具有 GPL 代码无法满足的要求。因此,它不能作为编译库分发,但你可以自由地自行编译它。
由于 DjVuLibre 团队提供了一个出色的构建脚本,因此该过程相对简单。
- 首先,使用软件开发工具准备你的系统。在 Fedora 上,快速简便的方法是使用 DNF 组
$ sudo dnf group install @c-development
在 Ubuntu 上
$ sudo apt-get install build-essential
- 接下来,从 Sourceforge 下载 **GSDjVu** 源代码。务必下载 **GSDjVu**,而不是 **DjVuLibre**(换句话说,不要点击文件列表顶部的大的绿色按钮,而是点击最新的文件)。
- 解压缩你刚刚下载的文件,然后将目录更改为该文件
$ cd ~/Downloads $ tar xvf gsdjvu-X.YY.tar.gz $ cd gsdjvu-X.YY
- 创建一个名为 **BUILD** 的目录。它必须被称为 **BUILD**,所以压制你的创造力
$ mkdir BUILD $ cd BUILD
- 下载构建 **GSDjVu** 应用程序所需的其他源程序包。具体来说,你必须下载 **Ghostscript** 的源代码(你几乎肯定已经安装了它,但你需要它的源代码才能进行构建)。此外,你的系统必须具有 **jpeg**、**libpng**、**openjpeg** 和 **zlib** 的源程序包。如果你认为你的系统已经拥有这些项目的源程序包,你可以运行构建脚本;如果找不到源文件,脚本将失败,并让你在再次尝试之前纠正错误。
- 运行下载中包含的交互式 **build-gsdjvu** 构建脚本。此脚本解压缩源文件,使用 **gdevdjvu** 驱动程序修补 Ghostscript,编译 Ghostscript,并从构建结果中删除不必要的文件。
- 你可以将 **GSDjVu** 安装在你路径中的任何位置。如果你不知道你的 **PATH** 变量是什么,你可以使用 **echo $PATH** 查看它。例如,要将其安装到 **/usr/local** 前缀中
$ sudo cp -r BUILD/INST/gsdjvu /usr/local/lib64 $ cd /usr/local/bin $ sudo ln -s ../lib64/gsdjvu/gsdjvu gsdjvu
将 PDF 转换为 DjVu
现在你已经构建了 Ghostscript 驱动程序,将 PDF 转换为 DjVu 只需要一个命令
$ djvudigital --words mydocument.pdf mydocument.djvu
这会将 PDF 中的所有页面、书签和嵌入文本转换为 DjVu 文件。--words
选项将所有映射的嵌入 PDF 文本映射到 DjVu 文件中的相应点。如果没有嵌入 PDF,则不会传递任何嵌入文本。 使用此工具,您可以从应用程序中使用方便的 PDF 功能,并最终得到 DjVu 文件。
为什么要使用 DjVu 和 CBZ?
DjVu 和漫画书归档格式是您档案库的绝佳补充文档格式。 将一系列图像塞进 PostScript 格式(如 PDF)或明显主要用于文本的格式(如 EPUB)似乎很愚蠢,因此拥有 CBZ 和 DjVu 作为附加选项很不错。 它们可能不适合您的所有文档,但最好熟悉它们,以便在最有意义时使用。
10 条评论