将djvu转换为pdf并保存目录,这怎么可能?


9

我尝试了几种联机和脱机工具,但是在转换过程中未保留目录(TOC)信息。

我想转换一个5,000页的djvu格式的芬兰语字典,该字典具有大约5000个TOC条目,这些条目的层次结构可快速查找单词。

知道在DJVU到PDF转换期间如何保留TOC信息吗?

Answers:


5

更新:user3124688已在脚本dpsprep中对该过程进行了编码


我不知道会为您进行转换的任何工具。您当然应该能够做到,但是可能需要一点工作。我将概述基本过程。您将需要开源命令行实用程序pdftkdjvused(DjVuLibre的一部分)。这些文件可以从您的程序包管理器(GNU / Linux)或其网站(Windows,OS X)中获得。

  • 步骤1:转换文件文本

    首先,使用任何工具将DJVU文件转换为PDF(无书签)。

    假设文件名为filename.djvufilename.pdf

  • 步骤2:提取DJVU大纲

    接下来,将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"
        ...))
    
  • 步骤3:将DJVU大纲转换为PDF元数据格式

    现在,我们需要将这些书签转换为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树,跟踪级别,并以正确的格式输出其涉及的每个条目的名称,页码和级别。

  • 步骤4:提取PDF元数据并在转换后的书签中进行拼接

    获得转换后的列表后,从转换后的PDF文件中输出PDF元数据:

    pdftk "filename.pdf" dump_data > pdfmetadata.out
    

    现在,打开文件并找到开始的行: NumberOfPages:

    在此行之后插入转换后的书签。将新文件另存为pdfmetadata.in

  • 第5步:使用书签创建PDF

    现在,我们可以创建一个包含以下元数据的新PDF文件:

    pdftk "filename.pdf" update_info "pdfmetadata.in" output out.pdf
    

    该文件out.pdf应该是PDF的副本,其中包含从DJVU文件导入的书签。


3

基于用户@pyrocrasty给出的非常清晰的轮廓(谢谢!),我实现了一个DJVU到PDF转换器,该转换器既保留OCR文本又保留书签结构。您可以在这里找到它:

https://github.com/kcroker/dpsprep

有关OCR数据的致谢,请访问Ubuntu论坛上的@zetah!


我在书签页码字段中有一个非数字文本的DJVU文件,因此解析器无法读取它们。我换成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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.