Html в PDF с немецким алфавитом - PullRequest
2 голосов
/ 04 марта 2020

Я использую 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" была указана, но не объявлена.

Здесь my html:

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

Экспортируемое слово "käse" (сыр).


ОБНОВЛЕНИЕ

Я пытался с определителем сущностей следующим образом:

 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);
    }

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

1 Ответ

2 голосов
/ 16 марта 2020

Похоже, вам нужно либо предоставить DTD , либо заменить имя сущности auml на соответствующее шестнадцатеричное или десятичное значение, то есть &#xE4; или &#228; соответственно. См. А.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/");
...