将DJVU转换为PDF

我想将一个DJVU文档转换成PDF文档,同时分离并保留文本层和图像,并且保持来自DJVU的结构。在Ubuntu上如何做到这一点?
(然后我将使用Calibre将其转换为ePub/Mobi,所以如果有一个Calibre插件可以完成整个过程,那对我来说就太完美了!)
注意1:从Evince打印、从DJview导出或使用ddjvu软件包等任何方法都不是理想的解决方案,因为它们会丢弃文本层,只保存图像。
注意2:使用DJVULibre似乎只能提取文本层,而无法提取图片。同样,手动复制文本会丢失文档结构和图片。

就这个问题而言,我在这里为ddjvu提交了一个功能请求:https://sourceforge.net/p/djvu/feature-requests/98/。 - Nathaniel M. Beaver
7个回答

方法一

简单地使用DJView并导出为PDF

  1. 打开Synaptic软件包管理器
  2. 安装DJview4
  3. 运行DJview(应用程序 - 图形 - DJView4)
  4. 打开您的.djvu文档
  5. 菜单 - 导出为:PDF

方法二

在evince中打开djvu文件
选择打印 ----> 打印到文件
将.ps更改为.pdf,然后点击打印

方法三

  1. 打开Synaptic软件包管理器。
  2. 安装djvulibre-bin libdjvulibre21 okular-extra-backends evince libevdocument3 libevview3。
  3. 打开终端并输入sudo apt-get install libtiff-tools。
  4. 进入存放djvu文件的目录。点击鼠标右键,选择“在终端中打开”选项。点击后将会打开一个终端窗口。
  5. 在该终端中输入ddjvu -format=tiff 文件名.djvu 文件名.tiff和tiff2pdf -j -o 文件名.pdf 文件名.tiff。

方法四

还有一个在线转换工具DjVu到PDF转换器


@Ashu 你确定这个能取回图片吗? - hayd
是的,方法1和2对我有效。我没有尝试过第3和第4个方法。 - Ashu
@Ashu 这是提取图片还是简单地复制整个页面?(这样说通吗?) - hayd
你尝试过任何方法吗?试一下,看看是否有效。 - Ashu
2它无法检索图片或文本。 - hayd
2关于“方法2”:将扩展名从.ps更改为.pdf并不会改变任何东西,Evince仍然会生成相同的Postscript文件(在Ubuntu 17.10上进行了测试)。 - Alexey
1文本层在方法1中丢失了(我想其他方法也是如此)。 - Alexey
这里的方法一会生成一个比原始的DJVU文件大80倍的PDF文件......而且是空的。 - robertspierre

这里有一种方法,需要一些不太常见的工具:
  1. ocrodjvu
  2. pdfbeads,它有自己的要求,可以通过谷歌找到
我们可以使用djvu2hocr命令(来自ocrodjvu软件包)从DjVu文件中提取隐藏的文本层(它不执行任何OCR或类似操作,只是提取带有几何信息的文本层),例如: djvu2hocr -p 10 sample.djvu | sed 's/ocrx/ocr/g' > pg10.html sed命令在输出的hOCR文件(一个简单的HTML文件)中更正了类名。
现在我们将DjVu页面提取为TIFF格式: ddjvu -format=tiff -page=10 sample.djvu pg10.tif 这样我们就在工作文件夹中得到了这些文件。
sample.djvu
pg10.html
pg10.tif

这就是 pdfbeads 的用武之地,我们只需执行以下命令:

pdfbeads -o pg10.pdf

然后这个巧妙的程序会处理该文件夹中的所有内容(具有相同基本名称的HTML和TIFF文件),并生成输出PDF文件以及一些副产品:

sample.djvu
pg10.html
pg10.tif
pg10.jbig2
pg10.pdf
pg10.sym

与输入的 DjVu 文件完全相同,并且内部包含文本图层:

enter image description here

评论摘要: 下面的长篇评论讨论了将DjVu文档页面中的较小图像表示为单独的对象,这在实际上并不容易实现,因为DjVu文档页面本身只是一个带有可选文本层的单个图像,并没有关于较小图像作为单独对象的“信息”。如果DjVu文档包含彩色图像,则它们通常会放置在背景层上;在这种情况下,用户可以利用诸如ddjvu(仅提取背景层)和imagemagick(自动裁剪)之类的工具,仅输出图像而不是整个画布,但无法自动化生成PDF输出。
另一种更合理但速度较慢的方法是使用常规OCR GUI工具。建议在Linux PC上使用gscan2pdf(> 1.0)作为可能的候选工具。

我的理解是,这个功能并不能提取单独的图片数据,只能提取整个页面的图像。 - hayd
当你提到DjVu文件结构中的“个别图片数据”,你指的是什么意思? - zetah
无论它是否能够从文档中裁剪出图片,并将其作为较小的图像放置在PDF文件的顶部(例如,以便可以导出为HTML)。 - hayd
在DjVu文件结构中没有这样的定义。原始DjVu文档中的上述示例图像与字符图像一起被“放置”在前景层/蒙版上,并且有一个单独的文本层,如所解释的那样进行提取。如果DjVu文档具有彩色图像,则它们将被放置在整个页面的背景层上(在常见的复合DjVu文件中)。虽然可以理解您可能期望DjVu文档页面中的图像是单独的对象,但事实并非如此-将DjVu文档页面视为带有可选文本层的单个图像,基本上就是这样。 - zetah
如果我理解正确的话,你并不需要将整座山都移动到Calibre自动化。EPUB文件只是带有额外XML索引模板的压缩XHTML文件。我想如果你投入时间,并为hOCR页面制作XSLT至XHTML,你可以得到更好的结果。如果你的源DjVu文档由彩色图像组成,那么你可以使用ddjvu来仅提取背景层,并用imagemagick自动裁剪图像。 - zetah
1@zetah-你在评论中提供的额外信息应该真正添加到答案中,因为它提供了有关图片放置在结构中以及在提取时可能期望的有价值信息。 - fossfreedom
不,他无法正确地将其制作成PDF。这只是对不同方法的建议 - 从hOCR中制作EPUB XHTML,并且如果图像是彩色的,他可以自动裁剪。所有这些都取决于所使用的XSLT,如果他选择这条路线的话。 - zetah
@zetah 但是你不能使用较小的图像制作正规的PDF文件吗(这样不会减小PDF的大小吗?),自动裁剪的功能听起来正是我寻求的! - hayd
@zetah calibre可以很好地转换带有裁剪图像的PDF文件,但是对于整个页面只有一个图像的情况无法处理。这实际上是问题的关键/难点!如果您认为这是可行的,那对我来说将非常有趣。 - hayd
不可能的。我想我简要解释了什么是DjVu - 它只是一张图片,与PDF完全不同。你必须考虑图像的DPI、几何和位置,即使你推断出来了,你也需要使用一些严肃的代码来生成PDF。就像我告诉过你的那样,你不需要把整座山搬到Calibre上。 - zetah
@zetah我希望可能有一个工具可以做到这一点,这样其他人已经完成了“严肃的代码”:)。当然,我同意图像裁剪是困难的部分。(但我记得你说过你可以使用'imagemagick'自动裁剪?如果解决方案可以导出为HTML,那就太完美了!) - hayd
是的,你可以使用ImageMagick来自动裁剪DjVu图像中的图像,但前提是它是彩色的。不过,你打算用它做什么呢?"严肃的代码"类型的工作通常在OCR GUIs(光学字符识别图形用户界面)中完成,比如"Finereader"、"Readiris"...(适用于Windows系统),甚至"gscan2pdf"(版本大于1.0)也提供了这个功能。即使如此,它也不是完全自动化的,因为用户需要确认图像检测是否正确。我不知道有没有适合你的简单解决方案。这是非常特定的问题,我只能猜测,你可能只剩下DjVu文件,并希望将其转换为特定的PDF格式,以便Calibre可以进行"正确"的转换。 - zetah
也许对你来说最好的方法是将所有的DjVu页面提取为TIFF格式,然后尝试使用gscan2pdf。如果它能正常工作(我现在手头没有它来检查),这个过程可能会比较慢。 - zetah
好的,这似乎是我们能得到的最接近的答案了,奖励给zetah。如果你们能够添加任何对下一个人有用的信息,以便不被评论淹没,那就太好了。 - Jorge Castro
谢谢,@zetah!(1)pdfbeads只能处理单页的tiff文件吗?当将多页的捆绑djvu文件转换为多页的pdf文件时,我们需要按照你说的对每一页分别进行操作,然后再将单页的pdf文件合并在一起吗?(2)原始的多页捆绑djvu文件中的书签会在多页pdf文件中丢失,对吗? - Tim
@Tim 这是一篇旧帖子。(1)HOCR可以引用多个页面,但pdfbeads是否实现了这个功能我不清楚,你需要自己尝试一下。(2)书签会丢失,但有一个可能的解决方案:使用bmcconverter将djvu书签转换为pdftk书签,然后使用这个脚本将pdftk书签转换为pdfmarks,最后使用Ghostscript将pdfmarks中的书签写入pdf文件中,具体示例请参考这里 - zetah
@zetah:谢谢。我现在明白了。有一个稍微不同但相关的问题:如果我有一个以hocr格式保存的pdf文件和一个html文件,我能否将hocr文件合并到pdf文件中,使得pdf文件可搜索,而无需将pdf文件转换为单页图像文件?请参考http://unix.stackexchange.com/questions/170133/merge-and-export-ocred-text-into-and-from-a-pdf-file - Tim
非常感谢!我根据你的回答制作了一个脚本:https://gist.github.com/matthieuheitz/7287e214b1aeda7948f6c27fbfb5288b - matthieu

有一个djvu2pdf,但它依赖于ghostscript,所以可能是另一种打印选项。我仍然建议你看一下,以防它比我想象的更聪明。

它不在软件源中,但你可以从制造商的网站上下载deb包:http://0x2a.at/s/projects/djvu2pdf

** 在此插入关于从软件源外下载/安装东西的强制通知 **


1很抱歉,djvu2pdf使用ddjvu来将文件转换为PDF格式,但是该工具会导出不带文本的图像。 - hayd
brew install djvu2pdf - HappyFace

使用DJVULibre,可以通过终端命令提取文本层: djvutxt myfile.djvu > myfile-ocr.txt 或者 djvused myfile.djvu -e 'print-pure-txt' > myfile.txt (两者都是同样的功能,并且在这里找到)
格式化需要一些努力(因为许多符号无法正确转换),并且图片无法恢复

这个工具对于将没有图片的DJVU格式的书籍转换非常好用,但对于有图片的文档则不适用。目前来说,这是我唯一提取文本的解决方案。如果能够保留格式和图片,那将会更加理想! - hayd


非常好的总结了那篇帖子的内容。谢谢你提供这个脚本! - rbrito


我已经发布了那个网站,兄弟。 - Ashu
这个网站看起来是假的。在转换之后,我收到了这条信息:对不起,您无法下载该文件。 - corev

最简单的方法:使用gscan2pdf导入djvu文件,然后用tesseract进行OCR识别,最后保存为pdf格式。PDF中的OCR文本可能与原始的djvu文件略有不同,并且转换过程可能需要一些时间,但这种方法非常简单易行,而且有效。

1嗨,为了使这个回答更有用,请您提供一些关于如何获取和使用gscan2pdf和tesseract的详细信息。 - NGRhodes