使用javafx htmleditor的itext xmlworker [英] itext xmlworker with javafx htmleditor

查看:285
本文介绍了使用javafx htmleditor的itext xmlworker的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个简单的JavaFX(2.2)FXML项目。我正在尝试将html字符串转换为不同的元素,并将它们添加到由iText生成的PDF文档中的段落中。由于不推荐使用HTMLWorker,我使用的是XMLWorker。它似乎使用自己编写的简单html字符串,例如:

I created a simple JavaFX (2.2) FXML project. I am trying to convert a html string to different Elements and add them to a Paragraph in my PDF document generated by iText. As HTMLWorker is deprecated, I use XMLWorker. It does seem to work with a own written simple html string, e.g.:

StringReader in = new StringReader("<html><body><p>test</p></body></html>");

但是,当我尝试使用JavaFX HTMLEditor控件生成的html字符串时,收到以下消息:

However, when I try to use the html string generated by the JavaFX HTMLEditor control, I receive following message:

Caused by: java.lang.NoSuchMethodError: com.itextpdf.tool.xml.html.pdfelement.NoNewLineParagraph.setMultipliedLeading(F)V
at com.itextpdf.tool.xml.html.AbstractTagProcessor.currentContentToParagraph(AbstractTagProcessor.java:268)
at com.itextpdf.tool.xml.html.Span.end(Span.java:77)
at com.itextpdf.tool.xml.html.AbstractTagProcessor.endElement(AbstractTagProcessor.java:192)
at com.itextpdf.tool.xml.pipeline.html.HtmlPipeline.close(HtmlPipeline.java:207)
at com.itextpdf.tool.xml.XMLWorker.endElement(XMLWorker.java:142)
at com.itextpdf.tool.xml.parser.XMLParser.endElement(XMLParser.java:396)
at com.itextpdf.tool.xml.parser.state.ClosingTagState.process(ClosingTagState.java:71)
at com.itextpdf.tool.xml.parser.XMLParser.parseWithReader(XMLParser.java:236)
at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:214)
at com.itextpdf.tool.xml.XMLWorkerHelper.parseXHtml(XMLWorkerHelper.java:149)
at hmtltopdf.FXMLDocumentController.handleButtonAction(FXMLDocumentController.java:64)
... 54 more

我猜是有的html字符串中的一堆标签,XMLWorker无法识别。 HTML编辑器创建此html字符串:

My guess is that there are a bunch of tags in the html string that aren't recognized by XMLWorker. The HTML editor creates this html string:

<html><head></head><body contenteditable="true"><p style="text-align: left;"><font face="'Segoe UI'">test</font></p></body></html>

如果是这种情况,有没有办法'清理'html字符串?或者我是否必须使用某种其他HTML编辑器?

If that is the case, is there a way to 'clean' the html string? Or do I have to use another HTML editor of some sort?

我的示例项目代码:

//using iText 5.3.1 and XMLWorker 5.5.0

@FXML
private HTMLEditor htmlEditor;

@FXML
private void handleButtonAction(ActionEvent event) {
    final Document document = new Document();

    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/test/loremipsum.pdf"));

    document.open();

    //StringReader in = new StringReader("<html><body><p>test</p></body></html>"); //this works
    StringReader in = new StringReader(htmlEditor.getHtmlText()); //this does not work

    try {
        final Paragraph test = new Paragraph();
        XMLWorkerHelper.getInstance().parseXHtml(new ElementHandler() {
            @Override
            public void add(final Writable w) {
                if (w instanceof WritableElement) {
                    List<Element> elements = ((WritableElement) w).elements();
                    for (Element e : elements) {
                        test.add(e);
                    }
                }
            }
        }, in);

        document.add(test);
    } catch (IOException | DocumentException e) {
        System.out.println(e.toString());
        System.out.println(e.getMessage());
    }

    document.close();
}

编辑:

当使用< b> < i> ,...或其他标签时,问题似乎开始了。

It seems the problems start when using <b>, <i>, ... or other tags.

推荐答案

似乎它必须使用较旧的iText版本做一些事情。我已经更新到iText 5.5.0,它现在似乎正常工作。我仍然需要删除任何< br> < hr> 标记。

Ah it seems that it has to do something with using an older iText version. I've updated to iText 5.5.0 and it seems to work now. I still had to remove any <br> and <hr> tags thou.

//using iText 5.5.0 and XMLWorker 5.5.0

@FXML
private HTMLEditor htmlEditor;

@FXML
private void handleButtonAction(ActionEvent event) {
    final Document document = new Document();

    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/test/loremipsum.pdf"));

    document.open();

    String htmlString = htmlEditor.getHtmlText();

    htmlString = htmlString.replace("<br>", "");
    htmlString = htmlString.replace("<br/>", "");
    htmlString = htmlString.replace("<br />", "");

    htmlString = htmlString.replace("<hr>", "<p></p>");
    htmlString = htmlString.replace("<hr/>", "<p></p>");
    htmlString = htmlString.replace("<hr />", "<p></p>");

    StringReader in = new StringReader(htmlString);

    try {
        final Paragraph test = new Paragraph();
        XMLWorkerHelper.getInstance().parseXHtml(new ElementHandler() {
            @Override
            public void add(final Writable w) {
                if (w instanceof WritableElement) {
                    List<Element> elements = ((WritableElement) w).elements();
                    for (Element e : elements) {
                        test.add(e);
                    }
                }
            }
        }, in);

        document.add(test);
    } catch (IOException | DocumentException e) {
        System.out.println(e.toString());
        System.out.println(e.getMessage());
    }

    document.close();
}

这篇关于使用javafx htmleditor的itext xmlworker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆