Đọc định dạng ePub


102

Tôi đang cố gắng phát triển một ứng dụng iPhone để đọc các tệp ePub. Có bất kỳ khuôn khổ nào có sẵn để phát triển điều này không? Tôi không biết cách đọc định dạng tệp này. Tôi đã cố gắng phân tích cú pháp tệp mẫu có phần mở rộng .epub bằng Trình phân tích cú pháp NSXML, nhưng không thành công.

Câu trả lời:


304

Định dạng EPUB tập hợp nhiều thông số / định dạng khác nhau:

  • một để nói nội dung của cuốn sách sẽ như thế nào (một tập hợp con của XHTML 1.1 + CSS)
  • một để xác định một "tệp kê khai" liệt kê tất cả các tệp tạo nên nội dung đó (OPF, là một tệp XML)
  • một để xác định cách mọi thứ được đóng gói (OEBPS: một tệp zip của mọi thứ trong tệp kê khai cộng với một vài tệp bổ sung)

Các thông số kỹ thuật có vẻ hơi khó khăn nhưng thực sự khi bạn đã nắm được các kiến ​​thức cơ bản (giải nén, phân tích cú pháp XML) thì nó không quá khó hay phức tạp.

Bạn sẽ cần tìm cách tải xuống EPUB, giải nén nó ở đâu đó, để phân tích cú pháp tệp kê khai và sau đó hiển thị nội dung có liên quan.

Một số gợi ý nếu bạn mới bắt đầu:

Để hiển thị nội dung, chỉ cần sử dụng a UIWebView.

Đây là từng bước cấp cao cho mã của bạn:

1) tạo chế độ xem với UIWebView

2) tải xuống tệp EPUB

3) giải nén nó vào một thư mục con trong thư mục tài liệu của ứng dụng của bạn bằng cách sử dụng thư viện zip, được liên kết ở trên

4) phân tích cú pháp tệp XML tại META-INF/container.xml(nếu tệp này không tồn tại thì EPUB không hợp lệ) bằng cách sử dụng TBXML, được liên kết ở trên

5) Trong XML này, hãy tìm "tệp gốc" đầu tiên có kiểu phương tiện application/oebps-package+xml. Đây là tệp OPF cho cuốn sách.

6) phân tích cú pháp tệp OPF (cũng là XML)

7) Bây giờ bạn cần biết chương đầu tiên của cuốn sách là gì.

a) mỗi phần tử <item>trong <manifest>phần tử có một id và một href. Lưu trữ chúng trong một NSDictionarynơi khóa là id và đối tượng là href.

b) Nhìn vào cái đầu tiên <itemref>trong <spine>. Nó có một thuộc tính idref tương ứng với một trong các id trong (a). Tra id đó trong NSDictionaryvà bạn sẽ nhận được một href.

c) Đây là tệp của chương đầu tiên để hiển thị cho người dùng. Tìm ra đường dẫn đầy đủ là gì (gợi ý: đó là bất cứ nơi nào bạn giải nén tệp zip trong (3) cộng với thư mục cơ sở của tệp OPF trong (6))

8) tạo một NSURLusing fileURLWithPath:, trong đó đường dẫn là đường dẫn đầy đủ từ (7c). Tải yêu cầu này bằng cách UIWebViewbạn đã tạo trong (1).

Bạn sẽ cần triển khai các nút chuyển tiếp / lùi hoặc vuốt hoặc một cái gì đó để người dùng có thể chuyển từ chương này sang chương khác. Sử dụng <spine>để tìm ra tệp nào sẽ hiển thị tiếp theo - <itemrefs>tệp trong XML theo thứ tự mà chúng sẽ xuất hiện cho người đọc.


thực sự là một hướng dẫn tốt ..! người đàn ông tuyệt vời ..! Tôi đã dành rất nhiều thời gian cho bản demo như vậy
Paresh Thakor

16
đó là một sự xấu hổ rằng nó chỉ có thể cung cấp 1 phiếu bầu tán thành cho câu trả lời này
Tim McNamara

Câu trả lời chính xác. Đây đang trở thành một thành :)
Nic Gibson

9
Cảm ơn Euan rất nhiều ... Đối với tất cả những người vẫn đang tìm kiếm giải pháp, tôi đã tạo một mẫu và đăng trên ideveloperworld.blogspot.com/2011/02/epub-reader.html
MobX

Lưu ý rằng không có nhu cầu cụ thể "giải nén nó ở đâu đó" nếu bạn muốn tạo các tệp mới riêng biệt là nội dung được giải nén của kho lưu trữ ZIP. ZIP là một định dạng khá đơn giản và sẽ khá dễ dàng để tạo các thư viện cung cấp cho bạn các luồng đầu vào cho các tệp khác nhau trong kho lưu trữ đọc trực tiếp từ kho lưu trữ một cách nhanh chóng, nếu bạn chưa có các thư viện như vậy. Một ví dụ về thư viện như vậy, với đầy đủ nguồn có sẵn, là RubyZip ( rubyzip.sourceforge.net ).
cjs

21

Rõ ràng EPUB "chỉ" là một định dạng XML, vì vậy nếu bạn có trình phân tích cú pháp xml và thông số kỹ thuật thì không sao cả.

Thêm một chút hướng dẫn ? Chúc vui vẻ!

CHỈNH SỬA: bạn cũng có thể đọc một số mã ở đây , điều này là để tạo epub, không phải đọc chúng nhưng mã có thể hữu ích.

CHỈNH SỬA lại: Và xem các liên kết đến câu hỏi liên quan ở thanh bên phải, có một số liên kết trong câu trả lời cho trình đọc ebook miễn phí hỗ trợ ePub.


CHỈNH SỬA 3: Bạn nên thêm nhận xét khi chỉnh sửa câu hỏi của mình để những người trả lời bạn có thể tiếp tục thảo luận (nếu bạn không nhận xét, chúng tôi sẽ không nhận thấy chỉnh sửa của bạn).

Vì vậy, phân tích cú pháp không thành công vì bạn không đọc thông số kỹ thuật hoặc các câu hỏi liên quan trên Stack Overflow ... * .epub tệp là một thư mục nén chứa (các) tệp XML, không phải xml thuần túy.


6

Tôi đã đọc qua hướng dẫn này một lần (yêu cầu đăng ký miễn phí, xin lỗi) và nó đã cho tôi một giới thiệu tuyệt vời về ePub. hướng dẫn deverloperWorks tại đây

Tôi thực sự khuyên bạn nên xem một số thư viện xử lý XML. Nếu bạn chỉ muốn lấy thông tin cụ thể ra khỏi tệp XML, thì bạn có thể chọn chiến lược phân tích cú pháp phù hợp.


Hướng dẫn này rất tuyệt vời và được viết bởi người đã tạo ra nhiều công cụ ePub mã nguồn mở tiêu chuẩn có sẵn. Đó là một bản đọc nhanh và cung cấp phần giới thiệu hoạt động hoàn hảo cho định dạng ePub.
Brian Moeskau


2

Tôi đang chơi arround để tạo epub-framework cho các ứng dụng iphone.

Hiện tại (tôi thực sự chỉ mới bắt đầu) tôi có thể tạo một trang tiêu đề với các liên kết đến các chương.

Cách tiếp cận của tôi là

  • Sử dụng khung kết nối nhanh iphone làm một lớp (có thể tôi đổi thành phonegap) về cơ bản cho phép các ứng dụng javascript làm ứng dụng iphone
  • Thêm epub UNZIPed làm nguồn cung cấp lại cho dự án
  • Phân tích cú pháp toàn bộ với phiên bản tùy chỉnh của epub.js (ở đâu đó trên google-code)

Hiện tại, tôi đang xem xét pageflip, một số loại lỗi và vấn đề nhỏ về khả năng sử dụng (lưu trang hiện tại đang được xem)

Tôi hy vọng điều đó cho bạn một ý tưởng về cách bắt đầu


tôi đã sử dụng epub.js những gì tôi đã nhận một lỗi như XML Parsing Error: không có yếu tố tìm thấy dòng vị trí cột số number1 1.Can u hel tôi bằng cách cung cấp một số liên kết
user969275

có vấn đề gì với khuôn khổ của bạn? bạn đã xuất bản nó ở đâu đó?
yasirmturk

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.