|
2011/05/04 17:38
解決していません。しました。
C#である画像の一塊をダウンロードしてきて、ePubにするようなプログラムを作成。
ePub自体は規則に沿ったフォルダ構成のzipのファイルをePubにしたもの。
C#では標準でzip圧縮できないので、ここは定評のあるNotNetZipを使用。
DotNetZip
http://dotnetzip.codeplex.com/
ただ、一つ癖があってePub内にあるmimetypeファイルはファイルの先頭である必要があり、
しかも非圧縮でなければならない。
DotNetZipは良くて出来ているもので、圧縮率を変更することが出来る。
//圧縮
using (ZipFile zip = new ZipFile()) {
//強制的に圧縮しないようにする
zip.ForceNoCompression = true;
zip.EmitTimesInWindowsFormatWhenSaving = false;
zip.AddEntry("mimetype", "", "application/epub+zip");
//mimetype以降は圧縮がかかるようにする
zip.ForceNoCompression = false;
zip.AddDirectory(tmpDir+"/META-INF", "META-INF");
zip.AddFile(tmpDir + "/META-INF/container.xml", "META-INF/container.xml");
zip.AddDirectory(tmpDir+"/OEBPS", "OEBPS");
zip.Save(savePath);
}
ForceNoCompressionプロパティを使用することで、圧縮の制御が出来る。
しかし、このプロパティ。
最新の1.9ではどうもなくなっているみたい。
1.9では変わりにCompressionLevelで制御できそう。
zip.CompressionLevel = CompressionLevel.NONE;
さて、出来たファイルが本当にePubとして正しいのかをチェックする必要がある。
そこで使用するのがePubChecker
ePubChecker
http://code.google.com/p/epubcheck/
Java1.5以降がインストールされていれば、コマンドプロンプトならびにターミナルから
以下のようにコマンドを打つと警告やエラーを表示してくれる。
java -jar epubcheck-1.2.jar <epubファイル名>
今回はバージョン1.2を使用。
パスなどは環境によって異なるので、各自読み替えて欲しい。
で、確認してみるとvalid(正当)なファイル。
次にビュワーで確認する。
使用するビュワーは
Adobe Disital Edition
http://www.adobe.com/jp/products/digitaleditions/
EPub Reader(Firefox Add-on)
https://addons.mozilla.org/ja/firefox/addon/epubreader/
また実機としてiPad2のiBookで確認する。
結果は
Adobe Disital Edition
[OK]
EPub Reader
[NG]
今後の開発に役立てるために作成者にエラー内容をメールしてくれとのメッセージが表示される。
iBook
[NG]
反応なし
そこで、以下の方法で再度確認
1:作成されたtest.epubをtest.zipにファイル名を変更し、解凍
2:Info-zipを使用して以下のコマンドを実行し、新たにePubファイルを再作成
zip -0 test.epub mimetype
zip -r test.epub * -x mimetype
確認したらすべてOK。
zipの圧縮方法に問題があるのかぁ。
*** 2011/05/04 19:04 追記 ***
zipの圧縮方法になんら問題はありませんでした。
zip.AddFile(tmpDir + "/META-INF/container.xml", "META-INF/container.xml");
がただ単に余分だっただけ。
前の行でMETA-INF配下のファイルは処理されているのに、再度container.xmlを追加していた。
おかしいはずだ。
あとファイルのヘッダ等を確認してみたがInfo-zipで作成したファイルはePubCheckerにかけると
エラーになる。
厳密に30バイト目からmimetype文字列が始まり、38バイト目からmimetypeの中身が
始まっていないといけないのだが、
Info-zipの場合はmimetypeの中身が38バイト目にきていない、ということでした。
さて、iPadでWebページをePub保存できるようなアプリを作ったら儲かるかなぁ。
考えてみよう。
|