因此,我一直在通过30天的试用许可证测试iText7。这是一个很棒的库,但是在使用页面事件处理程序时遇到了可能的内存泄漏。在只有1页或10页的文档中并不明显,但是在制作非常长的文档时,进程内存会激增至300MB。 如果我拍摄了内存快照,即使我只是使用默认的(Helvetica)字体,我在类PdfDocument的实例内部也可以看到私有属性documentFonts包含1000多种字体!
在向您展示孤立的用例之前,我想指定已经在Document构造函数中将InstantFlush设置为true。
using (var fileStream = File.Create($@"C:\Users\my.user\Desktop\test\test0.pdf", 4096, FileOptions.WriteThrough))
using (var writer = new PdfWriter(fileStream))
using (var pdfDocument = new PdfDocument(writer))
using (var doc = new Document(pdfDocument, PageSize.A4, true))
{
pdfDocument.AddEventHandler(PdfDocumentEvent.START_PAGE, new NPage());
int pages = 100000;
while(pages-- > 0) {
int paragraphsToAdd = 30;
while(paragraphsToAdd-- > 0) {
doc.Add(new Paragraph("text"));
}
doc.Add(new AreaBreak());
}
}
事件处理程序的实现方式如下:
class NPage : IEventHandler
{
public void HandleEvent(Event @event)
{
PdfDocumentEvent eventDoc = (PdfDocumentEvent)@event;
PdfDocument pdfDocument = eventDoc.GetDocument();
PdfPage page = eventDoc.GetPage();
Rectangle pageSize = page.GetPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDocument);
Canvas canvas = new Canvas(pdfCanvas, pdfDocument, pageSize);
canvas.Add(new Paragraph("text"));
canvas.Close();
pdfCanvas.Release();
}
}
基本上,我只想在每次创建新页面时将某些内容渲染到画布上。但是每次执行此行
canvas.Add(new Paragraph("text"));
pdfDocument对象的Count的私有属性 documentFonts 每次都会增加1。
如果您更改该行并将非文本内容添加到画布,则进程内存将保持28MB左右,并且不会从此处增加。我在做错什么吗?
注意:要验证使用的进程内存,我检查了VisualStudio的调试窗口,如果有用的话。
我试图像这样手动设置画布中的字体
canvas.SetFont(pdfDocument.getDefaultFont());
,现在进程内存保持在30MB左右,而不是以前的200MB!我的问题已解决,但我不明白为什么会发生这种情况。