带有德语字母的 Html 到 Pdf

Zar*_*rdo 3 java html-to-pdf flying-saucer openhtmltopdf

我正在使用openhtmltopdf将 html 转换为 pdf。目前,如果 html 包含德语字符,例如 \xc3\xa4、\xc3\xb6、\xc3\xbc,我会遇到异常。

\n\n
  PdfRendererBuilder builder = new PdfRendererBuilder();\n  builder.useFastMode();\n  builder.withHtmlContent(html,"file://localhost/");\n  builder.toStream(out);\n  builder.run();\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

org.xml.sax.SAXParseException; 行号:17;列数:31;实体“auml”已被引用,但未声明。

\n
\n\n

这是我的html:

\n\n
<html>\n   <head>      \n      <meta charset="UTF-8" />\n    </head>\n    <body>\n        k&auml;se\n    </body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

导出的单词是“k\xc3\xa4se”(奶酪)。

\n\n
\n\n

更新

\n\n

我尝试过使用实体解析器,如下所示:

\n\n
 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();\n    DocumentBuilder builder=null;\n    try{\n      builder=factory.newDocumentBuilder();\n\n      ByteArrayInputStream input=new ByteArrayInputStream(html.getBytes("UTF-8"));\n      builder.setEntityResolver(FSEntityResolver.instance());\n      org.w3c.dom.Document doc=builder.parse(input);\n\n\n    }catch(Exception e){\n      logger.error(e.getMessage(),e);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我在“解析”时仍然遇到相同的异常。

\n

Ken*_*ler 5

看起来您要么需要提供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>
Run Code Online (Sandbox Code Playgroud)

或者,您可以运行 html 字符串并将实体名称替换为相应的十进制/十六进制值,这应该没问题,或者只是将 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);
Run Code Online (Sandbox Code Playgroud)

然后您可以将其传递w3cDoc给 pdf 生成器,如下所示

PdfRendererBuilder builder = new PdfRendererBuilder();
builder.withW3cDocument(w3cDoc, "file://localhost/");
Run Code Online (Sandbox Code Playgroud)