3

簡単な JavaFX (2.2) FXML プロジェクトを作成しました。HTML文字列をさまざまな要素に変換し、iTextによって生成されたPDFドキュメントの段落に追加しようとしています。HTMLWorker は非推奨なので、XMLWorker を使用します。独自に記述された単純な html 文字列で動作するようです。たとえば、次のようになります。

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

ただし、JavaFX HTMLEditor コントロールによって生成された html 文字列を使用しようとすると、次のメッセージが表示されます。

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

私の推測では、XMLWorker によって認識されない html 文字列にタグがたくさんあると思います。HTML エディターは、次の html 文字列を作成します。

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

その場合、html 文字列を「きれいにする」方法はありますか? それとも、何らかの別の HTML エディターを使用する必要がありますか?

私のサンプルプロジェクトのコード:

//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>、 ... またはその他のタグを使用すると問題が発生するようです。

4

1 に答える 1

3

ああ、古い iText バージョンを使用して何かをしなければならないようです。iText 5.5.0 に更新しましたが、現在は動作しているようです。私はまだタグを削除する必要が<br>ありました。<hr>

//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();
}
于 2014-05-05T12:57:03.637 に答える