XMLWorkerHelper性能缓慢

时间:2013-03-25 17:37:14

标签: java html pdf tags itext

我在java中使用itext 5.3来生成PDF。我使用HTMLWorker.parseToList(Reader, StyleSheet)将部分转换为包含HTML标签的字符串,如Bold,Italic,href等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;
    }
} 

AnotherJavafile.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");

1 个答案:

答案 0 :(得分:0)

这个问题的原因是在有效解析(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 );