1

我在尝试将其转换为图像的 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 位应用程序,因为我确实意识到此操作需要相当大的内存块。构建机器上的内存不是问题。

我得到的错误是 a 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 页面的小块,然后在最后将所有块连接到一个图像中,但是我无法找到如何做这个,或者如果它甚至可能的话。

4

0 回答 0