Konwersja djvu na pdf ORAZ zachowanie spisu treści, jak to możliwe?

9

Wypróbowałem kilka narzędzi online i offline, ale informacje o spisie treści (TOC) nie zostały zachowane podczas konwersji.

Chciałbym przekonwertować 5000-stronicowy słownik fiński, który jest w formacie djvu i ma około 5000 pozycji spisu treści w strukturze hierarchicznej, aby szybko znaleźć słowa.

Masz pomysł, jak można zachować informacje o spisie treści podczas konwersji DJVU na PDF?

użytkownik1198559
źródło

Odpowiedzi:

5

aktualizacja: użytkownik3124688 zakodował ten proces w skrypcie dpsprep .


Nie znam żadnych narzędzi, które dokonają konwersji za Ciebie. Z pewnością powinieneś być w stanie to zrobić, ale może to zająć trochę pracy. Przedstawię podstawowy proces. Będziesz potrzebował narzędzi wiersza poleceń open source pdftki djvused(część DjVuLibre). Są one dostępne w menedżerze pakietów (GNU / Linux) lub na ich stronach internetowych (Windows, OS X).

  • krok 1: przekonwertuj tekst pliku

    Po pierwsze, użyj dowolnego narzędzia do konwersji pliku DJVU do formatu PDF (bez zakładek).

    Załóżmy, że pliki są nazywane filename.djvui filename.pdf.

  • krok 2: wyodrębnij zarys DJVU

    Następnie wyślij dane konspektu DJVU do pliku, jak poniżej:

    djvused "filename.djvu" -e 'print-outline' > bmarks.out
    

    Jest to plik z listą zakładek dokumentów DJVU w formacie drzewa zserializowanego. W rzeczywistości jest to po prostu SEXPR i można go łatwo przeanalizować. Format jest następujący:

    file ::= (bookmarks
               <bookmark>*)
    bookmark ::= (name
                   page
                   <bookmark>*)
    name ::= "<character>*"
    page ::= "#<digit>+"
    

    Na przykład:

    (bookmarks
      ("bmark1"
        "#1")
      ("bmark2"
        "#5"
        ("bmark2subbmark1"
          "#6")
        ("bmark2subbmark2"
          "#7"))
      ("bmark3"
        "#9"
        ...))
    
  • krok 3: przekonwertuj kontur DJVU na format metadanych PDF

    Teraz musimy przekonwertować te zakładki do formatu wymaganego przez metadane PDF. Ten plik ma format:

    file ::= <entry>*
    entry ::= BookmarkBegin
              BookmarkTitle: <title>
              BookmarkLevel: <number>
              BookmarkPageNumber: <number>
    title ::= <character>*
    

    Zatem naszym przykładem byłoby:

     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
    

    Zasadniczo wystarczy napisać skrypt, aby przejść do drzewa SEXPR, śledząc poziom, i wypisując nazwę, numer strony i poziom każdego wpisu, w odpowiednim formacie.

  • krok 4: wyodrębnij metadane PDF i połącz w przekształcone zakładki

    Po uzyskaniu przekonwertowanej listy wyślij metadane PDF z przekonwertowanego pliku PDF:

    pdftk "filename.pdf" dump_data > pdfmetadata.out
    

    Teraz otwórz plik i znajdź linię, która się zaczyna: NumberOfPages:

    wstaw przekonwertowane zakładki po tym wierszu. Zapisz nowy plik jakopdfmetadata.in

  • krok 5: utwórz PDF z zakładkami

    Teraz możemy utworzyć nowy plik PDF zawierający te metadane:

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

    Plik out.pdfpowinien być kopią pliku PDF z zakładkami zaimportowanymi z pliku DJVU.

pirokrastyka
źródło
3

Opierając się na bardzo wyraźnym zarysie powyżej podanym przez użytkownika @pyrocrasty (dziękuję!), Wdrożyłem konwerter DJVU na PDF, który zachowuje zarówno tekst OCR, jak i strukturę zakładek. Możesz go znaleźć tutaj:

https://github.com/kcroker/dpsprep

Podziękowania dla danych OCR znajdziesz na @zetah na forach Ubuntu!

użytkownik3124688
źródło
Miałem plik DJVU z tekstem nienumerycznym w polach numeru strony zakładki, więc parser ich nie odczytał. Wymieniłem j.split('#')[1]z (int(re.findall(r'\d+', j.split('#')[1])[0])+1)i to działało świetnie. Debian Jessie potrzebował:sudo apt-get install pdftk djvulibre-bin python-pip ruby ruby-dev libmagickwand-dev; sudo pip install sexpdata; sudo gem install iconv pdfbeads