しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

XPS をラスタライズする

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 ベースとだけあって想像以上に使いやすくなっています。