Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将XPS文件中的每个页面转换为C#中的图像?_C#_Wpf_Image_Xps - Fatal编程技术网

如何将XPS文件中的每个页面转换为C#中的图像?

如何将XPS文件中的每个页面转换为C#中的图像?,c#,wpf,image,xps,C#,Wpf,Image,Xps,有没有一种方法可以使用C#?以编程方式将XPS文档中的每一页转换为图像?我从这篇博客文章中看到了这篇文章,似乎是为了满足您的需要 在网上搜索时,有许多付费/试用项目声称可以做到这一点(我没有尝试过任何一个,所以我不能担保/列出任何一个)。我以为你想写你自己的代码 以下是这篇博客文章的“精华”(浓缩): 请参考公认的“它真的很有帮助”(它也帮助了我)。我只想指出解决方案中的一些非常重要的问题 如果您正在实现自己的(如我的情况),那么该代码将不起作用,因为我们不会从语句中获得对特定分页器的引用 D

有没有一种方法可以使用C#?

以编程方式将XPS文档中的每一页转换为图像?我从这篇博客文章中看到了这篇文章,似乎是为了满足您的需要

在网上搜索时,有许多付费/试用项目声称可以做到这一点(我没有尝试过任何一个,所以我不能担保/列出任何一个)。我以为你想写你自己的代码

以下是这篇博客文章的“精华”(浓缩):


请参考公认的“它真的很有帮助”(它也帮助了我)。我只想指出解决方案中的一些非常重要的问题

如果您正在实现自己的(如我的情况),那么该代码将不起作用,因为我们不会从语句中获得对特定分页器的引用

DocumentPaginator paginator = seq.DocumentPaginator;
将其投射到您自己的分页器也将不起作用

此外,如果您有自己的
分页器
,该解决方案也非常复杂
因此,我开发了一个简化的解决方案,它基于这个问题的公认解决方案,并且完全按照需要工作

 // 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();
 }

非常感谢!这正是我想要的;我已经用过了,而且很有效!再次感谢!谢谢你的解决方案。您可能会认为一个相对简单的操作会比这个相当密集的代码容易得多。。。不太明显。如果文档在磁盘上,则不需要包存储。只需使用采用文件路径的构造函数重载创建XpsDocument,然后跳到
GetFixedDocumentSequence()
并从那里开始。
 // 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();
 }