2011年5月14日

EPUB ZIP コンテナの作り方

EPUBのファイル(コンテナ)は「.epub」という拡張子がついていますが、ファイルの構造としてはZIPアーカイブです。ですから、拡張子を「.zip」に書き換えれば、MacでもWindowsでも解凍(展開)して、本文などを普段使い慣れているテキストエディタで編集できます。

しかし、編集後、ZIPで圧縮(アーカイブ)して、拡張子を「.epub」に戻せばいいかというと、そうではないのです。mimetypeファイルの扱いが少し特別なのです。
  • 要件1: ZIPコンテナの先頭に置く
  • 要件2: 圧縮も暗号化もしない
  • 要件3:  ヘッダにはextra fieldをつけない
ことが求められているのです。

要件1を満たすには
→ 最初にmimetypeフィアルを単独でZIPアーカイブし、次に残りのディレクトリ・ファイルをそのZIPコンテナに追加すればOK。なんか、簡単^^

要件2を満たすには
→ zipコマンドに「-0」(ゼロです。圧縮率0という意味)をつければOK。

要件3を満たすには
→ zipコマンドに「-X」(大文字です)をつければOK。

たとえば、「De_Suse」というフォルダにmimetypeもふくめ必要なデータを入れておいて、
$ cd De_Suse
$ zip -0 -X ../De_Suse.epub mimetype
$ zip -r ../De_Suse.epub * -x mimetype
$ cd ..

これで「De_Suse.epub」というEPUBファイルができます。なお、2行目の「-X」は大文字、3行目の「-x」(引数ファイルを除外するという意味のオプション)は小文字です。


なお、mimetypeの扱いについての詳細は「EPUB Open Container Format (OCF)」に規定されています。

EPUB 2.0.1
http://idpf.org/epub/20/spec/OCF_2.0.1_draft.doc
「4 ZIP Container」節の末尾
The first file in the ZIP Container MUST be a file by the ASCII name of ‘mimetype’ which holds the MIME type for the ZIP Container (i.e., “application/epub+zip” as an ASCII string; no padding, white-space or case change). The file MUST be neither compressed nor encrypted and there MUST NOT be an extra field in its ZIP header. If this is done, then the ZIP Container offers convenient “magic number” support as described in RFC 2048 and the following will hold true:
The bytes “PK” will be at the beginning of the file
The bytes “mimetype” will be at position 30
The actual MIME type (i.e., the ASCII string “application/epub+zip”) will begin at position 38

EPUB 3
http://idpf.org/epub/30/spec/epub30-ocf.htm
3.3 OCF ZIP Container Media Type Identification
OCF ZIP Containers must include a mimetype file as the first file in the Container, and the contents of this file must be the MIME type string application/epub+zip.
The contents of the mimetype file must not contain any leading padding or whitespace, must not begin with the Unicode signature (or Byte Order Mark), and the case of the MIME type string must be exactly as presented above. The mimetype file additionally must be neither compressed nor encrypted, and there must not be an extra field in its ZIP header.

ほんとうに3要件を満たしているかは、hexdumpしてみれば分かります。

moria:Desktop tac$ hexdump -C De_Suse.epub |head

00000000  50 4b 03 04 0a 00 00 00  00 00 52 bb ac 3e 6f 61  |PK........R..>oa|
00000010  ab 2c 14 00 00 00 14 00  00 00 08 00 00 00 6d 69  |.,............mi|
00000020  6d 65 74 79 70 65 61 70  70 6c 69 63 61 74 69 6f  |metypeapplicatio|
00000030  6e 2f 65 70 75 62 2b 7a  69 70 50 4b 03 04 0a 00  |n/epub+zipPK....|
00000040  00 00 00 00 7d bb ac 3e  00 00 00 00 00 00 00 00  |....}..>........|
00000050  00 00 00 00 09 00 00 00  4d 45 54 41 2d 49 4e 46  |........META-INF|
00000060  2f 50 4b 03 04 14 00 00  00 08 00 52 bb ac 3e c5  |/PK........R..>.|
00000070  06 1a 6f a3 00 00 00 f2  00 00 00 16 00 00 00 4d  |..o............M|
00000080  45 54 41 2d 49 4e 46 2f  63 6f 6e 74 61 69 6e 65  |ETA-INF/containe|
00000090  72 2e 78 6d 6c 55 8e c1  0e c2 20 10 44 ef fd 0a  |r.xmlU.... .D...|


いったん、unzipしたものをMacの普通の“圧縮”でZIPして、拡張子を付け替えたもの(De_Suseフォルダの中身だけをZIPしたもの)だと、

moria:Desktop tac$ hexdump -C De_Suse_MacZIP.epub |head
00000000  50 4b 03 04 0a 00 00 00  00 00 7d bb ac 3e 00 00  |PK........}..>..|
00000010  00 00 00 00 00 00 00 00  00 00 09 00 10 00 4d 45  |..............ME|
00000020  54 41 2d 49 4e 46 2f 55  58 0c 00 cd ef cb 4d 6e  |TA-INF/UX.....Mn|
00000030  ee cb 4d f6 01 f6 01 50  4b 03 04 14 00 08 00 08  |..M....PK.......|
00000040  00 52 bb ac 3e 00 00 00  00 00 00 00 00 00 00 00  |.R..>...........|
00000050  00 16 00 10 00 4d 45 54  41 2d 49 4e 46 2f 63 6f  |.....META-INF/co|
00000060  6e 74 61 69 6e 65 72 2e  78 6d 6c 55 58 0c 00 5e  |ntainer.xmlUX..^|
00000070  05 cc 4d 1c ee cb 4d f6  01 f6 01 55 8e c1 0e c2  |..M...M....U....|
00000080  20 10 44 ef fd 0a c2 d5  b4 e8 95 40 4d 4c 3c 6b  | .D........@ML<k|
00000090  e2 17 ac 74 ab 44 60 09  50 a3 7f 2f d6 a4 b1 7b  |...t.D`.P../...{|


ところが、場合によっては、Macの右クリックによる“圧縮”でつくったZIPファイルの拡張子を「.epub」に書き換えたものでも、Adobe Digital EditionsやSigilはEPUBとして読み出せますし、それをkindlegenで変換したMOBIファイルもKindleで普通に表示できます。
これは上のOCFによる3要件を一つも満たしていないのですが、なぜか大丈夫なのです。

0 件のコメント: