首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLWorkerHelper性能缓慢

XMLWorkerHelper性能缓慢
EN

Stack Overflow用户
提问于 2013-03-26 01:37:14
回答 1查看 2.4K关注 0票数 2

我正在使用java中的itext5.3来生成PDF。我正在使用HTMLWorker.parseToList(Reader, StyleSheet)转换部分到字符串,其中包含的HTML标签,如粗体,斜体,href等。我不想生成完整的HTML到PDF,而是PDF中的文本的一部分将是HTML。例如,像"This is test粗体文本“这样的字符串可以将部分文本转换为粗体。

使用HTMLWorker时,性能很好。

由于它现在已经被弃用,我开始使用XMLWorkerHelper.parseXHtml(ElementHandler, Reader),我发现与HTMLWorker相比,它的性能非常差。

如果任何人对解决方案或任何其他解决方法有任何想法,请让我知道。

下面是示例代码,其他带有示例代码的帖子位于

HTML to List using XMLWorker

代码语言:javascript
复制
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;
    }
} 

AnotherJavafile.java

代码语言:javascript
复制
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");
EN

回答 1

Stack Overflow用户

发布于 2017-12-16 18:13:45

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

这可以通过提供一个不会查找任何字体的字体提供商来避免,即不会注册任何字体目录。可以使用以下命令创建此字体提供程序:

代码语言:javascript
复制
new XMLWorkerFontProvider( XMLWorkerFontProvider.DONTLOOKFORFONTS )

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

我将在(X)HTML在字符串中的情况下给出一个示例:

代码语言:javascript
复制
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 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15621218

复制
相关文章

相似问题

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