飞碟无法识别 html 个实体

Flying Saucer not recognizing html entities

我正在尝试使用 html 文件作为 pdf 的模板,但 Flying Saucer 无法识别 HTML5 实体(&trade、  等)。如果我用它们的十六进制值替换它们,那么程序运行正常。

我的代码如下:

  public static InputStream create(String content) throws PDFUtilException {

try (ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
  ITextRenderer iTextRenderer = new ITextRenderer();
  iTextRenderer.getSharedContext()
               .setReplacedElementFactory(new MediaReplacedElementFactory(iTextRenderer.getSharedContext()
                                                                                       .getReplacedElementFactory()));

  iTextRenderer.setDocumentFromString(closeOutTags(content), null);
  iTextRenderer.layout();
  iTextRenderer.createPDF(baos);
  return new ByteArrayInputStream(baos.toByteArray());
} catch (IOException | DocumentException e) {
  throw new PDFUtilException("Unable to create PDF", e);
}

}

谢谢,

奥利弗

我直到今天才听说过飞碟,但文档的第一句话说 "Flying Saucer is a pure-Java library for rendering arbitrary well-formed XML (or XHTML)" 这强烈暗示它需要 well-formed XML 输入,而不是 HTML.

Michael 说飞碟需要 well-formed XML 是正确的,但是如果你唯一的问题是预定义的 HTML 个实体(不属于 XML ), 然后你可以在文档的开头自己声明它们,如下所示:

<!DOCTYPE html [
  <!ENTITY % htmlentities SYSTEM "https://www.w3.org/2003/entities/2007/htmlmathml-f.ent">
  %htmlentities;
]>
<!-- your XHTML text following here -->

这个pulls-in实体声明从他们的官方URL到htmlentities参数实体,然后引用(例如"executes")pulled-in声明.如果您只需要 tradenbsp,或者如果 Flying Saucer 不允许您从网络访问 URL,您也可以手动声明它们:

<!DOCTYPE html [
  <!ENTITY trade "&#x02122;">
  <!ENTITY nbsp "&#x000A0;">
]>
<!-- your XHTML text following here -->

现在如果你真的有一个合适的 HTML(不是 XHTML)文件,那么你将无法直接使用 XML 处理器,因为 HTML 使用 XML 不支持的标记功能(例如,空元素,如 img 元素、省略的标签和属性缩写)。但是您可以使用 SGML 处理器首先将 HTML 转换为 XHTML (XML),然后在结果 XML 文件上使用 Flying Saucer(SGML 是HTML 和 XML,以及 HTML 和 XML 所基于的原始标记语言)。该过程涉及使用 HTML DTD 语法,例如原始的 W3C HTML4 DTD(自 1999 年起)或 my HTML5 DTD on sgmljs.net 加上 SGML 处理器。不过,在进入细节之前,首先检查是否仅仅添加已经描述的实体声明就可以解决您的问题。