将巨大的XPS文档页面转换为图像文件

时间:2016-11-27 16:58:43

标签: c# image xps xpsdocument overflowexception

我在XPS文档上有一个非常大的页面(数万像素高,并且有数万个节点和链接),我试图将其转换为图像。 XPS文档只包含一页。

在研究如何做到这一点时,解决这个问题的基本方法(主要是基于其他StackOverflow问题)似乎是这样的:

[STAThread]
static void Main(string[] args)
{
    XpsDocument xpsDoc = new XpsDocument(xpsFileName, System.IO.FileAccess.Read);
    FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();
    DocumentPage page = docSeq.DocumentPaginator.GetPage(0);

    RenderTargetBitmap renderTarget = new RenderTargetBitmap(   (int)page.Size.Width,
                                                                (int)page.Size.Height,
                                                                96,
                                                                96,
                                                                PixelFormats.Default);

    renderTarget.Render(page.Visual); //The error occurs here
}

Render调用之后,我没有为实际图像编码和文件创建添加任何代码,因为它在那时失败了。

我没有得到内存不足的异常,因为我将它构建为64位应用程序,因为我意识到此操作需要相当大的内存块。构建机器上的内存不是问题。

我得到的错误是System.OverflowException,说明:

The image data generated an overflow during processing.

此外,在我收到“ContextSwitchDeadlock”消息的过程中,说明:

The CLR has been unable to transition from COM context 0xfc55d4d8 to COM context 0xfc55d600 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

我不知道我能做些什么,因为它消失在我没写过的代码中,我看不出如何解决这个问题。

我的问题基本上是,有什么方法可以将一个或多个巨大页面的XPS文档转换为PNG图像文件吗?我试图研究的一件事是使用RenderTargetBitmap只渲染XPS页面的小块,然后将最后的所有块连接在一起形成一个图像,但是我还是找不到怎么做这个,或者甚至是可能的。

0 个答案:

没有答案