2017-06-15 759 views
-2

我已经测试了iTextsharp和iText7,用于HTML到PDF的转换。基于性能iTextsharp为创建10000 PDF需要3分钟的时间。但iText7需要17分钟才能创建10000个PDF。由于iText7是与iTextsharp相比的新版本,因此我决定将iText7用于商业目的。但性能明智的iText7是低。所以请告诉我如何提高iText7中HTML到PDF转换的性能?iText7与iTextSharp相比的性能问题

测试中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搭接更多时间放置相比iTextSharp的中提到的路径PDF文件。

编辑:复制/在其他问题的HTML贴:基于我在我发出HTML文件MR.Amedee范Gasse路径iText7 Performance Issue Compared With iTextSharp问题

。所以,请告诉我如何提高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 

的成员如果我评论说的代码和运行两行ning我的程序一个错误出现在转换器代码中,即(HtmlConverter.ConvertToPdf(HTML,writer,converterProperties))

错误是:“.pdf间接对象属于其他PDF文档。复制对象到当前的PDF文档。”

因为coverterproperties是在退出循环这个错误出现的。如果我把它工作正常,内环路这一切属性...但是这是正确的性能明智..?

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

+0

如何提供HTML我不知道..? – NARAN

+0

我已经在ItextSharp中使用Htmlworker ...但这不是问题...我问了iText7如何提高性能。 – NARAN

+0

在你引用的路径:stackoverflow.com/q/44514437/766786有没有解决方案.. – NARAN

回答

2

您的问题的答案很简单:在iText集团,我们不断改进iText软件,当然还有改进性能的空间。无法使pdfHTML插件像过时的HTMLWorker一样快。原因很简单:HTMLWorker不支持CSS,仅支持HTMLWorker小选择标签,等等...... HTMLWorker是非常简单的,只是用于简单的需求。

我们创建了pdfHTML插件来支持CSS(包括添加页眉,页脚,页码等功能)。我们支持大量的HTMLWorker不支持的HTML标签。我们支持pdfHTML中元素的绝对定位。所有这些功能都带有成本。这个成本是CPU。

在比较CPU使用情况HTMLWorker与pdf使用情况时,在智力上不公平。

这就是说:你可以通过使用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施放器厂家,缺省字体提供者,默认的媒体描述,默认轮廓处理程序和默认标记工作器工厂。所有这些对象的创建都需要一点点时间,但是当您将该时间乘以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); 
+0

好的我明白了......如果你可以使用ConverterProperties提供示例代码,我想匹配我的代码... – NARAN

+0

我已经更新了我的答案。请注意,接受有用的答案是自定义的。例如:你表示我的问题的答案[需要iText7 HTML到PDF加密代码在C#](https://stackoverflow.com/questions/44512926/need-itext7-html-to-pdf-encryption-code-in -c-sharp)很有帮助,但你从未接受过这个答案。这是一个混杂的信息;它说“你帮了我,但我不感谢你的帮助。” –

+0

@NARAN如果您不知道如何接受答案,您只需点击左上角的勾号即可。 – mkl