2014年9月 8日 (月)

DotNetZipでEPUBファイルを作る

C#でEPUBファイル作ろうと思い、DotNetZipを使ってみた。

mimetypeを先頭に置いているのに、EPUBっぽくならない。ぐぐってみると、「EPUBではmimetypeは圧縮してはいけないが、DotNetZipは必ず圧縮する。そこで、適当なEPUBファイルを持ってきて、その先頭のmimetypeだけコピーして、云々」なんていう記事を発見。

いや、そんなことないでしょ、ZipEntry.CompressionMethodっていうプロパティがあって、これをNoneにすれば非圧縮メンバーを作れる。それでもEPUBにならなくて困ってるんだよ、こっちは、みたいな。

仕方ないので、ファイルを16進ダンプして良く見たら、ファイルヘッダーにextended fieldがついている。中身は「NTFS形式ファイルスタンプ」であった。

なるほど。

これを止めるには、ZipEntry.EmitTimesInWindowsFormatWhenSavingをfalseにすればよい。(Linux/Monoで動かすなら、ZipEntry.EmitTimesInUnixFormatWhenSavingをfalseにする。いちいちプラットフォームを調べる必要はなくて、常に両方ともfalseにしちゃうのが無難だと思う。)

つまり、こんな感じ。

    var mimetypeEntry = zipfile.Add("mimetype");
        mimetypeEntry.CompressionMethod = CompressionMethod.None;
        mimetypeEntry.EmitTimesInWindowsFormatWhenSaving = false;
        mimetypeEntry.EmitTimesInUnixFormatWhenSaving = false;

これで、cygwinのfile コマンドが"EPUB documen"と言ってくれるようになった。