Html в PDF с немецким алфавитом

Я использую openhtmltopdf для преобразования html в pdf. В настоящее время я получаю исключение, если html содержит немецкие символы, например, ä, ö, ü.

  PdfRendererBuilder builder = new PdfRendererBuilder();
  builder.useFastMode();
  builder.withHtmlContent(html,"file://localhost/");
  builder.toStream(out);
  builder.run();

org.xml.sax.SAXParseException; номер строки: 17; номер столбца: 31; Сущность "auml" упоминалась, но не объявлялась.

Вот мой html:

<html>
   <head>      
      <meta charset="UTF-8" />
    </head>
    <body>
        k&auml;se
    </body>
</html>

Экспортируемое слово - «касе» (сыр).


ОБНОВИТЬ

Я пробовал с распознавателем сущностей таким образом:

 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=null;
    try{
      builder=factory.newDocumentBuilder();

      ByteArrayInputStream input=new ByteArrayInputStream(html.getBytes("UTF-8"));
      builder.setEntityResolver(FSEntityResolver.instance());
      org.w3c.dom.Document doc=builder.parse(input);


    }catch(Exception e){
      logger.error(e.getMessage(),e);
    }

но я все еще получаю то же исключение при "разборе".


person Neo    schedule 04.03.2020    source источник
comment
У вас есть <meta charset="utf-8"> в вашем HTML-документе, где вы хотите создать PDF?   -  person Norbert Bartko    schedule 09.03.2020
comment
Да, я добавил свой html   -  person Neo    schedule 10.03.2020


Ответы (1)


Похоже, вам нужно либо указать DTD, либо заменить имя объекта auml соответствующим шестнадцатеричным кодом. или десятичное значение, то есть &#xE4; или &#228; соответственно. См. A.2. Наборы объектов и Имена объектов HTML 4.

HTML-контент будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html [
        <!ENTITY auml "&#228;">
]>
<html>
    <head>
    </head>
    <body>
        k&auml;se
    </body>
</html>

Кроме того, вы можете просмотреть строку html и заменить имена сущностей соответствующими значениями dec/hex, что должно подойти, или просто добавить DTD в строку html, прежде чем передавать ее компоновщику PDF.


Обновить

Вы можете попробовать библиотеку jsoup. Он анализирует и предоставляет вам org.w3c.dom.Document, например.

Document jsoupDoc = Jsoup.parse(html); // org.jsoup.nodes.Document
W3CDom w3cDom = new W3CDom(); // org.jsoup.helper.W3CDom
org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(jsoupDoc);

Затем вы можете передать w3cDoc компоновщику PDF следующим образом

PdfRendererBuilder builder = new PdfRendererBuilder();
builder.withW3cDocument(w3cDoc, "file://localhost/");
person Kenan Güler    schedule 16.03.2020
comment
Ваш ответ идет в правильном направлении, спасибо. Я почти уверен, что могу сделать это программно, вместо объявления DTD в html. Я пытался использовать распознаватель сущностей (я обновил свой вопрос), все еще не работает, но я думаю, что я ближе... - person Neo; 17.03.2020
comment
@Zardo Zardo javax.xml.parsers.DocumentBuilder, который вы используете, требует четко определенного документа, чего нельзя сказать о предоставленном вами html-файле. Я обновил свой ответ. jsoup поможет вам с парсингом html, так что вам не придется трогать существующие html-файлы. - person Kenan Güler; 18.03.2020