『Office Server Document Converter』OpenXMLSDKでマージしたdocx(Word)文書の対応

現在のOffice Server Document Converter(OSDC)(V7.0)はマージされたWord文書に対応していません。ユーザからの要望がありマージされた文書への対応を検討しています。

Word文書内のwordフォルダはいくつかのxml文書で構成されています。

document.xml 本文
fontTable.xml フォント
settings.xml セッティング
style.xml スタイル
footer1.xml フッタ
header1.xml ヘッダ
footnote.xml 脚注
endnote.xml 文末脚注
numbering.xml 箇条書き設定

などです。
OpenXMLSDKでマージした文書にはこのwordフォルダ内にマージされたWord文書がそのまま入っています。

afchunk1.docx

このdocxファイルの参照は本文中にある<w:altChunk>から行います。

 <w:altChunk r:id="AltChunkId0"/>

ファイル_rels/document.xml.relsからr:idに対応する文書を得ます。

 <Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk" Target="/word/afchunk1.docx" Id="AltChunkId0" />

これで、マージされたWord文書(Target=”/word/afchunk1.docx”)を得ることができます。

このファイルはWord文書そのものです。

<w:altChunk>というエレメントはBlock要素です。

 <xsd:group name="EG_BlockLevelElts">
    <xsd:choice>
      <xsd:group ref="EG_BlockLevelChunkElts" minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="altChunk" type="CT_AltChunk" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:choice>
  </xsd:group>

Block要素としては<w:p><w:tbl>などがあります。
これらの要素と同じように処理すればマージした文書になるはずです。

<w:p/><w:p/><w:p/>
<w:altChunk/> ここにマージ文書を挿入する
<w:p/><w:p/><w:p/>

document.xml内は

<w:document>
 <w:body>
  <w:p/>
  <w:p/>
  <w:tbl/>
  ...
  <w:p/>
 </w:body>
</w:document>

のように並んでいます。
マージするとき、 <w:document><w:body>の処理を行えば、内部は外側の文書と同じBlock要素として処理できます。問題は、あくまで別文書として処理しなければいけない。外側と、内部文書では参照するファイルが異なります。style.xmlなどは独立した設定になるはずです。

OSDCでは <w:altChunk>で指定されたWordファイルから新しいdocumentクラスを作成する。
documentクラスからページ作成を継続する。
documentクラスの処理が終了したら親のdocumentの<w:altChunk>に戻り処理を継続する。
このような実装を行っています。

今後も要望などを検討しよい製品にしていきます。