2017-06-15 337 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