有没有办法使用 C# 以编程方式将 XPS 文档中的每一页转换为图像?
问问题
4721 次
2 回答
11
我遇到了Josh Twist的这篇博客文章,它似乎可以满足您的要求。
在网上搜索时,有许多付费/试用程序声称可以这样做(我没有尝试过任何一个,所以我不能保证/列出任何一个)。我假设您想编写自己的代码。
这是博客文章的“肉”(浓缩):
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 回答