8

XPSドキュメントのすべてのページをC#を使用してプログラムで画像に変換する方法はありますか?

4

2 に答える 2

11

Josh Twistからのこのブログ投稿に出くわしました。これは、あなたが望むことをしているように見えます。

WPFでXPSをクラックする

ネットを検索すると、これを行うと主張する多くの有料/試用プログラムがあります(私はそれらのいずれも試したことがないので、それらのいずれかを保証/リストすることはできません)。私はあなたがあなた自身のコードを書きたいと思ったと思いました。

ブログ投稿の「肉」は次のとおりです(要約):

Uri uri = new Uri(string.Format("memorystream://{0}", "file.xps"));
FixedDocumentSequence seq;

using (Package pack = Package.Open("file.xps", ...))
using (StorePackage(uri, pack))  // see method below
using (XpsDocument xps = new XpsDocument(pack, Normal, uri.ToString()))
{
    seq = xps.GetFixedDocumentSequence();
}

DocumentPaginator paginator = seq.DocumentPaginator;
Visual visual = paginator.GetPage(0).Visual;  // first page - loop for all

FrameworkElement fe = (FrameworkElement)visual;

RenderTargetBitmap bmp = new RenderTargetBitmap((int)fe.ActualWidth,
                          (int)fe.ActualHeight, 96d, 96d, PixelFormats.Default);
bmp.Render(fe);

PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(bmp));

using (Stream stream = File.Create("file.png"))
{
    png.Save(stream);
}

public static IDisposable StorePackage(Uri uri, Package package)
{
    PackageStore.AddPackage(uri, package);
    return new Disposer(() => PackageStore.RemovePackage(uri));
}
于 2010-09-25T23:36:47.787 に答える
1

受け入れられた答えを参照してください。それは本当に役に立ちます(それは私にも役立ちました)。私はその解決策のいくつかの非常に重要な点に注意したいと思います。

(私の場合のように)独自のDocumentPaginatorを実装している場合、ステートメントから特定のPaginatorへの参照を取得しないため、そのコードは機能しません。

DocumentPaginator paginator = seq.DocumentPaginator;

これを自分のページネーターにキャストすることもできません。

また、あなたがあなた自身のものを持っている場合、その解決策は非常に複雑ですPaginator
そこで私は、この質問の受け入れられた解決策に基づいた単純化された解決策を開発しました。これは必要に応じて正確に機能しました。

 // create your own paginator instead of this
 // this is my specific own implementation for DocumentPaginator class
 ReportPaginator paginator = new ReportPaginator(report);

 Visual visual = paginator.GetPage(0).Visual;  // first page - loop for all

 RenderTargetBitmap bmp = new RenderTargetBitmap((int)paginator.PageSize.Width, (int)paginator.PageSize.Height, 96d, 96d, PixelFormats.Default);
 bmp.Render(visual);

 PngBitmapEncoder png = new PngBitmapEncoder();
 png.Frames.Add(BitmapFrame.Create(bmp));

 using (MemoryStream sm = new MemoryStream())
 {
     png.Save(sm);
     return sm.ToArray();
 }
于 2016-05-25T06:39:42.140 に答える