RubyZipRuby
EPUB3 ファイルを生成するにあたってはどうしても zip アーカイブする必要があるので、Rubyで使えるライブラリを探していたら、rubyzip と zipruby にあたった。まったく、もう(笑)。
評判としては zipruby のほうが Ruby らしい書き方ができるというのではじめにそちらを試した。ちょうど i386-mswin32 用の .so ファイルも用意されていたので、これは簡単と思っていたらだめだった。msvcrt-ruby191.dll を利用しようとしている。msvcr100-ruby191.dll でないと困るのだけれど。
やはり make しなくてはだめかと奮闘した記録はまた書くとして、rubyzip を試したのだけれどこちらは使い方がやはりよくわからなくて苦労してしまった。
ふと検索していたら ReVIEW でもこの 2 月頃にそんな話をされていたようで、さて今は取り込まれたのかどうか未確認。
ひとつはフォルダ指定で処理させるとどうやらファイル名でソートして処理してしまうらしく、epub としては先頭におかなくてはいけない mimetype ファイルが先頭でなくなってしまったり、無圧縮でアーカイブできなかったりする。
ということでやや面倒ではあるものの先に mimetype だけ個別に無圧縮で処理してから、その他のファイルについてはフォルダごと処理するようにしてみた。
Zip::ZipOutputStream.open("filename.epub") {|zos|
zos.put_next_entry("mimetype","","", 0, 0)
zos.print "application/epub+zip"
}
zos.puts としてしまうと改行がはいってしまうので、epubcheck に怒られてしまう。
ZipOutputStream を使うとオプションに無圧縮も指定できるのだけれど、ファイルの内容は記述しなくてはいけないというなんというか矛盾。(あるいは方法があるのかもしれないけれど)
逆に ZipFile では無圧縮が指定できないという不便さ。
Zip::ZipFile.open("filename.epub", Zip::ZipFile::CREATE){|zf|
zf.add(file)
}
ファイルを追加していくのは便利なのだけれど。
zipruby のほうももう少しという感じはあるので、なんとか挑戦してみたいのだけれど、なかなかうまくいかないのであった。
| 固定リンク
コメント
>逆に ZipFile では無圧縮が指定できない
これが気になって、無理やり設定できるようにZip::ZipFile#addX()というパラメータ指定できるバージョンのメソッドを作りました。ただ、一部不具合で指定が上書きされてしまうので、ZipOutputStream#put_next_entry の「new_entry.compression_method = compression_method if !compression_method.nil?」
の「!」を取る必要がありました。これがあるとSTOREDを指定しても、デフォルトのDEFLATEDになってしまうので。
投稿: S.N.A. | 2013.02.05 06:26
失礼、
new_entry.compression_method = compression_method if !compression_method.nil?
↓
new_entry.compression_method = compression_method if new_entry.compression_method.nil?
つまり、「!」→「new_entry.」でした。
投稿: S.N.A. | 2013.02.05 06:35