与 iTextSharp 相比的 iText7 性能问题
iText7 Performance Issue Compared With iTextSharp
我已经测试了 iTextsharp 和 iText7 HTML 到 PDF 的转换。基于 iTextsharp 的性能,创建 10000 个 PDF 需要 3 分钟。但是 iText7 创建 10000 个 PDF 需要 17 分钟。由于 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-Revamp\TestHTML\test.html")
Do While objReader.Peek() <> -1
stringReader = stringReader & objReader.ReadLine() & vbNewLine
Loop
ReadFile = stringReader
End Function
我使用上面的代码来测试性能...iText7 Tacking 与 iTextSharp 相比,将 pdf 文件放置在提到的路径中的时间更多。
编辑:copy/paste 的 HTML 在另一个问题中:
根据我在路径 中的问题,我已将 HTML 文件发送给 MR.Amedee Van Gasse。所以请告诉我如何提高 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-Revamp\TestHTML\newlog.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>
在我应用以下代码后,ConverterProperties 中出现两个错误
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:\iText7\itextkey-0.xml")
Dim PDF = "E:\iText\testpdf " & 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 indirect object belongs to other PDF document. Copy object to current pdf document."
由于 coverterproperties 处于循环之外,因此出现此错误。如果我将所有属性都放在循环中,它可以正常工作...但这对于性能而言是否正确..?
请帮我解决这三个错误..?
您的问题的答案很简单:在iText Group,我们一直在不断改进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);
我已经测试了 iTextsharp 和 iText7 HTML 到 PDF 的转换。基于 iTextsharp 的性能,创建 10000 个 PDF 需要 3 分钟。但是 iText7 创建 10000 个 PDF 需要 17 分钟。由于 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-Revamp\TestHTML\test.html")
Do While objReader.Peek() <> -1
stringReader = stringReader & objReader.ReadLine() & vbNewLine
Loop
ReadFile = stringReader
End Function
我使用上面的代码来测试性能...iText7 Tacking 与 iTextSharp 相比,将 pdf 文件放置在提到的路径中的时间更多。
编辑:copy/paste 的 HTML 在另一个问题中:
根据我在路径
<div id = "headerdiv" style="width:540px; float:left; background:#ededed; padding:30px; overflow:hidden;">
<br>
<br>
<br>
<div>
<img border='0' src='D:\AS1-Revamp\TestHTML\newlog.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>
在我应用以下代码后,ConverterProperties 中出现两个错误
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:\iText7\itextkey-0.xml")
Dim PDF = "E:\iText\testpdf " & 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 indirect object belongs to other PDF document. Copy object to current pdf document."
由于 coverterproperties 处于循环之外,因此出现此错误。如果我将所有属性都放在循环中,它可以正常工作...但这对于性能而言是否正确..?
请帮我解决这三个错误..?
您的问题的答案很简单:在iText Group,我们一直在不断改进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);