【Writer】 OpenOffice.org Writer のファイル形式 *.odt も分解してみた。

OpenOffice.org の表計算ツール Calc のファイル形式(*.ods)が、実はZIP圧縮されたXML形式だったことを知った。だったらもしかして、ワープロツール Writer のファイル形式(*.odt)もZIPなんじゃないかということでやってみたら、やっぱりZIPだった。

というわけで、今回はその *.odt ファイルの中身を少し覗いてみた。

ファイル構成

*.odt (サンプルファイル001)をZIP解凍してみたら、次のようなファイルとディレクトリが得られた。

  • ※サンプルファイルは拡張子を *.zip にしてあるので、 *.odt に変更して開いてください。
Configurations2 (Directory)
????
META-INF (Directory)
????
Pictures (Directory)
文書に挿入された画像が格納される。(挿絵がない場合は存在しない)
Thumbnails (Directory)
サムネイル画像が格納されるディレクトリ。
content.xml
文書の本体。
meta.xml
メタ情報が書かれたXML。
mimetype
MIME Type を定義している?
settings.xml
各種設定を格納しているらしいXML。プリンターの設定情報なども含まれている。
styles.xml
スタイルシートの役割らしいXML。印刷スタイルっぽい記述も見られる。

Picturesディレクトリは、文書中に画像が挿入されている場合だけ生成されるようだ。

表計算形式(*.ods)とだいたい似たようなファイル構造になっている。ならばおそらく、content.xml に主な内容が書いてあるのだろう。/office:document-content/office:body/office:text の中に、文書構造らしい記述が見られる。

<?xml version="1.0" encoding="UTF-8"?>
<office:document-content>
  <!-- ~省略~ -->
  <office:body>
    <office:text>
      <text:sequence-decls>
        <text:sequence-decl text:display-outline-level="0" text:name="Illustration" />
        <text:sequence-decl text:display-outline-level="0" text:name="Table" />
        <text:sequence-decl text:display-outline-level="0" text:name="Text" />
        <text:sequence-decl text:display-outline-level="0" text:name="Drawing" />
      </text:sequence-decls>
      <text:p text:style-name="P1">ワープロ的文書表現のためのサンプルテキスト。</text:p>
      <text:p text:style-name="P1">テストです。テストです。</text:p>
    </office:text>
  </office:body>
</office:document-content>

文書構造を示すタグ

基本的な文書構造をマークアップしているっぽいタグを調べてみた。
OpenOffice.org の Writer はワープロツールなので、いわゆるドキュメントを作るのが主目的。ならばおそらく、HTMLと似た感じなんじゃないかしら。

以下、content.xml 内のソースコードを幾つか載せているが、実際の記述はだいぶ長いためかなり省略して掲載したので要注意。詳しくは サンプルファイル002 を解凍して実物を確認されたし。

  • ※サンプルファイルは拡張子を *.zip にしてあるので、 *.odt に変更して開いてください。

段落

普通に書いたテキストは <text:p>タグで囲われた。おそらくこれは、HTMLの<p>タグに相当するのだろう。

<text:p>段落。段落。</text:p>

改行

改行は、HTMLでいうところの<br>タグ。ODTでは <text:line-break>タグが対応している模様。

<text:p>段落中の改行は<text:line-break />こうです。</text:p>

見出し

見出しを置いてみたら <text:h>タグが作られた。

<text:h text:outline-level="1">大見出し</text:h>
<text:h text:outline-level="2">中見出し</text:h>
<text:h text:outline-level="3">小見出し</text:h>

HTMLでは<h1><h2><h3> にそれぞれ相当するであろう要素だが、ODTでは全部 <text:h>タグ1発で全部表現するようだ。その代わり、text:outline-level属性が見出しの大きさを表している。(styles.xml を覗くと、見出しレベルは1~10までありそうに見える)

箇条書きリストと通し番号付きリスト

箇条書きリストは <text:list>タグと <text:list-item>タグで表現された。これはHTMLで言うところの<ul>タグと <li>タグに相当する。

<text:list>
  <text:list-item><text:p>リストAAAA</text:p></text:list-item>
  <text:list-item><text:p>リストBBBB</text:p></text:list-item>
  <text:list-item><text:p>リストCCCC</text:p></text:list-item>
</text:list>

HTMLでは<ol>タグで表される通し番号のリストについては、特に専用のタグは用意されていないようだ。構造ではなく、スタイルだけで区別されているらしい。

<!-- ヘッダ部 -->
<office:automatic-styles>
  <text:list-style style:name="L1">
    ~ 長いので割愛 ~
  </text:list-style>
</office:automatic-styles>

<!-- ボディ部 -->
<office:body>
  <office:text>
    <text:list text:style-name="L1">
      <text:list-item><text:p>リストAAAA</text:p></text:list-item>
      <text:list-item><text:p>リストBBBB</text:p></text:list-item>
      <text:list-item><text:p>リストCCCC</text:p></text:list-item>
    </text:list>
  </office:text>
</office:body>

こんな感じ。
・・・ちょっと省略しすぎたか。サンプルファイルを確認していただきたい。

表組み

表組みを挿入した箇所には、次のような記述がされている。

<table:table table:name="表1">
  <table:table-column table:number-columns-repeated="2" />
  <table:table-row>
    <table:table-cell office:value-type="string">
      <text:p>見出しセルA1</text:p>
    </table:table-cell>
    <table:table-cell office:value-type="string">
      <text:p>見出しセルB1</text:p>
    </table:table-cell>
  </table:table-row>
</table:table>

いろんな属性やらがついていたのでだいぶ省略したが、だいたい骨格はこんな感じ。<table:table><table:table-row><table:table-cell>が、それぞれHTMLの<table><tr><td> に相当しているっぽい。<th>に相当する記述はなく、スタイルで見出しセルっぽく見せているだけのようだ。<table:table-column>は、HTMLの<colgroup>とか<col>とかに相当するのかな?詳細は不明。

画像

画像を挿入すると、<draw:image>タグが生成される。

<draw:image
  xlink:href="Pictures/10000000000001B8000001251A1A0C8D.jpg"
  xlink:type="simple"
  xlink:show="embed"
  xlink:actuate="onLoad"
/>

xlink:href属性が、挿入した画像を指している。画像の実体は、Picturesフォルダの中に格納されていた。

他にも幾つか属性がついているが、意味はよくわからない。

強制改ページと自然改ページ

強制改ページを挿入した付近には、改ページを示しそうなタグは見当たらなかった。
その代わり、text:style-name"P3" が指定された空白の段落が置かれている。

<text:p text:style-name="P3" />

"P3" には、次のようなスタイルの記述が紐づいているようだ。

<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Text_20_body">
  <style:paragraph-properties fo:break-before="page"/>
  <style:text-properties style:language-asian="ja" style:country-asian="JP"/>
</style:style>

おそらく、<style:paragraph-properties fo:break-before="page" /> の記述が、強制改ページを示しているのだろう。改ページは文書構造じゃなくてスタイルとして扱うようだ。HTMLで使うCSSの page-break-beforeと同じだ。

自然改ページされている箇所には <text:soft-page-break />というタグがあった。

<office:body>
  <office:text text:use-soft-page-breaks="true">
    <text:p><text:soft-page-break />テキストテキスト。</text:p>
  </office:text>
</office:body>

<office:text>タグに text:use-soft-page-breaks="true" という属性が足されているのが気になる。これがついてないと <text:soft-page-break /> されないのかな?

そもそもこんなタグがあるくらいだから、もしかしたら明示してあげないと改ページされないのか・・・? と一瞬心配したが、削除してみてもちゃんと自動改ページされた。うーむ・・・。

まとめ

とりあえずザックリと駆け足で覗いてみたが、もっといろいろいじくってみたら扱えそうな感じ。シェイプ系の図やグラフなんかを入れてみたりしたらどうなるかとか、試してみたい。あと、目次や参照系、ヘッダ/フッタ系も。

ちゃんと深く解析できたら、動的に生成する印刷目的文書形式として、なかなかいい選択肢になるんじゃないだろうか。という可能性は感じる。

また気が向いたら深堀りしてみます。

この調査で作ってみたファイル:

  • ※サンプルファイルは拡張子を *.zip にしてあるので、 *.odt に変更して開いてください。

プロフィール

コヤナギ トモヤ

ウェブ系エンジニアしてます。ウェブデザイナー、ウェブディレクターとしてウェブ制作の仕事に携わり、今はエンジニア職に流れ着きました。誰かのお仕事をちょっとだけ効率化するような支援ツールの開発が好き。オープンソースとMITライセンス大好き。人生後半は自由と民主主義のコントリビューターとして過ごす予定。

ウェブ制作支援ツール Pickles 2 をオープンソースで開発しています。

PHP/JavaScript/NodeJS/nwjs/Laravel/Pickles2/オープンソース/心理学/倫理/自由と民主主義

RSSフィード

ページの先頭へ戻る