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ở pdftk
và djvused
(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.djvu
và filename.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.pdf
phải là bản sao PDF của bạn với các dấu trang được nhập từ tệp DJVU.
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