代码之家  ›  专栏  ›  技术社区  ›  Kaveh Shahbazian

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

  •  7
  • Kaveh Shahbazian  · 技术社区  · 15 年前

    有没有一种方法可以使用C#以编程方式将XPS文档中的每个页面转换为图像?

    2 回复  |  直到 15 年前
        1
  •  11
  •   Edward Leno    15 年前

    我偶然发现了这篇博客文章 Josh Twist 你想怎么做就怎么做。

    Cracking an XPS in WPF

    在网上搜索,有许多付费/试用程序声称这样做(我没有尝试过他们中的任何一个,所以我不能保证/列出他们中的任何一个)。我以为你想自己写代码。

    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));
    }
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    请参考已接受的 answer

    如果你正在实现你自己的 DocumentPaginator

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