Как удалить объект PdfSharp XpsDocument при сохранении окна WPF в формате Pdf?

Я использую PdfSharp для сохранения окна WPF в PDF. Я получаю System.OutOfMemoryException при выполнении следующего кода: -

using (MemoryStream lMemoryStream = new MemoryStream())
{
    Package package = Package.Open(lMemoryStream, FileMode.Create);
    var doc = new System.Windows.Xps.Packaging.XpsDocument(package);
    XpsDocumentWriter writer = System.Windows.Xps.Packaging.XpsDocument.CreateXpsDocumentWriter(doc);

    double dpiScale = 600.0 / 96.0;
    var renderBitmap = new RenderTargetBitmap(Convert.ToInt32(this.Width * dpiScale),
                           Convert.ToInt32(this.Height * dpiScale),
                           600.0,
                           600.0,
                           PixelFormats.Pbgra32);
    renderBitmap.Render(this);
    var visual = new DrawingVisual();
    using (var dc = visual.RenderOpen())
    {
        dc.DrawImage(renderBitmap, new Rect(0, 0, this.Width, this.Height));
    }                

    writer.Write(visual);
    doc.Close();
    package.Close();

    var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(lMemoryStream);
    XpsConverter.Convert(pdfXpsDoc, _pdfFileName, 0);
}

В приведенном выше фрагменте, если я изменю значение 600,0 на 300,0 в dpiScale при создании RenderTargetBitmap, я не получу исключение OutOfMemoryException, но качество сохраненного PDF-файла будет плохим.

Как избавиться от PdfSharp XpsDocument? Я считаю, что это вызывает некоторую утечку памяти.


person KaranKakwani    schedule 19.12.2017    source источник
comment
У вас нет памяти, потому что вы, скорее всего, создаете гигантский образ. Утилизация pdfXpsDoc не поможет, потому что вы не можете избавиться от него до тех пор, пока он не будет преобразован, и именно этот процесс приводит к OOME. Попробуйте преобразовать ваше приложение в x64. Если на машине более 4 ГБ памяти, у вас будет больше места для игры. В противном случае измените размер ширины и высоты на что-то меньшее, чем то, что было при выполнении этого кода.   -  person    schedule 19.12.2017
comment
Мое приложение только 32-битное, однако RAM не проблема. OOME также происходит на машине с 8 ГБ ОЗУ. Я попытался использовать DrawRectangle вместо DrawImage с DrawingContext, но качество сохраненного PDF-файла неудовлетворительно. Пожалуйста, обратитесь к моему другому вопросу по адресу stackoverflow.com/questions/47871928/   -  person KaranKakwani    schedule 19.12.2017
comment
32-разрядные программы не могут использовать более 2 ГБ памяти — даже на компьютере с 32 ГБ. Работа в 64-битном режиме преодолевает барьер в 2 ГБ и может иметь значение.   -  person I liked the old Stack Overflow    schedule 20.12.2017
comment
Как я уже сказал, мое приложение 32-битное, и это требование. Не могу просто сделать это до 64 бит.   -  person KaranKakwani    schedule 20.12.2017
comment
@ Пользователь 241.007 Можете ли вы помочь мне с проблемой утечки памяти? Проблема с видимостью линии сетки не возникает с предоставленным фрагментом, но если я попытаюсь сохранить pdf более одного раза, я получу OOME. Должен быть какой-то способ освободить память, используемую RenderTargetBitmap. Даже если это большое изображение, я не думаю, что оно близко к 2 ГБ.   -  person KaranKakwani    schedule 20.12.2017
comment
Когда при втором запуске возникает исключение нехватки памяти, вероятно, у вас нет утечки памяти, а проблема с дизайном. Используйте значения меньше 600. Найдите IDispose и свободные объекты, которые больше не нужны. Я никогда не использовал XPS-расширение PDFsharp и понятия не имею, как превратить ваш фрагмент кода во что-то, что я мог бы протестировать на своем компьютере. И потому что я думаю, что вы на неправильном пути, я тоже не очень склонен проверять это на своем компьютере. Нужен ли вам XpsConverter, если у вас уже есть растровое изображение? PDFsharp может обрабатывать растровые изображения без XpsConverter.   -  person I liked the old Stack Overflow    schedule 20.12.2017