gpt4 book ai didi

c# - iTextSharp XMLWorker 解析真的很慢

转载 作者:太空狗 更新时间:2023-10-29 23:07:51 27 4
gpt4 key购买 nike

我正在使用以下代码在我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com