ZIPでXMLを固めてOpenDocument

論文に手を入れていたらどんどんファイルサイズが大きくなっていって21MBに達した。

これではデータの行き来が不便だ。どうにかならんかと調べた。


MLog: [openoffice:10435] Re: 貼付画像の圧縮は可能でしょうか?

ここの回答によればそんな機能はないがそう難しくない方法で処理できるとのこと。

その手順は、

  1. 拡張子を.zipへ変更し展開
  2. Pictureフォルダ内の画像を縮小・圧縮する
  3. 展開して生成されたディレクトリ・ファイルをzipで圧縮
  4. 拡張子をOpenDocumentの拡張子に戻す

という手順で出来るようです。

Pictureフォルダ内のJPEGファイルをみるとむちゃくちゃ大きかった。そりゃ容量食うわな。

縮小専用+拡大専用 を使って画像のサイズを800×800内に収めるように上書きした。

そして圧縮。Lhazでは展開時にディレクトリを自動生成することも出来るが、そのディレクトリでなく、ファイル・ディレクトリが並んでるのをベタで圧縮する。

そして開いたらちゃんと開けた。そしてサイズも2.4MBに。かなり軽くなったね。


ところでOpenDocumentって実態はZIPなんですよね。

実は複数のファイルからなっているのだけどZIPで固めて1つのファイルにして使うものとしてはJarが有名ですね。

JavaアプリケーションはよくJarファイルとして配布されることが多いけど、

これはJavaアプリケーションの実行ファイルやリソースファイルをZIPで固めて1つのファイルとしたもの。

そのまま実行できるので圧縮されてることはあまり気にしなくていい。

OpenDocumentも同じですよね。普段圧縮されてることは気にしない。

他にFirefoxの拡張機能のxpiもそうですね。1つのファイルを配布するだけで足りると。

ちなみにOpenDocument形式はOpenOffice.orgのファイル形式が元になっている。

OOoもJavaのSunですよね。関係あるかは知らんけど。


中身はXMLファイルが並んでいる。

content.xml,meta.xml,settings.xml,styles.xmlの4つのファイルが基本となっている。

その中で参照されるファイルなども含まれているけどね。

中身を見てみたらいいが、かなり重い。テキストファイルにしては相当に重くて驚く。

論文のcontent.xmlは642KBもある。

642×1024/3/400=547.8となるから、UTF-8で日本語を400字詰め原稿用紙548枚ぐらいに敷き詰めただけの文字数があるということだ。

ただ、論文自体は12万7千字(付録のソースコード含む)にすぎない。プレーンテキストで書き出すと152KBだ。

一体なぜこれほどにふくれあがったのか。理由はそれがXMLだからだ。

ブラウザで開いて見たらタグだらけだった。XMLはタグで食われる分が多いんでね。それがつらい。

テキストファイルのサイズなんて高々知れてるわと思っていてもこの量になるとさすがにどうかと思う。


そこでOpenDocument形式ではこれらのファイルをZIPで圧縮するということをしているわけだ。

テキストファイルというのは圧縮の効果が大きい。なのでZIPで圧縮すればかなりファイルサイズは小さくなる。

content.xmlをZIPで圧縮すると71KBまで減る。さすがは冗長と評判のXMLである。

ここまで圧縮できればXMLを使っていたとしてもあまり気にするほどのことではないか。

XMLとZIPの組み合わせというのはなかなか合理的な話なのです。

1つのファイルにできるだけでなくXMLという便利なものを使いながらも容量を抑えられると。


ちなみにMicrosoftがOffice 2007で採用したOffice Open XMLもほぼ同様の構造を持っている。

どういうわけかしらんがOpenDocumentでなく自分で新しくフォーマットを作ったんだな。

ほぼ同じものを作るぐらいならOpenDocument使えと思うんだけどね。ほぼ同じものだけどこれも標準化されている。

Office Open XML対応の成果なのか、OpenDocumentの読み書きもできるようになったけどね。

ただ使ったけどいまいちだったかなぁ。なんかぐちゃぐちゃになってしまった。

逆にOffice Open XML形式をOOoで読み込む方がよいようだ。これも標準化の成果か。

しかしなぁ、それはMSOfficeがOpenDocumentに対応してない可能性が高いってことだろ。それはいかんだろ。

もっともOpenDocumentは使うソフトにより表示に若干の違いがでることはありえますけどね。