Преобразование огромной страницы документа XPS в файл изображения
У меня есть нелепо большая страница (десятки тысяч пикселей в высоту и ширину, с десятками тысяч узлов и ссылок) в документе XPS, который я пытаюсь преобразовать в изображение. Документ XPS содержит только одну страницу.
При исследовании того, как это сделать, основным способом решения этой проблемы (в основном на основе других вопросов Stackru), по-видимому, является нечто вроде:
[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, а затем объединить все куски вместе в конце в одно изображение, однако я не смог выяснить, как это сделать это, или если это вообще возможно.