iText7 7.1.6中的PageEventHandler上可能的内存泄漏

时间:2019-07-15 16:23:24

标签: .net memory-leaks fonts itext itext7

因此,我一直在通过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的调试窗口,如果有用的话。


修改1

我试图像这样手动设置画布中的字体

canvas.SetFont(pdfDocument.getDefaultFont());

,现在进程内存保持在30MB左右,而不是以前的200MB!我的问题已解决,但我不明白为什么会发生这种情况。

0 个答案:

没有答案