首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iTextSharp XMLWorker解析非常慢

iTextSharp XMLWorker解析非常慢
EN

Stack Overflow用户
提问于 2014-01-22 14:31:49
回答 1查看 7.8K关注 0票数 5

我正在使用下面的代码在我的WPF应用程序中使用iTextSharp XMLWorker解析HTML字符串:

代码语言:javascript
复制
var css = "";
using (var htmlMS = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
{                    
    //Create a stream to read our CSS
    using (var cssMS = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(css)))
    {                        
        //Get an instance of the generic XMLWorker
        var xmlWorker = XMLWorkerHelper.GetInstance();

        //Parse our HTML using everything setup above
        xmlWorker.ParseXHtml(writer, doc, htmlMS, cssMS, System.Text.Encoding.UTF8, fontProv);                        
    }
}

解析工作很好,但它真的很慢,它需要大约2秒来解析HTML。因此,对于一个50页的pdf,大约需要2分钟。我在我的HTML字符串中使用了内联样式。这是自然行为还是可以优化?

EN

回答 1

Stack Overflow用户

发布于 2014-10-07 00:06:38

这个问题是错误的,因为它表明HTML解析正在减慢一切。那是胡说。瓶颈甚至在HTML的第一个片段被解析之前就出现了。

您正在使用最基本的几行代码从HTML创建PDF,如ParseHtml示例所示:

代码语言:javascript
复制
public void createPdf(String file) throws IOException, DocumentException {
    // step 1
    Document document = new Document();
    // step 2
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    // step 3
    document.open();
    // step 4
    XMLWorkerHelper.getInstance().parseXHtml(writer, document,
            new FileInputStream(HTML));
    // step 5
    document.close();
}

这段代码很简单,但它在内部执行了许多操作,如另一个问题XMLWorkerHelper performance slow的注释中所述。

注册字体目录的行为消耗了大量的时间。您可以像ParseHtmlFonts示例中那样使用您自己的FontProvider来避免这种情况。

代码语言:javascript
复制
public void createPdf(String file) throws IOException, DocumentException {
    // step 1
    Document document = new Document();

    // step 2
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    writer.setInitialLeading(12.5f);

    // step 3
    document.open();

    // step 4

    // CSS
    CSSResolver cssResolver = new StyleAttrCSSResolver();
    CssFile cssFile = XMLWorkerHelper.getCSS(new FileInputStream(CSS));
    cssResolver.addCss(cssFile);

    // HTML
    XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
    fontProvider.register("resources/fonts/Cardo-Regular.ttf");
    fontProvider.register("resources/fonts/Cardo-Bold.ttf");
    fontProvider.register("resources/fonts/Cardo-Italic.ttf");
    fontProvider.addFontSubstitute("lowagie", "cardo");
    CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

    // Pipelines
    PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
    HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

    // XML Worker
    XMLWorker worker = new XMLWorker(css, true);
    XMLParser p = new XMLParser(worker);
    p.parse(new FileInputStream(HTML));

    // step 5
    document.close();
}

在这种情况下,我们指示iText DONTLOOKFORFONTS,从而节省了大量的时间。我们不是让iText查找字体,而是告诉iText我们将在HTML中使用哪些字体。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21275800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档