Chiharu の日記

絵描き C/C++ プログラマーの日記です。

XPS をレンダリングして PNG ファイルに保存する

WPFXAML に親和性があるのなら GDI と EMF のように XAML (XPS) 再生できるだろうと思って、ウェブで情報を漁りながらコンソールアプリを作ってみました。初めての C# にドキドキしますね。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;
using System.Windows.Documents;
using System.Windows.Xps.Packaging;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace xps
{
 public class Program
 {
  [STAThread]
  static public void Main(string[] args)
  {
   string path = args[0];
   double dpi = 600;
   using (XpsDocument doc = new XpsDocument(path, FileAccess.Read))
   {
    FixedDocumentSequence seq = doc.GetFixedDocumentSequence();
    DocumentPaginator pgn = seq.DocumentPaginator;
    for (int i = 0; i < pgn.PageCount; i++)
    {
     DocumentPage page = pgn.GetPage(i);

     RenderTargetBitmap target = new RenderTargetBitmap(
      (int)(page.ContentBox.Width * dpi / 96.0),
      (int)(page.ContentBox.Height * dpi / 96.0),
      dpi, dpi, PixelFormats.Pbgra32);
     target.Render(page.Visual);

     PngBitmapEncoder encoder = new PngBitmapEncoder();
     encoder.Frames.Add(BitmapFrame.Create(target));
     using (FileStream stream =
      new FileStream(path + ".Page" + i + ".png",
          FileMode.Create, FileAccess.Write))
     {
      encoder.Save(stream);
      stream.Close();
     }
    }
   }
  }
 }
}

案外、すんなり書けました。アンチェリもかかりますし、べんりべんり。

気づき

C++ と Win32API の時代は Windows.h を include するだけで大抵の API を使うことができましたが、今は個別に using & 参照するのですね。今更ながら、なんだか時代を感じました。