XPS

Last Updated 2011/09/21


XPS は "XML Paper Specification" の略ですが、このページに興味をもたれた人はすでに知っていることでしょう。

XPS について調べようと、WEB サイトをウロウロしてもこれといったサイトに当たることはまれです。いえ、皆無に近いといっていいかもしれません。関連するサイトが少ない理由は、企業ユーザーは興味があっても、一般の人にはピンとこないテーマだからではないかと想像します。

ともあれ、このページでは XPS についてできるだけ実践的に説明したいと考えています。


XPS とは何か?

XPS とは何かについて、WEB サイトをあたると、Microsoft の宣伝文句の受け売りが多いですね。一部には PDF と対比するところもあります。PDF よりここが劣っているといわれればそうなのかなと思わないでもありませんが、本当に劣っているのなら Microsoft が何らかの対策を立てるでしょうから、XPS の本質を説明することにはなりません。

さて、私なりに考える XPS とは何かについては、別のページを用意しましたので、そちらを参照してください。


XPS ファイルの秘密

WPF SDK の中に、XPS ファイルのサンプルが含まれています。ファイルの拡張子は .xps ですが、これを .zip に変更し、いつも使っている ZIP ファイルの解凍ソフトを起動してみてください。みごとに解凍できます。つまり、XPS ファイルは XAML ファイルを ZIP で圧縮したものです。解凍してあらわれるファイルは XAML コードなので、テキストエディタで開くことができます。

以下は、小さな XPS ファイルを解凍したあと、あらわれたフォルダーとファイルを階層表示したものです。現在の段階ではこんなものかと理解しておけばいいと思います。

XPS ドキュメント
|
|-- [Content_Types].xml
|
|-- FixedDocumentSequence.fdseq  ← (FixedDocumentSequence)
|
|--_rels
|   |
|   |-- xxx.rels
|
|-- Documents --- FixedDocument_1.fdoc ← (FixedDocument)
|              |
|              |-- 0 -- Structure -- Fragments
|                                     |
|                                     |-- 1.frag
|                                     |-- 2.frag
|-- Pages --- _rels
|          |   |
|          |   |-- FixedPage_.fpag.rels
|          |   |-- FixedPage_2.fpag.rels
|          |
|          |-- FixedPage_1.fpage  ← (FixedPage)
|          |-- FixedPage_2.fpage  ← (FixedPage)
|
|-- Resources
     |
     |-- Fonts
     |    |
     |    |-- xxxx.ODTTF
     |    |-- xxxx.ODTTF
     |
     |-- Images
          |
          |-- Image_1.png
          |-- Image_2.png

なお、.ODTTF ファイルについては「ODTTF ファイルの秘密」で詳しく説明します。


XPS ファイルを印刷する

DocumentViewer コントロールには印刷するためのツールボタンが標準で付いていますので、DocumentViewer コントロールを使う場合には必要ありませんが、プログラム内から XPS ドキュメントを印刷する手順を説明しておきます。メソッドにしておきましたので、動作は各自で確認してください。

// XPS ファイルを印刷する
// fileName : XPS ファイル名のフルパス
private void PrintXpsFile(string fileName)
{
  // 印刷ジョブ名はファイル名から拡張子を除いたファイル名とする
  // もちろん、そうしなければならないわけではない
  string jobName = Path.GetFileNameWithoutExtension(fileName);

  // ローカルプリンタサーバーを取得する
  LocalPrintServer localPrintServer = new LocalPrintServer();
  PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();

  try
  {
    PrintSystemJobInfo printJobInfo = defaultPrintQueue.AddJob(jobName, fileName, false);
  }
  catch (PrintJobException ex)
  {
    MessageBox.Show(ex.Message);
  }
}

−以上−