java - XMLWorkerHelper 性能缓慢

标签 java html pdf tags itext

我在 java 中使用 itext 5.3 生成 PDF。我正在使用 HTMLWorker.parseToList(Reader, StyleSheet) 将部分转换为包含 HTML 标签(如粗体、斜体、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;
    }
} 

另一个Javafile.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 );

关于java - XMLWorkerHelper 性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15621218/

相关文章:

java - 具有多个错误消息的 Spring hibernate 类型验证

java - 在java中打印jframe

javascript - 给定一串 HTML 代码,我如何遍历每个标记并删除所有 "event"属性?

java - 使用 Java 将 HTML 文件转换为带有图片和样式的 PDF

python - ReportLab 中的非编号页面

html - 如何在页面中嵌入 PDF 查看器?

java - 在 Tomcat 中部署 .war

java - 清除 JFormattedTextField 的内容不起作用?

javascript - html根据javascript中另一个选择标签中的值动态过滤选择选项

html - 移除 HTML/CSS block 之间的奇数间距