2

我在java中使用itext 5.3来生成PDF。我HTMLWorker.parseToList(Reader, StyleSheet)用来将部分转换为包含 HTML 标签(如粗体、斜体、href 等)的字符串到 PDF。我不想生成完整的 HTML 到 PDF,而是 PDF 中的部分文本将是 HTML。例如,像“这是测试粗体文本”这样的字符串将部分文本转换为粗体。

性能很好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");
4

1 回答 1

0

此问题的原因是在 (X)HTML 被有效解析之前作为操作的一部分完成的字体目录注册。这需要非常多的时间。

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

new XMLWorkerFontProvider( XMLWorkerFontProvider.DONTLOOKFORFONTS )

您可以将此字体提供程序作为参数提供给XMLWorkerHelper.getInstance( ).parseXHtml( ... ),但是如果您将 anElementHandler作为第一个参数,则不能。我不知道为什么,我只是偶尔使用 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 );
于 2017-12-16T10:13:45.143 回答