9

Я перепробовал несколько онлайн и офлайн инструментов, но информация о содержании (TOC) не была сохранена во время преобразования.

Я хотел бы преобразовать финский словарь на 5000 страниц, который находится в формате djvu и имеет около 5000 записей TOC, структурированных иерархически для быстрого поиска слов.

Любая идея, как можно сохранить информацию об оглавлении во время преобразования DJVU в PDF?

2 ответа2

4

обновление: user3124688 закодировал этот процесс в сценарии dpsprep.


Я не знаю каких-либо инструментов, которые сделают преобразование для вас. Вы, конечно, должны быть в состоянии сделать это, но это может занять немного работы. Я опишу основной процесс. Вам понадобятся утилиты командной строки с открытым исходным кодом pdftk и djvused (часть DjVuLibre). Они доступны в вашем менеджере пакетов (GNU/Linux) или на их сайтах (Windows, OS X).

  • Шаг 1: преобразовать текст файла

    Сначала используйте любой инструмент для преобразования файла DJVU в PDF (без закладок).

    Предположим, что файлы называются filename.djvu и filename.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.

2

Основываясь на очень четкой схеме, приведенной выше пользователем @pyrocrasty (спасибо!), Я реализовал конвертер DJVU в PDF, который сохраняет как текст OCR, так и структуру закладок. Вы можете найти это здесь:

https://github.com/kcroker/dpsprep

Благодарности за данные OCR можно найти на @zetah на форумах Ubuntu!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .