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

use*_*559 9 pdf djvu conversion

我尝试了几种在线和离线工具,但在转换过程中没有保留目录 (TOC) 信息。

我想转换一个 5000 页的芬兰语词典,该词典采用 djvu 格式,大约有 5000 个 TOC 条目分层结构以快速查找单词。

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

pyr*_*sty 6

更新: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
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个以序列化树格式列出 DJVU 文档书签的文件。事实上,它只是一个SEXPR,很容易解析。格式如下:

    file ::= (bookmarks
               <bookmark>*)
    bookmark ::= (name
                   page
                   <bookmark>*)
    name ::= "<character>*"
    page ::= "#<digit>+"
    
    Run Code Online (Sandbox Code Playgroud)

    例如:

    (bookmarks
      ("bmark1"
        "#1")
      ("bmark2"
        "#5"
        ("bmark2subbmark1"
          "#6")
        ("bmark2subbmark2"
          "#7"))
      ("bmark3"
        "#9"
        ...))
    
    Run Code Online (Sandbox Code Playgroud)
  • 第 3 步:将 DJVU 大纲转换为 PDF 元数据格式

    现在,我们需要将这些书签转换为 PDF 元数据所需的格式。该文件的格式为:

    file ::= <entry>*
    entry ::= BookmarkBegin
              BookmarkTitle: <title>
              BookmarkLevel: <number>
              BookmarkPageNumber: <number>
    title ::= <character>*
    
    Run Code Online (Sandbox Code Playgroud)

    所以我们的例子会变成:

     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
    
    Run Code Online (Sandbox Code Playgroud)

    基本上,您只需要编写一个脚本来遍历 SEXPR 树,跟踪级别,并以正确的格式输出每个条目的名称、页码和级别。

  • 第 4 步:提取 PDF 元数据并拼接转换后的书签

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

    pdftk "filename.pdf" dump_data > pdfmetadata.out
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • 第 5 步:创建带有书签的 PDF

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

    pdftk "filename.pdf" update_info "pdfmetadata.in" output out.pdf
    
    Run Code Online (Sandbox Code Playgroud)

    该文件out.pdf应该是带有从 DJVU 文件导入的书签的 PDF 副本。