PDFSharp Font объекты остаются в памяти, что приводит к исключению OutOf Memory - PullRequest
0 голосов
/ 15 апреля 2020

В моей программе есть метод, который использует PDFShap для экспорта проекта пользователя в PDF. Сначала я подготовил все данные, а затем экспортировал их в PDF. Это приводит к исключению OutOfMemory, когда данных было много. Затем я изменил метод, так что каждый раз, когда одна страница заполняется, она немедленно экспортируется. Но теперь я получаю много объектов PDFSharp.Font, которые хранятся в памяти. Я попытался сделать экспорт в новую тему, что я не смог сделать. Я попытался вызвать метод Dispose для всех объектов PDFShap, установив для них значение null и создать их все с помощью оператора. Ничего не получалось. Как полностью избавиться от этих объектов PDFShap.Font?

private static void AddPageToPdf(string goalfile, PrinterPage page)
    {

        using (PdfDocument doc = File.Exists(goalfile) ? PdfReader.Open(goalfile, PdfDocumentOpenMode.Modify) : new PdfDocument(goalfile))
        {
            string temp = goalfile.Substring(0, goalfile.LastIndexOf("\\")) + "\\temp.pdf";
            int pagenumber = doc.PageCount + 1;
            FixedDocument fixedDoc = new FixedDocument();

            fixedDoc.DocumentPaginator.PageSize = page.GetSize();

            // Refresh the page content
            page.Page = pagenumber;
            page.MaxPages = pagenumber;
            page.Width = fixedDoc.DocumentPaginator.PageSize.Width;
            page.Height = fixedDoc.DocumentPaginator.PageSize.Height;

            // Create a new document page
            PageContent pageContent = new PageContent();
            FixedPage fixedPage = new FixedPage();

            // Initialize the new document page
            fixedPage.Background = Brushes.White;
            fixedPage.Width = fixedDoc.DocumentPaginator.PageSize.Width;
            fixedPage.Height = fixedDoc.DocumentPaginator.PageSize.Height;

            // Insert the current page to the document
            fixedPage.Children.Add(page);
            ((IAddChild)pageContent).AddChild(fixedPage);
            fixedDoc.Pages.Add(pageContent);


            // Save the content to a xps file as base structure for the pdf
            MemoryStream lMemoryStream = new MemoryStream();
            Package package = Package.Open(lMemoryStream, FileMode.Create);
            XpsDocument xpsdoc = new XpsDocument(package);
            XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsdoc);
            writer.Write(fixedDoc);
            xpsdoc.Close();
            package.Close();

            // Convert the xps document into a pdf document and save it
            using (var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(lMemoryStream))
            {
                PdfSharp.Xps.XpsConverter.Convert(pdfXpsDoc, temp, 0);
                lMemoryStream.Close();
                pdfXpsDoc.Close();
                using (PdfDocument singlePage = PdfReader.Open(temp, PdfDocumentOpenMode.Import))
                {
                    PdfPage pdfPage = singlePage.Pages[0];
                    doc.AddPage(pdfPage);
                    doc.Close();
                    doc.Save(goalfile);
                    //try to clean up memory
                    File.Delete(temp);
                    singlePage.Dispose();
                    doc.Dispose();

                    lMemoryStream = null;
                    package = null;
                    writer = null;
                    pdfPage = null;
                }
            }
        }
        GC.Collect();
    }

Поскольку VS не предоставляет wa для экспорта снимка из инструмента Diagnosti c (по крайней мере, ни одного, который я смог найти), я сделал снимок экрана с таблицей снимков: PDFSharp objects after first export

Это снимок экрана после того, как я экспортировал тот же проект во второй раз PDFSharp objects after second export

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...