XPS を HTML に埋め込んで表示出来たらいいなぁと思って Silverlight から XPS を読み込む方法を探っていたんですが、標準では読み込みに対応していないので予めページを画像に変換すればと思いました。XPS を C# から扱ったことがなかったのでいい機会とも。
てっとり早くコードを出します。ReachFramework を参照に加えるのを忘れずに。
var document = new XpsDocument(@"test.xps", FileAccess.Read); var sequence = document.GetFixedDocumentSequence(); var paginator = sequence.DocumentPaginator; for (int i = 0; i < paginator.PageCount; i++) { var page = paginator.GetPage(i); var bitmap = new RenderTargetBitmap((int)page.Size.Width, (int)page.Size.Height, 96, 96, PixelFormats.Pbgra32); bitmap.Render(page.Visual); var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); encoder.Interlace = PngInterlaceOption.Off; using (var fs = File.Open("page" + i + ".png", FileMode.Create)) { encoder.Save(fs); } }
やってることは XPS を読み込んで FixedDocument の集合を取得し、さらに Paginator を取得します。そして Pagenator から 1 ページに相当する DocumentPage を取得して、ページの内容を表す Visual を RenderTargetBitmap を使ってラスタライズしてます。
XAML ベースとだけあって想像以上に使いやすくなっています。