我们有一个程序可以根据输入的信息创建 PDF。生成的 PDF 范围从单页到 1000 多页。我们之前使用 Net 6 和 iText7.pdfhtml - 4.0.2 没有任何问题,但是在升级到 Net 8 和 iText7.pdfhtml - 5.0.3 后,我们注意到生成 PDF 时内存使用量出现峰值(PDF 越大)大小越大,内存使用量越大)。当
时会出现内存使用高峰HtmlConverter.ConvertToPdf(html, pdfDocument, properties);
被称为。创建 PDF 期间使用的内存在完成后不会被释放。
在我们的 IIS 服务器上,使用的内存存储在第 2 代堆中,并且不被垃圾收集器收集。最终我们的服务器将耗尽内存并且应用程序池将重新启动。
if (!string.IsNullOrEmpty(html))
{
using (var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream))
{
var watermark = isDraft ? "DRAFT" : string.Empty;
ConverterProperties properties = new ConverterProperties();
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
if (landscape)
pdfDocument.SetDefaultPageSize(PageSize.A4.Rotate());
PdfDocEventHandler handler = new PdfDocEventHandler(formDocument.ConfirmationID, formDocument.SubmittedDate, watermark);
pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, handler);
HtmlConverter.ConvertToPdf(html, pdfDocument, properties);
pdfOut = AddPageNumbers(workStream.ToArray(), formDocument.ConfirmationID, formDocument.SubmittedDate);
}
}
使用 NetBrains,我们能够识别内存使用的主要罪魁祸首来自 iText.Layout.Borders,其中“set_Capacity”试图获取 28GB 内存。
在整个 PDF 创建过程中,我们的第 2 代堆持续稳定增长,并且垃圾收集永远不会减少堆的大小。
我们的研究一直无法找到解决方案。有没有人遇到过类似的问题/知道为什么会发生这种情况?
如果您提供一个 html 文件来重现,将会有很大帮助。如果问题无法重现,那么 PdfDocEventHandler 的代码也会很有用。