Как конвертировать djvu в pdf и сохранить оглавление, как это возможно?


9

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

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

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

Ответы:


5

обновление: 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.


3

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

https://github.com/kcroker/dpsprep

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


У меня был файл 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.