В моей программе есть метод, который использует 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 (по крайней мере, ни одного, который я смог найти), я сделал снимок экрана с таблицей снимков:
Это снимок экрана после того, как я экспортировал тот же проект во второй раз