XPSについて熱く語ってみよう!
XPSについては前にもこのブログについて書いてきましたけど、XPSの情報は国内ではまだ乏しいので今日は色々とまとめて書いていこうと思います。XPSの仕様はかれこれ半年くらい前(2006年10月)にFIXしたものだからそろそろ国内の情報があっても思うのだけどなかなかないですね。日本人は自分の持っている知識をあまり広めようとかさらけ出そうとかいう文化、意欲がないということもあるんですかね。
さて、一気にがっつりと書いていきます!ここに書かずWikiに書けばいーじじゃない、という突っ込みはなしです。。
XPSって何ぞ?
XPS(XML Paper Specification)とは、XML形式で記述される次世代電子ドキュメントフォーマットです。XPSは単に電子ドキュメントとしてのフォーマットのみならず、スプーラ、PDLとしても扱われます(XPSDrvにおいての話。*1)。仕様としては、XPS記述の仕様としての「Open XML Markup Compatibility」とパッケージングの仕様としての「Open Packaging Conventions」からなります。これら二つの仕様はECMA承認済みで、ISO標準化の予定されているようです。この2つの仕様からもわかるとおり、XPSというものはすべてのドキュメント情報をXMLで記述し、それをZIP圧縮によりパッケージングしたものです。(以外の情報はhttp://d.hatena.ne.jp/TechCollab/20070302を参照)
具体的な構造は?
下の図はXPSのドキュメントのサンプルです。これを基に解説していきます。
上のXPSをZIP解凍すると、次のようなフォルダ構造となっていることがわかります。
これら様々なファイルから構成されていることがわかりますが、基本的な構造は次の通りです。つまり、FlowDocumentSequenceをトップとしてFixedDocument、FixedPageときて、その下のCanvas、Path、Glyphsがきます。ページのレンダリングは基本的にCanvas、Path(ベクター描画)、Glyph(テキスト描画)の3つの要素により定義され、その定義に対してページ、ドキュメント、ジョブといったイメージで階層化がされています。
- FixedCocumentSequence
たとえば、root直下にある、FixedDocumentSequence.fdweqには次のようなものが記述されています。つまり、FixedDocumentへの参照情報が記述されてます。
<FixedDocumentSequence> <DocumentReference Source="Documents/1/FixedDocument.fdoc"/> </FixedDocumentSequence>
- FixedDocument
じゃあそのFixedDocument.fdocを見に行くと次のように記述されています。つまりこのドキュメントは4つのページから構成され、X.fpageないに
そのページレンダリング情報が記述されているということがわかります。
<FixedDocument> <PageContent Source="Pages/1.fpage"/> <PageContent Source="Pages/2.fpage"/> <PageContent Source="Pages/3.fpage"/> <PageContent Source="Pages/4.fpage"/> </FixedDocument>
- FixedPage
ページ情報は下のようになってます。Canvasがあってその中にテキストのGlyphsとベクター描画のためのPathがあるという感じ
ですね。WPFをわかる人はRenderTransformとかで親しみがあるものかと思います。
<FixedPage xml:lang="en-us" Width="816" Height="1056"> <Canvas RenderTransform="1, 0, 0, 1, 26.6666666666667, 626.623333333333"> <Glyphs OriginX="0" OriginY="16.0866666666667" FontRenderingEmSize="16" FontUri="/Resources/c6e9ec40-844d-4ffb-9833-1b0ed10b2ded.ODTTF" UnicodeString="Text Data"/> <Path Fill="{StaticResource b1}" Data="F0 M 0, 0 L 468.27, 0 468.27, 241.91 0, 241.91Z"/> </Canvas> </FixedPage>
- *_PT.xml
上の解凍後のドキュメント内に〜PT.xmlというファイルがあることがわかりますが、ここにはPrintTicketの情報が書かれています。PrintTicketはDEVMODEのようなものです。ベンダー固有の設定は独自のnamespaceにより定義しているようです。PrintTicketはページにのみならずドキュメント単位、ジョブ単位においても付与することができます。その際はうまく情報が継承されるようになっています。
<?xml version="1.0" encoding="UTF-8" ?> <psf:PrintTicket xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" xmlns:ns0000="http://schemas.microsoft.com/windows/printing/oemdriverpt/HP_LaserJet_4_6_0_5278_0_" xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords"> <psf:Feature name="psk:PageMediaSize"> <psf:Option name="psk:ISOA5" /> </psf:Feature> <psf:Feature name="psk:PageOrientation"> <psf:Option name="psk:Portrait" constrained="psk:None"> <psf:Property name="psk:DisplayName"> <psf:Value xsi:type="xsd:string">Portrait</psf:Value> </psf:Property> </psf:Option> </psf:Feature> </psf:PrintTicket>
- *._rels
最後に〜._relsファイルについてです。これは画像、フォントなどのリソース情報や、PrintTicket定義情報への参照が定義されています。次の例では2つのフォントへの参照と1つの画像への参照が定義されていることがわかります。
<Relationships> <Relationship Type="http://schemas.microsoft.com/xps/2005/06/required-resource" Target="../../../Resources/c6e9ec40-844d-4ffb-9833-1b0ed10b2ded.ODTTF" Id="R7066e5b8779d473a"/> <Relationship Type="http://schemas.microsoft.com/xps/2005/06/required-resource" Target="../../../Resources/b1a558ce-7ac3-4e4c-be6e-e6b96d5bc89e.ODTTF" Id="R449b3a7978b44364"/> <Relationship Type="http://schemas.microsoft.com/xps/2005/06/required-resource" Target="../../../Resources/690732f7-bfaa-4d87-af5d-f3f743974679.png" Id="R8f3c197c1bbf4992"/> </Relationships>
XPSを構成するファイルとしては大まかには上で述べてきたもののみです。
色々とXPSのドキュメント構造について一気に書いてきましたが、XPSを使った様々なソフトウェアサービスが普及してくれば、XPSも現在デファクトとして世の中を席捲しているPDFに対抗できるものとなりうるのではないでしょうか。
と、これを書きたいがためだけに1時間も使ってしまった。。
今日のネタ
上のおまけはこれに触発されてつくったものです。これはどうなんでしょうね。ターゲットとしては、たとえば電車の中刷りなどがこれに変わってコンテンツが人の手を解さないで変更できるとか、か。エコにも貢献できるし。うまく使えば富士通さんは金儲けできそうですね。なんか技術って進歩してるなーとおもわされる今日この頃。
あとは、Orcasのベータ1が出たというニュースですね。
*1:もちろん従来のGDIベースのコンバートも考慮されてます。