iText7 与 iTextSharp 相比的性能问题



我已经测试了iTextsharp和iText7的HTML到PDF转换。基于性能,iTextsharp需要3分钟来创建10000个PDF。但是 iText7 需要 17 分钟才能创建 10000 个 PDF。由于iText7是iTextsharp的新版本,我决定将iText7用于商业目的。但是性能明智的iText7 Low.So 请告诉我如何提高iText7中HTML到PDF转换的性能?

在 iText7 中进行测试

For i As Integer = 0 To 10000 
HTML = ReadFile '=> Read HTML file from particular location
'HTML = Replace(HTML) => To Replace the content dynamically
Dim writer As PdfWriter
Dim array() As Byte = System.Text.Encoding.ASCII.GetBytes("a")
writer = New PdfWriter(FileName, New WriterProperties().SetStandardEncryption(array, array, EncryptionConstants.ALLOW_PRINTING,
EncryptionConstants.ENCRYPTION_AES_256))
HtmlConverter.ConvertToPdf(HTML, writer)
Next

在 iTextSharp 中进行测试

Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.pdfa
Imports System.IO
Imports iTextSharp.text.html.simpleparser
Imports System.Text
Imports iTextSharp.tool.xml.html
Imports iTextSharp.tool.xml
Imports iTextSharp.tool.xml.pipeline.html
For i As Integer = 0 To 10000
HTML = ReadFile '=> Read HTML file from particular location
'HTML = Replace(HTML) => To Replace the content dynamically
Dim bPDF As Byte()
Dim ms As New MemoryStream
Dim doc As Document
doc = New Document(PageSize.A4, 25, 25, 25, 25)
Dim txtReader As New StringReader(Html)   
Dim oPdfWriter As PdfWriter
oPdfWriter = PdfWriter.GetInstance(doc, ms)
oPdfWriter.SetEncryption(iTextSharp.text.pdf.PdfWriter.ENCRYPTION_AES_128, "q", "a", 2)
Dim htmlWorker As New HTMLWorker(doc)       
doc.Open()
htmlWorker.StartDocument()      
htmlWorker.Parse(txtReader)
htmlWorker.EndDocument()
htmlWorker.Close()
doc.Close()
bPDF = ms.ToArray()
Dim FIleName As String = "D:ItextSharp_" & Now.ToString("ddMMyyyyHHMMssffffff") & ".pdf"
File.WriteAllBytes(FIleName, bPDF)
Next

Function ReadFile()
Dim stringReader As String = ""
Dim objReader As New System.IO.StreamReader("D:AS1-RevampTestHTMLtest.html")
Do While objReader.Peek() <> -1
stringReader = stringReader & objReader.ReadLine() & vbNewLine
Loop
ReadFile = stringReader
End Function

我使用上面的代码来测试性能...iText7 与 iTextSharp 相比,有更多的时间将 pdf 文件放在提到的路径中。

编辑:在另一个问题中复制/粘贴 HTML:

根据我在路径iText7性能问题中的问题与iTextSharp相比,我已经为MR发送了HTML文件。阿梅迪·范·加斯。所以请告诉我如何提高iText7的性能。

<div id = "headerdiv" style="width:540px; float:left; background:#ededed; padding:30px; overflow:hidden;">
<br>
<br>
<br>
<div>
<img border='0' src='D:AS1-RevampTestHTMLnewlog.bmp' width='100' height='40'>
</div>
<p style="color:Red;align=center;" >                         Details</p>
<br>
<br>
<table >
<tr  border='0'>
<td  bgcolor='Green'>
<font size="3" color="white">
SDetails
</font>
</td>
</td>
</tr>
<tr border='0'>
<td>
<div id="dvKYC">
<table  border='1'>
<tr>
<td><#lsName#></td>
<td>No:<#lsno#></td>
</tr> 
<tr  border='1'>
<td width=500><#lsAddess#></td>
<td></td>
</tr>
<tr>
<td><#lsContacts#></td>
<td> </td>
</tr> 
</table>
</div>
</td>
</tr>
</table>
<br>
<div >
<table >
<tr  border='0'>
<td  bgcolor='Green'>
<font size="3" color="white">
Status
</font>
</td>
</td>
</tr>
</table>
<table style="width:100%;">
<tr  bgcolor=gray >
<td style="width:30%;text-align: left; font-weight: bold;">UUH  </td>
<td style="width:20%;text-align: left; font-weight: bold;">PN</td>
<td style="width:20%;text-align: left; font-weight: bold;">KC </td>
<td style="width:20%;text-align: left; font-weight: bold;">CC</td>
</tr>
<tr>
<td  style"width:200px;"><#lsHs#></td>
<td ><#lsPN#></td>
<td><#lsKC#></td>
<td><#lsCC#></td>
</tr>
</table>
</div>

<div >
<table >
<tr  border='0'>
<td  bgcolor='Green'>
<font size="3" color="white">
STD
</font>
</td>
</td>
</tr>
</table>

<##TT##>

</div>

应用以下代码后,转换器属性中出现两个错误

1.setCreateAcroForm 不是 iText.Html2pdf.ConverterProperties 的成员

2.setOutlineHandler 不是 iText.Html2pdf.ConverterProperties 的成员

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim converterProperties As ConverterProperties = New ConverterProperties
With converterProperties
.SetBaseUri(".")
.setCreateAcroForm(False)
.SetCssApplierFactory(New DefaultCssApplierFactory())
.SetFontProvider(New DefaultFontProvider())
.SetMediaDeviceDescription(MediaDeviceDescription.CreateDefault())
.setOutlineHandler(New OutlineHandler())
.SetTagWorkerFactory(New DefaultTagWorkerFactory())
End With
Dim HTML = ReadFile("Input_Template")
For i = 0 To 10000
LicenseKey.LoadLicenseFile("C:iText7itextkey-0.xml")
Dim PDF = "E:iTexttestpdf " & i & ".pdf"
Dim m As New MemoryStream
Dim writer As PdfWriter
Dim array() As Byte = System.Text.Encoding.ASCII.GetBytes("a")
writer = New PdfWriter(PDF, New WriterProperties().SetStandardEncryption(array, array, EncryptionConstants.ALLOW_PRINTING,
EncryptionConstants.ENCRYPTION_AES_256))
HtmlConverter.ConvertToPdf(HTML, writer, converterProperties)
Next
End Sub

如果我评论两行代码并运行我的程序,则转换器代码行中出现错误,即(HtmlConverter.ConvertToPdf(HTML,writer,converterProperties))

错误是:"pdf 间接对象属于其他 PDF 文档。将对象复制到当前 pdf 文档。

由于 coverterProperties 处于循环外,因此会出现此错误。 如果我把所有属性都放在循环中,它可以正常工作......但这在性能方面是正确的..?

请帮助我解决这三个错误..?

您的问题的答案很简单:在iText集团,我们正在不断改进iText软件,并且肯定有提高性能的空间。但是,我们将永远无法使pdfHTML插件像过时的HTMLWorker一样快。原因很简单:HTMLWorker不支持 CSS,HTMLWorker只支持一小部分标签,等等......HTMLWorker非常简单,仅用于简单的需求。

我们创建了pdfHTML插件来支持CSS(包括添加页眉,页脚,页码等的功能)。我们支持许多HTMLWorker中不支持的 HTML 标记。我们支持在pdfHTML中元素的绝对定位。所有这些功能都需要付费。这个成本就是CPU。

HTMLWorker的 CPU 使用率与 pdfHTML 的 CPU 使用率进行比较在智力上是不公平的。

话虽如此:通过使用ConverterProperties,您已经可以节省大量时间。现在,您不提供任何ConverterProperties。这意味着 iText 必须实例化您正在创建的每个 PDF 的默认属性。如果您预先创建ConverterProperties并重用它们,您已经可以节省大量时间,但您必须了解 pdfHTML 提供的额外功能需要 CPU 成本。

以下是您创建ConverterProperties实例的方式:

ConverterProperties converterProperties = new ConverterProperties()
.setBaseUri(".")
.setCreateAcroForm(false)
.setCssApplierFactory(new DefaultCssApplierFactory())
.setFontProvider(new DefaultFontProvider())
.setMediaDeviceDescription(MediaDeviceDescription.createDefault())
.setOutlineHandler(new OutlineHandler())
.setTagWorkerFactory(new DefaultTagWorkerFactory());

如您所见,我们创建了大量默认对象:默认的 CCS Applier 工厂、默认字体提供程序、默认媒体描述、默认大纲处理程序和默认标记工作器工厂。创建所有这些对象会花费一点点时间,但是当您将该时间乘以 10,000 因为创建 10,000 个文档而花费时,创建这些默认对象所需的 CPU 可能会变得很重要,并且当您将 HTML 文件转换为 PDF 时会发生什么,如下所示:

HtmlConverter.convertToPdf(
new FileInputStream("resources/test.html"),
new FileOutputStream("results/test.pdf"));

由于您没有添加ConverterProperties参数,iText 将在内部为您转换的每个文稿创建一个新的ConverterProperties实例。ConverterProperties的所有默认组件都将null,这意味着对于每个文档,您都会创建 CSS Applier 工厂、字体提供程序等的新实例......需要创建。

如果您预先创建一个ConverterProperties(仅一次)以及所有组件,它将为您节省一些时间(但不是那么多)。因此,在将 HTML 转换为 PDF 时重用该对象非常重要:

HtmlConverter.convertToPdf(
new FileInputStream("resources/test.html"),
new FileOutputStream("results/test.pdf"),
converterProperties);

最新更新