飞碟无法识别html实体

时间:2019-05-16 15:06:19

标签: java html xml flying-saucer

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

我的代码如下:

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

}

谢谢

橄榄

2 个答案:

答案 0 :(得分:1)

Michael的正确说法是,飞碟需要格式正确的XML,但是如果您唯一的问题是预定义的HTML实体(不属于XML),那么您可以像这样在文档开始时自行声明它们:

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

这会将实体声明从其官方URL引入到htmlentities参数实体中,然后引用(例如“执行”)所引入的声明。如果只需要tradenbsp,或者如果飞碟不允许您从网上访问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处理器。不过,在详细介绍之前,请先检查是否仅添加已描述的实体声明即可解决您的问题。

答案 1 :(得分:0)

直到今天我还没有听说过飞碟,但是文档的第一句话说:“飞碟是一个纯Java库,用于呈现任意格式良好的XML(或XHTML)”,这强烈表明它期望很好格式的XML输入,而不是HTML。