- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 itext 在 .NET 环境中生成 PDF。为了优化执行时间,我正在从 itextsharp 5.5.13 迁移到 itext 7.1.1 for .NET。
生成的 PDF 主要由图像组成。我使用多线程并行生成文档。
itext7 似乎更快,但内存使用率更高。由于我同时生成了多个文档,因此内存不足。
我用相同的输入数据运行了一个简单的测试,输出文件是 5 MB。下面是我为两个版本的库编写的代码。我的代码有问题吗?
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 的过程开始的时间。
最佳答案
我不熟悉这个库,但可能是 PdfCanvas
和 Canvas
对象在使用后没有被销毁,一直坐在内存中直到文档被销毁.根据文档,您必须在绘制图表后释放内存。
Make sure to call PdfCanvas.release() after you finished writing to the canvas.
UPD
我只是在本地运行它。在我的示例中,我达到了 500MB 的峰值。在我添加之后:
page.Flush(true);
它下降到 250MB。
引用:http://itextsupport.com/apidocs/itext7/7.0.2/com/itextpdf/kernel/pdf/PdfPage.html#flush-boolean-
UPD2
使用和不使用 page.Flush(true)
的内存使用情况
foreach (var chart in Enumerable.Range(0, 10))
{
canvas = new PdfCanvas(page, true);
imgd = ImageDataFactory.Create((byte[])converter.ConvertTo(data, typeof(byte[])));
img = new iText.Layout.Element.Image(imgd, left, bottom);
img.ScaleAbsolute(width, heigth);
new Canvas(canvas, pdf, pageSize)
.Add(img);
// this line has been added
page.Flush(true);
page = pdf.AddNewPage();
}
关于c# - 为什么 .NET 的 itext 7 使用比 itextsharp 5(多)多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49907865/
当段落长度对于 ColumnText 的宽度来说太长时,如何减少换行符的高度? 我已经尝试了以下方法,因为我看到了其他回答这个问题的问题: p.Leading = 0 但这并没有产生任何影响。 我还尝
是否可以使用 iTextSharp 将句子中的单个单词加粗?我正在处理来自 xml 的大段文本,并且我试图将几个单独的单词加粗,而不必将字符串分成单独的短语。 例如: document.Add(new
不间断空格如何用于在 PdfPTable 单元格中包含多行内容。 iTextSharp 正在用空格字符分解单词。 场景是我想要在表头中显示多行内容,例如在第一行可能显示“Text1 &”,在第二行显示
我正在从 iTextSharp 创建 PDF 以供打印。我有可变长度的文本,我希望始终以最大字体大小填充固定高度的表格单元格,而不会换行。如何做到这一点? 最佳答案 首先,您需要能够测量所选字体的文本
我想使用 iTextSharp 从 pdf 文件中检索文本。但是,我无法像在 itextsharp(itext) 的 JAVA 库中那样使用 PDFTextExtractor。我需要 readPDFO
我们想在发送之前在我们的 pdf 顶部添加一个带有用户电子邮件和名称的水印。我已经编写了执行此操作的代码,并且运行良好。我想检查这是否是最好的方法。我们希望在 pdf 的顶部将水印分成两行。 ,我使用
有没有办法使用 iTextSharp 更改 PDF 中第二页的页边距? 我现在有: Document document = new Document(PageSize.A4, 144f, 72f, 1
这其实是引用Question实际上已关闭 我正在使用 ItextSharp 5.2.1。 我想使用 PdfContentByte 使我的标题文本带有下划线。请为我提供解决方案。 最佳答案 privat
我正在使用来自 nuGet (5.5.8) 的最新 iTextSharp 库来解析 pdf 文件中的一些文本。我面临的问题是 GetTextFromPage 方法不仅从它应该返回的页面中返回文本,它还
如何在保持 itextsharp 旋转的同时缩放 pdf 页面? 我有以下内容,但我失去了轮换: public static void ScaleToLetter(string inPDF,
我必须在 pdf 中插入图像。也就是说,无论我在哪里看到文本“签名”,我都必须在那里插入签名图像。我可以通过说 absolute positions 来做到。但是,我正在寻找如何在 pdf 中找到“签
我希望使用 itextSharp 将 html 转换为 pdf。 我希望在我的 pdf 中有一个特定的样式。 我希望所有 pdf 文件都遵循特定的 CSS 类。但我不知道我必须添加那个编译器 khno
我在 ASP.NET 代码中使用 iTextSharp DLL。我正在将数据提取到数据集中并将数据集添加到 PDF 表中。 如果我的数据集有更多 100 行,那么 100 行将添加到 PDF 表中,并
如何使用 iIextSharp 为 PDF 文档设置默认字体和字体大小,以便在整个 PDF 中使用它。 最佳答案 遇到与俄语和罗马尼亚字母相同的问题(itextsharp 5.5.6.0,.net 3
我使用 PdfContentByte 在 pdf 中显示文本,因为我现在也使用 SetTextMatrix mathod 来放置该文本,当我的文本很大时它不会显示在 pdf 中显示我可以包装文本显示我
我现在正在使用 iTextSharp (5.4.5) 几个星期。这周,我在文档中的元素顺序方面遇到了一些奇怪的事情。 我正在处理包含主题和图像(图表)的 pdf 报告。 文档的格式是这样的: 自然保护
我尝试了几种方法来做到这一点,但仍然无法做到。看来 iTextSharp 需要 2 次通过情况,以便图像出现在文本顶部。所以我尝试使用内存流来执行此操作,但我不断收到错误。 Public Fu
我在 iText/iTextSharp(iTextSharp 5.3.3 通过 NuGet)中遇到了一个非常奇怪的 XFA 表单问题。我正在尝试填写静态 XFA 样式的表单,但我的更改没有生效。 我有
当我使用 itextsharp 提取文本时,我将获得文本的 x 和 y 坐标。如果我根据 xy 位置将文本从 pdf 转换为 html,则通过使用这 2 个坐标,文本位置 chnages 。得到我使用
有人可以提供示例或链接到使用 itextsharp 5.4.4 签署现有 pdf 的示例吗?理想情况下保持 pdf/pdf 的一致性?谢谢。 编辑:我理解这个问题看起来好像我没有使用谷歌等。但是,新版
我是一名优秀的程序员,十分优秀!