我正在使用itext在.NET环境下生成PDF。为了优化执行时间,我正在从itextsharp 5.5.13迁移到.NET的itext 7.1.1。
生成的PDF主要由图像组成。我使用多线程并行生成文档。
itext7似乎更快,但内存使用量更高。由于我同时生成多个文档,因此会出现内存不足的情况。
我运行了一个简单的测试,使用相同的输入数据,输出文件大小为5MB。以下是两个版本库的代码。我的代码有什么问题吗?
itextsharp 5:
时间:1:18,RAM:峰值173MB,然后稳定在65MB左右。
生成的PDF主要由图像组成。我使用多线程并行生成文档。
itext7似乎更快,但内存使用量更高。由于我同时生成多个文档,因此会出现内存不足的情况。
我运行了一个简单的测试,使用相同的输入数据,输出文件大小为5MB。以下是两个版本库的代码。我的代码有什么问题吗?
itextsharp 5:
时间:1:18,RAM:峰值173MB,然后稳定在65MB左右。
public string GenerateImagesReport(IEnumerable<IChartData> data, string basename)
{
var doc = PdfUtility.CreateDoc();
string path = Shared.BuildPdfPath(basename);
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
float left = 30f;
float bottom = PdfUtility.GetYPosition(ReportElem.Chart2);
float width = PdfUtility.CHART_WIDTH;
float heigth = PdfUtility.CHART_hEIGTH * 2 + PdfUtility.V_SPACE1 + PdfUtility.V_SPACE2 + PdfUtility.GROUP_BY;
doc.NewPage();
doc.Open();
PdfTemplate ImageTemplate;
PdfContentByte cb = writer.DirectContent;
Image img;
foreach (var chart in data)
{
// chart image
ImageTemplate = cb.CreateTemplate(width, heigth);
img = Image.GetInstance(chart.ImageBytes, true);
img.ScaleAbsolute(width, heigth);
img.SetAbsolutePosition(0, 0);
ImageTemplate.AddImage(img);
cb.AddTemplate(ImageTemplate, left, bottom);
chart.DestroyImage();
doc.NewPage();
}
doc.Close();
}
return path;
}
itext 7
时间:1:09,RAM:峰值753MB,持续到结束
public string GenerateImagesReport(IEnumerable<IChartData> data, string basename)
{
string path = Shared.BuildPdfPath(basename);
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
PdfWriter writer = new PdfWriter(fs);
var pdf = new PdfDocument(writer);
var pageSize = PageSize.LETTER;
var doc = new Document(pdf, pageSize);
float left = 30f;
float bottom = PdfUtility.GetYPosition(ReportElem.Chart2);
float width = PdfUtility.CHART_WIDTH;
float heigth = PdfUtility.CHART_hEIGTH * 2 + PdfUtility.V_SPACE1 + PdfUtility.V_SPACE2 + PdfUtility.GROUP_BY;
PdfPage page;
PdfCanvas canvas;
ImageData imgd;
Image img;
page = pdf.AddNewPage();
foreach (var chart in data)
{
canvas = new PdfCanvas(page, true);
imgd = ImageDataFactory.Create(chart.ImageBytes);
img = new Image(imgd, left, bottom);
img.ScaleAbsolute(width, heigth);
new Canvas(canvas, pdf, pageSize)
.Add(img);
chart.DestroyImage();
page = pdf.AddNewPage();
}
doc.Close();
}
return path;
}
更新
我正在使用Visual Studio Profiler监控内存使用情况。根据Yaroslav Veremenko的建议,我在内存使用方面看到了一些改进。不同的图表标记了生成PDF实际开始处理的时间。