【问题标题】:iText7 Performance Issue Compared With iTextSharpiText7 与 iTextSharp 相比的性能问题
【发布时间】:2017-11-17 11:33:44
【问题描述】:

我已经测试了 iTextsharp 和 iText7 的 HTML 到 PDF 转换。基于性能 iTextsharp 创建 10000 个 PDF 需要 3 分钟。但是 iText7 创建 10000 个 PDF 需要 17 分钟。由于 iText7 与 iTextsharp 相比是新版本,因此我决定将 iText7 用于商业目的。但是性能方面 iText7 很低。所以请告诉我如何提高 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 文件放置在提到的路径中的时间更多。

编辑:在其他问题中复制/粘贴 HTML:

基于路径 iText7 Performance Issue Compared With iTextSharp 中的我的问题,我已为 MR.Amedee Van Gasse 发送了 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-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 间接对象属于其他 PDF 文档。将对象复制到当前 pdf 文档。”

由于coverterproperties 处于循环之外,因此会出现此错误。如果我将所有属性都放在循环中,它可以正常工作...但这对于性能而言是否正确..?

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

【问题讨论】:

  • 如何提供我不知道的 HTML..?
  • 我只在 ItextSharp 中使用过 Htmlworker ......但这不是问题......我询问了 iText7 如何提高性能。?
  • 在您的引用路径中:stackoverflow.com/q/44514437/766786 没有解决方案..
  • 如果我问另一个问题,那么这个问题将如何继续......?
  • 那么好的先生...您已经编辑...请我想要解决方案

标签: vb.net pdf itext performance-testing itext7


【解决方案1】:

您的问题的答案很简单:在 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);

【讨论】:

  • 好的,我明白了...如果您可以使用我想匹配我的代码的 ConverterProperties 提供示例代码...
  • 我已经更新了我的答案。请注意,接受有帮助的答案是习惯做法。例如:您表示我对问题Need iText7 HTML to PDF Encryption Code in C# 的回答很有帮助,但您从未接受该回答。这是一个复杂的信息;它说“你帮助了我,但我不感谢你的帮助。”
  • @NARAN 如果您不知道如何接受答案,您只需单击左上角的勾。
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多