2014-04-30 1 views
3

간단한 JavaFX (2.2) FXML 프로젝트를 만들었습니다. html 문자열을 다른 요소로 변환하고 iText에서 생성 한 PDF 문서의 단락에 추가하려고합니다. HTMLWorker는 더 이상 사용되지 않으므로 XMLWorker를 사용합니다.itext xmlworker with javafx htmleditor

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 
:

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

나는 자바 FX HTML 편집기 제어에 의해 생성 된 HTML 문자열을 사용하려고 할 때, 나는 다음과 같은 메시지가 나타납니다 예를 들면, 자신의 기록 간단한 HTML 문자열와 함께 작동하도록 보인다

XMLWorker에서 인식하지 못하는 html 문자열에 많은 태그가 있다고 생각합니다. HTML 편집기는 다음과 같은 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> ... 또는 다른 태그를 사용할 때 문제가 시작 보인다.

답변

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(); 
} 
+2

그래, iText 버전과 XMLWorker 버전이 항상 같아야합니다. –