Chazeon Talk

如何在本地将 DjVu 转换为 PDF:一次初步尝试

DjVu 是一种常见于互联网的扫描版的电子书分发格式。由于把内容部分和背景部分分开保存,DjVu 格式的电子书能在较小体积的前提下仍然保证内容部分的锐利。线上一些网站将 DjVu 转换为 PDF 之后在锐度严重损失的前提下,体积通常会膨胀数十倍。这些线上工具也并未提供任何可以调整的参数。

在移动设备上进行 DjVu 材料阅读的现状

然而将 DjVu 转换为 PDF 的需求仍然存在,因为在不少系统上围绕 DjVu 搭建的基础设施极为有限。譬如在 iOS 上,许多应用间能够直接传输、导入、阅读、批注 PDF,可以说一整套工具都是围绕着 PDF 搭建的。而反观 DjVu,目前我只找到了一款叫做 BiLibre 的应用,能够一定程度上支持使用 Apple Pencil 批注,这款程序还只是一个 KyBook 的程序的试验田而已,功能比 PDF 阅读器而言可以说还是相当不完善的。

可能由于需求较少,目前也基本没有在本地找到一套完整可控的工具链能完成这一系列操作。

将 DjVu 转换为 PDF

目前探索来看,比较好的一对工具是 DjVuLibre 和 Ghostscript。

DjVuLibre 是个开源的 DjVu 处理包。它提供了一个简易的图形化界面,能够进行简单的 DjVu 阅读。它的一系列命令行工具,能够比较好地进行 DjVu 的制作、解包工作,能把 PDF 以及许多图像格式转换为 DjVu。它同时也提供了编程库,被 SumatraPDF 等阅读器作为 DjVu 底层支持库使用。

Ghostscript 则是老牌的 PostScript 处理程序,同样包括了用于阅读的图形化界面和一系列命令行脚本。这一系列程序被包含在 TeXLive 发行版中。

因此本文提出一种可行的操作,是使用 DjVuLibre 中的 djvups 命令将 DjVu 文件转换为 PostScript 格式,然后使用 Ghostscript 中的 ps2pdf 将 PostScript 格式的文件重新转换为 PDF。这样我们几乎得到了高质量的 PDF 原稿。

命令行操作的伪代码如下

djvups [djvu-file-name] [ps-file-name] [-verbose] [-page='1,3,7-10'] [-..]
ps2pdf [ps-file-name] [pdf-file-name]

要注意的是,如果没有提前将可执行文件的目录添加到 Path 中,两条命令均需要替换为实际的文件路径;Windows 下 ps2pdf 是个 bat 脚本因此要注意把拓展名包含在内,因为有个不含拓展名的文件实际上是个 Bash 脚本。另外在 djvups 中,-verbose 可以显示一个简易的进度条,-page='1,3,7-10' 选择转换的页码,还有后续更详细的设置能调整 PostScript 的分辨率、颜色和灰度等。

文章完成后,经过提醒,我注意到在 superuser 上对于这一过程有一定程度的介绍,可供参考。

压缩 PDF 的体积

可惜的是文件体积膨胀的问题仍没得到很好的解决,甚至可以说远远超出我的想象。原本 37 MB 的 DjVu 文件转换为 PostScript 文件后有 7.7 GB 之大,再次转换为 PDF 之后也有 1.44 GB,体积非常可观。下一步,我们只能看看能否在合理范围内缩减体积,无论是从最后压缩 PDF 还是基于损失 PostScript 文件的前提之下。Adobe Acrobat 将其转换为压缩体积的 PDF 能将体积减小到 242 MB,略小于线上转换出的 343 MB,两者的实际效果相差不大。

如果想要进一步地缩小文件大小,只能尝试一种被称为 ClearScan 的操作,这种优化与压缩的方案在 Adobe 的产品博客上有较为详尽的比较和介绍。这种优化方案简单说就是讲文本部分进行 OCR 处理,并构建一套共享的字体,通过这套共享的字体来优化体积。在 Adobe Acrobat DC Pro 中,这种操作的名字略有变化,选项位置藏在「工具 – 优化扫描的页面 – 文本识别选项 – 编辑 – 输出 – 可编辑的文本和图像」,这可以说是 DjVu 思路的 PDF 压缩方案,把前景的内容和背景分离,效果可以说见仁见智,但总体而言对于原本高分辨率的原稿,效果还是可以接受的。在我的实验之下,最终效果是把前文所述的 343 MB 的文件压缩到 172 MB。但这种操作由于涉及 OCR 的操作,因此耗时比较恐怖,可以考虑睡前进行。

本文提供的方案只是一种可行的本地操作方案而已,多了一种选择,但实际操作上,只能说还是要在体积和质量上做艰难的取舍。