Answers:
更新:user3124688已在脚本dpsprep中对该过程进行了编码。
我不知道会为您进行转换的任何工具。您当然应该能够做到,但是可能需要一点工作。我将概述基本过程。您将需要开源命令行实用程序pdftk
和djvused
(DjVuLibre的一部分)。这些文件可以从您的程序包管理器(GNU / Linux)或其网站(Windows,OS X)中获得。
首先,使用任何工具将DJVU文件转换为PDF(无书签)。
假设文件名为filename.djvu
和filename.pdf
。
接下来,将DJVU大纲数据输出到文件中,如下所示:
djvused "filename.djvu" -e 'print-outline' > bmarks.out
这是一个以序列化树格式列出DJVU文档书签的文件。实际上,这只是SEXPR,可以轻松地对其进行解析。格式如下:
file ::= (bookmarks
<bookmark>*)
bookmark ::= (name
page
<bookmark>*)
name ::= "<character>*"
page ::= "#<digit>+"
例如:
(bookmarks
("bmark1"
"#1")
("bmark2"
"#5"
("bmark2subbmark1"
"#6")
("bmark2subbmark2"
"#7"))
("bmark3"
"#9"
...))
现在,我们需要将这些书签转换为PDF元数据所需的格式。该文件的格式为:
file ::= <entry>*
entry ::= BookmarkBegin
BookmarkTitle: <title>
BookmarkLevel: <number>
BookmarkPageNumber: <number>
title ::= <character>*
因此我们的示例将变为:
BookmarkBegin
BookmarkTitle: bmark1
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: bmark2
BookmarkLevel: 1
BookmarkPageNumber: 5
BookmarkBegin
BookmarkTitle: bmark2subbmark1
BookmarkLevel: 2
BookmarkPageNumber: 6
BookmarkBegin
BookmarkTitle: bmark2subbmark2
BookmarkLevel: 2
BookmarkPageNumber: 7
BookmarkBegin
BookmarkTitle: bmark3
BookmarkLevel: 1
BookmarkPageNumber: 9
基本上,您只需要编写一个脚本来遍历SEXPR树,跟踪级别,并以正确的格式输出其涉及的每个条目的名称,页码和级别。
获得转换后的列表后,从转换后的PDF文件中输出PDF元数据:
pdftk "filename.pdf" dump_data > pdfmetadata.out
现在,打开文件并找到开始的行:
NumberOfPages:
在此行之后插入转换后的书签。将新文件另存为pdfmetadata.in
现在,我们可以创建一个包含以下元数据的新PDF文件:
pdftk "filename.pdf" update_info "pdfmetadata.in" output out.pdf
该文件out.pdf
应该是PDF的副本,其中包含从DJVU文件导入的书签。
基于用户@pyrocrasty给出的非常清晰的轮廓(谢谢!),我实现了一个DJVU到PDF转换器,该转换器既保留OCR文本又保留书签结构。您可以在这里找到它:
https://github.com/kcroker/dpsprep
有关OCR数据的致谢,请访问Ubuntu论坛上的@zetah!
j.split('#')[1]
了(int(re.findall(r'\d+', j.split('#')[1])[0])+1)
,效果很好。Debian Jessie需要:sudo apt-get install pdftk djvulibre-bin python-pip ruby ruby-dev libmagickwand-dev; sudo pip install sexpdata; sudo gem install iconv pdfbeads