XMLWorkerHelper性能缓慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XMLWorkerHelper性能缓慢相关的知识,希望对你有一定的参考价值。

我在java中使用itext 5.3来生成PDF。我使用htmlWorker.parseToList(Reader, StyleSheet)将部分转换为String,其中包含像Bold,Italic,href等HTML标签到PDF。我不想生成完整的HTML到PDF,而PDF中的部分文本将是HTML。例如,像“This is test bold text”这样的字符串将部分文本转换为粗体。

HTMLWorker的表现很好。

自从它现在被弃用后,我开始使用XMLWorkerHelper.parseXHtml(ElementHandler, Reader),我发现与HTMLWorker相比,性能非常糟糕。

如果有人对解决方案或任何其他解决方法有任何疑问,请告诉我。

下面是示例代码和其他带有示例代码的帖子 HTML to List using XMLWorker

public class HTMLElementHandler implements ElementHandler {

    private Phrase phrase;
    private Font font;

    private HTMLElementHandler(Phrase phrase, Font font) {
        super();
        setPhrase(phrase);
        setFont(font);
    }

    @Override
    public void add(Writable writable) {
        if (writable instanceof WritableElement) {
            List<Element> elements = ((WritableElement) writable).elements();
            for (Element elem : elements) {
                List<Chunk> chunks = elem.getChunks();
                for (Chunk chunk : chunks) {
                    Font chunkFont = chunk.getFont();
                    //Do something with fonts here
                }
                phrase.setFont(font);
                phrase.add(elem);
            }
        }
    }

    public Phrase getPhrase() {
        return this.phrase;
    }
    public void setPhrase(Phrase phrase) {
        this.phrase = phrase;
    }   
    public Font getFont() {
        return this.font;
    }    
    public void setFont(Font font) {
        this.font = font;
    }
} 

another Java file.Java

Phrase ph = new Phrase();
Font font = FontFactory.getFont(FontFactory.getFont("Arial").getFamilyname(), 12, new BaseColor(0, 102, 153));
XMLWorkerHelper.getInstance().parseXHtml(new HTMLElementHandler(phrase, font), "This is test <bold> bold </bold> text");
答案

这个问题的原因是在有效地解析(X)HTML之前注册作为操作的一部分完成的字体目录。这需要花费大量的时间。

这可以通过提供不寻找任何字体的字体提供者来回避,即不会注册任何字体目录。可以使用以下命令创建此字体提供程

new XMLWorkerFontProvider( XMLWorkerFontProvider.DONTLOOKFORFONTS )

您可以将此字体提供程序作为参数提供给XMLWorkerHelper.getInstance( ).parseXHtml( ... ),但是如果您有ElementHandler作为第一个参数,则不能。我不知道为什么,我偶尔只使用iText。

我将举例说明(X)HTML在字符串中的情况:

File tempPdfFile = File.createTempFile( "temp_pdf_", ".pdf" );
tempPdfFile.deleteOnExit( );

try( OutputStream os = new FileOutputStream( tempPdfFile ) )
{
    Document pdfDocument = new Document( PageSize.A4 );
    PdfWriter pdfWriter = PdfWriter.getInstance( pdfDocument, os );
    pdfDocument.open( );

    String htmlText = getHtmlText( ); // your method that returns HTML as text

    XMLWorkerHelper.getInstance( ).parseXHtml ( 
        pdfWriter,
        pdfDocument,
        new ByteArrayInputStream( htmlText.getBytes( StandardCharsets.UTF_8 ) ),
        StandardCharsets.UTF_8,
        new XMLWorkerFontProvider( XMLWorkerFontProvider.DONTLOOKFORFONTS )
    );

    pdfDocument.close( );
    pdfWriter.close( );
}

Desktop.getDesktop( ).open( tempPdfFile );

以上是关于XMLWorkerHelper性能缓慢的主要内容,如果未能解决你的问题,请参考以下文章

Fragmenttabhost 性能慢?

片段android的缓慢创建

F# 性能:是啥让这段代码如此缓慢?

包含viewpager的android活动缓慢打开

SqlDataReader 性能缓慢

QML 为大量矩形设置动画时性能缓慢