Chuyển đổi djvu sang pdf VÀ bảo quản mục lục, làm thế nào có thể?


9

Tôi đã thử một số công cụ trực tuyến và ngoại tuyến nhưng thông tin bảng nội dung (TOC) không được lưu giữ trong quá trình chuyển đổi.

Tôi muốn chuyển đổi một từ điển Phần Lan 5000 trang ở định dạng djvu và có khoảng 5000 mục TOC được cấu trúc phân cấp để tìm từ nhanh chóng.

Bạn có biết làm thế nào để lưu giữ thông tin TOC trong quá trình chuyển đổi DJVU sang PDF không?

Câu trả lời:


5

cập nhật: user3124688 đã mã hóa quy trình này trong tập lệnh dpsprep .


Tôi không biết bất kỳ công cụ nào sẽ thực hiện chuyển đổi cho bạn. Bạn chắc chắn sẽ có thể làm điều đó, nhưng nó có thể mất một chút công việc. Tôi sẽ phác thảo quá trình cơ bản. Bạn sẽ cần các tiện ích dòng lệnh nguồn mở pdftkdjvused(một phần của DjVuLibre). Chúng có sẵn từ trình quản lý gói của bạn (GNU / Linux) hoặc trang web của họ (Windows, OS X).

  • Bước 1: chuyển đổi văn bản tập tin

    Đầu tiên, sử dụng bất kỳ công cụ nào để chuyển đổi tệp DJVU thành PDF (không có dấu trang).

    Giả sử các tập tin được gọi filename.djvufilename.pdf.

  • Bước 2: trích xuất phác thảo DJVU

    Tiếp theo, xuất dữ liệu phác thảo DJVU thành một tệp, như sau:

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

    Đây là một tệp liệt kê các dấu trang tài liệu DJVU ở định dạng cây nối tiếp. Trên thực tế, nó chỉ là một SEXPR và có thể dễ dàng phân tích cú pháp. Định dạng như sau:

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

    Ví dụ:

    (bookmarks
      ("bmark1"
        "#1")
      ("bmark2"
        "#5"
        ("bmark2subbmark1"
          "#6")
        ("bmark2subbmark2"
          "#7"))
      ("bmark3"
        "#9"
        ...))
    
  • Bước 3: chuyển đổi phác thảo DJVU sang định dạng siêu dữ liệu PDF

    Bây giờ, chúng ta cần chuyển đổi các dấu trang này thành định dạng theo yêu cầu của siêu dữ liệu PDF. Tập tin này có định dạng:

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

    Vì vậy, ví dụ của chúng tôi sẽ trở thành:

     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
    

    Về cơ bản, bạn chỉ cần viết một tập lệnh để đi bộ cây SEXPR, theo dõi cấp độ và xuất tên, số trang và cấp độ của mỗi mục nhập theo định dạng chính xác.

  • Bước 4: trích xuất siêu dữ liệu PDF và mối nối trong dấu trang được chuyển đổi

    Khi bạn đã có danh sách đã chuyển đổi, hãy xuất siêu dữ liệu PDF từ tệp PDF đã chuyển đổi của bạn:

    pdftk "filename.pdf" dump_data > pdfmetadata.out
    

    Bây giờ, mở tệp và tìm dòng bắt đầu: NumberOfPages:

    chèn các dấu trang được chuyển đổi sau dòng này. Lưu tệp mới dưới dạngpdfmetadata.in

  • Bước 5: tạo PDF bằng dấu trang

    Bây giờ chúng ta có thể tạo một tệp PDF mới kết hợp siêu dữ liệu này:

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

    Tệp out.pdfphải là bản sao PDF của bạn với các dấu trang được nhập từ tệp DJVU.


3

Dựa trên phác thảo rất rõ ràng ở trên do người dùng @pyrocrasty đưa ra (cảm ơn bạn!), Tôi đã triển khai trình chuyển đổi DJVU sang PDF để bảo vệ cả văn bản OCR'd và cấu trúc dấu trang. Bạn có thể tìm thấy nó ở đây:

https://github.com/kcroker/dpsprep

Lời cảm ơn về dữ liệu OCR được gửi tới @zetah trên các diễn đàn Ubuntu!


Tôi đã có một tệp DJVU với văn bản không phải là số trong các trường số trang đánh dấu, vì vậy trình phân tích cú pháp đã không đọc chúng. Tôi thay thế j.split('#')[1]bằng (int(re.findall(r'\d+', j.split('#')[1])[0])+1)và nó đã làm việc tuyệt vời. Cần có 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.