c# - iTextSharp XMLWorker 解析真的很慢

标签 c# itextsharp

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

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);                        
    }
}

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

最佳答案

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

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

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 .

注册字体目录的行为会消耗大量时间。您可以通过使用自己的 FontProvider 来避免这种情况,就像在 ParseHtmlFonts 中所做的那样。例子。

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 中使用哪些字体。

关于c# - iTextSharp XMLWorker 解析真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21275800/

相关文章:

c# - 当关闭并从另一个类引用时,表单不会变为 null

c#-4.0 - 使用 iTextSharp 从 PDF 中读取复选框、单选按钮名称和值

visual-studio-2013 - 你如何在visual studio中添加对dll的引用?

c# - 从集合中返回中间的 n(值不是索引)

c# - SSIS 跨进程通信有哪些选项?

c# - 将控制台输出镜像到文件

c# - 使用 IEqualityComparer 比较两个列表

c# - 使用文档哈希比较签名的 PDF 和未签名的 PDF

c# - 使用itextsharp xmlworker将html转pdf并竖写文字

razor - 如何使用 media=print 的样式从 View 生成 PDF