CBZ 和 DjVu:PDF 的开源替代方案

停止使用 PDF,尝试这两种智能数字存档格式。
230 位读者喜欢这篇文章。
stack of books

Flickr,CC BY 2.0,Jen Wike Huger 修改

最近,我发现我的曾祖父在 20 世纪初写了两本书:一本关于航海,另一本关于他担任纽约市消防局局长的职业生涯。 这些书的受众很小众,但由于它们是我家族历史的一部分,我想为每本书保留一份数字副本。 但是,我想知道,哪种便携式文档格式最适合这项工作呢?

我一开始就决定 PDF 不是一个选项。 这种格式虽然适合印刷前的准备,但似乎注定要不断地增加功能,并且它生成的文件难以检查和编辑。 我想要一种具有类似功能的更智能的格式。 我想到了两种:漫画书存档和 DjVu。

漫画书存档

漫画书存档 是一种简单的格式,顾名思义,最常用于漫画书。 您可以在 Comic Book PlusThe Digital Comic Museum 等网站上看到漫画书存档的示例。

漫画书存档的最大特点也是其最薄弱之处:它太简单了,几乎更像是一种约定俗成的习惯,而不是一种格式。 实际上,漫画书存档只是一个 ZIP、TAR、7Z 或 RAR 存档,分别被赋予了 .cbz、.cbt、.cb7 或 .cbr 扩展名。 它没有存储元数据的标准。

然而,它们非常容易创建。

创建漫画书存档

  1. 创建一个包含图像文件的目录,并重命名图像,使其具有固有的顺序
    $ n=0 && for i in *.png ; do mv $i `printf %04d $n`.png ; ((n+=1)); done
  1. 使用您最喜欢的存档工具存档这些文件。 以我的经验来看,CBZ 的支持最好。
    $ zip comicbook.zip -r *.png
  1. 最后,使用适当的扩展名重命名文件。
    $ mv comicbook.zip comicbook.cbz

生成的文件应该可以在您的大多数设备上打开。 在 Linux 上,EvinceOkular 都可以打开 CBZ 文件。 在 Android 上,Document ViewerBubble 可以打开它们。

解压缩漫画书存档

将您的数据从漫画书存档中取回也很容易:只需解压缩 CBZ 文件即可。

由于您最喜欢的存档工具可能无法将 .cbz 扩展名识别为有效的存档,因此最好将其重命名回其原生扩展名

$ mv comicbook.cbz comicbook.zip
$ unzip comicbook.zip

DjVu

一种更高级的格式,由 AT&T 在 20 多年前开发,是 DjVu(发音为“déjà vu”)。 它是一种数字文档格式,具有先进的压缩技术,并且比您可能意识到的更多应用程序可以查看它,包括 EvinceOkularDjVu.js 在线版、DjVu.js viewer Firefox 扩展、GNU Emacs、Android 上的 Document Viewer,以及 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 文件以查看大纲。

A DjVu with an outline as viewed in Okular

嵌入文本

如果您想存储您正在创建的文档的文本,您可以将文本元素(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 键(以小写形式表示,如 year、booktitle、editor、author 等)和 DocInfo 键(借用自 PDF 规范,始终以大写字母开头,如 Title、Author、Subject、Creator、Produced、CreationDate、ModDate 等)。

自动化 DjVu 创建

虽然能够手工制作精细的 DjVu 文档很不错,但如果您将 DjVu 作为日常格式使用,您会注意到您的应用程序缺少更普及的 PDF 中可用的一些便利功能。 例如,很少有(如果有的话)应用程序提供方便的打印到 DjVu导出到 DjVu 选项,就像它们对 PDF 所做的那样。

但是,您仍然可以通过利用 PDF 作为中间格式来使用 DjVu。

不幸的是,轻松、自动化 DjVu 转换所需的库是在 CPL 下获得许可的,CPL 的要求 GPL 代码无法满足工具链中的要求。 因此,它不能作为编译库分发,但您可以自由地自行编译它。

由于 DjVuLibre 团队提供的出色构建脚本,该过程相对简单。

  1. 首先,使用软件开发工具准备您的系统。 在 Fedora 上,快速简便的方法是使用 DNF 组
    $ sudo dnf group install @c-development

    在 Ubuntu 上

    $ sudo apt-get install build-essential
  1. 接下来,从 Sourceforge 下载 GSDjVu 源代码。 务必下载 GSDjVu,而不是 DjVuLibre(换句话说,不要单击文件列表顶部的绿色大按钮,而是单击最新的文件)。
  1. 解压缩您刚刚下载的文件,并将目录更改为它
    $ cd ~/Downloads
    $ tar xvf gsdjvu-X.YY.tar.gz
    $ cd gsdjvu-X.YY
  1. 创建一个名为 BUILD 的目录。 它必须被称为 BUILD,所以请抑制您的创造力
    $ mkdir BUILD
    $ cd BUILD
  1. 下载构建 GSDjVu 应用程序所需的其他源代码包。 具体来说,您必须下载 Ghostscript 的源代码(您几乎肯定已经安装了它,但您需要它的源代码才能针对它进行构建)。 此外,您的系统必须具有 jpeglibpngopenjpegzlib 的源代码包。 如果您认为您的系统已经拥有这些项目的源代码包,您可以运行构建脚本; 如果找不到源代码,脚本将失败,并让您在再次尝试之前纠正错误。
  1. 运行下载中包含的交互式 build-gsdjvu 构建脚本。 此脚本解压缩源文件,使用 gdevdjvu 驱动程序修补 Ghostscript,编译 Ghostscript,并从构建结果中删除不必要的文件。
  1. 您可以将 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 作为附加选项是很好的。 它们可能不适合您的所有文档,但最好熟悉它们,以便您可以在最合理的情况下使用它们。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算机行业工作,通常同时从事这两个行业。

10 条评论

谢谢你重新讲解 DjVu,Seth。 我已经有一段时间没有使用它了,我忘记了像 djvum 和 djvused 这样的实用程序。

我没有看到这些格式比 PDF 或其他方法有任何明显的优势。 我可以从 PDF 和 ePub 中获得我需要的东西,以及保存原始信息。

这取决于用例。

对于某些存档项目,我没有原始文本信息(除非我添加 OCR 步骤,但我没有)。 将一系列图像放入 PDF 对我来说似乎很愚蠢,因为在我看来,PDF 最适合作为 PostScript 数据而不是栅格图像(而且我也不喜欢 PDF 工具链)。 Epub 是一种很棒的格式,但我觉得它不适合作为捆绑图像的方式。

所以 DjVu 似乎是我在这种情况下所做事情的合理选择。

我很高兴使用 Epubs (https://open-source.net.cn/education/15/11/ebook-open-formats , http://www.lulu.com/shop/opensourcecom/open-source-video-editing-for-be…) 在适当的时候,它是我阅读电子书时首选的格式。

但在某些情况下,我真正需要的是一种高效、可添加书签的格式,用于大量相关的图像。 对于这一点,DjVu 非常棒(并且它的工具链令人耳目一新地合理)。

当我想使用更简单的东西时,CBZ 是一个额外的选择。

回复 ,作者:Greg P

我注意到的一件事是 zip 在图像压缩方面效率不高。 例如,对图像目录运行 zip,zip 告诉我每个文件仅减少了 1%。 如果我对目录运行“du -h”,它是 17MB,zip 文件的大小是 16.62MB。

回复 ,作者:sethkenlon

有趣的是,您复制粘贴了 Greg 的评论的一部分和我评论的一部分来构建一个新评论,但感谢您的评论!

回复 ,作者:Cynthia3

你甚至测试过你的命令吗?

$ n=0 && for i in *.png ; do mv $i `printf %04d $n`.png ; done

这将 mv 所有文件到一个名为 0000.png 的文件!!! 最后一个移动的文件将是 0000.png,所有其他文件都将丢失。 希望您和/或您的读者有备份。

这更正确,但如果您能更好地解释读者程序中真正发生的事情,那将会有所帮助。

$ n=0 && for i in *.png ; do echo mv "$i" "${i/.png/}$(printf %04d $n).png" ;((n++)); done

当然,当您知道它是正确的时候,请删除 echo。

为了其他读者的利益,如果我没有弄错,漫画查看器的顺序将与一组文件的普通 $(ls) 相同。

感谢您指出这一点。 从终端复制/粘贴以及所有编辑以获得 HTML 的合理格式的过程中,丢失了一些东西。

已为未来的读者修复。

回复 ,作者:Andrew McGlashan (未验证)

发现错别字

命令
$ sudo dnf install dvjulibre

必须是
$ sudo dnf install djvulibre

© . All rights reserved.