【问题标题】:Html to Pdf with german alphabet带有德语字母的 Html 到 Pdf
【发布时间】:2020-03-04 11:16:11
【问题描述】:

我正在使用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>

导出的单词是“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);
    }

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

【问题讨论】:

  • 您的 HTML 文档中是否有 &lt;meta charset="utf-8"&gt; 来创建 PDF?
  • 是的,我已经添加了我的html

标签: java html-to-pdf flying-saucer openhtmltopdf


【解决方案1】:

看来您需要提供DTD 或将实体名称auml 替换为其对应的十六进制或十进制值,即分别为&amp;#xE4; 或&amp;#228;。请参阅A.2. Entity Sets 和HTML 4 Entity Names。

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 传递给 pdf 构建器之前将其添加到您的 html 字符串。


更新

您可能想试试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/");

【讨论】:

  • 你的答案是正确的,谢谢。我很确定我可以以编程方式完成,而不是在 html 中声明 DTD。我尝试使用实体解析器(我已经更新了我的问题),但仍然无法正常工作,但我认为我更接近了......
  • @Zardo 您正在使用的javax.xml.parsers.DocumentBuilder 需要一个定义明确的文档,而您提供的 html 文件并非如此。我更新了我的答案。 jsoup 将帮助您完成 html 解析部分,这样您就不必接触现有的 html 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2013-11-28
  • 2017-04-27
  • 2017-04-11
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多