什么是XHTML字符串转换为使用飞碟PDF的最简单的方法?(What's the easie

2019-07-31 12:01发布

我一直在使用飞碟 ,而现在与真棒结果。

我可以通过像这样的URI设置文档

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(xhtmlUri);

这是很好的,因为它会解决所有相关的CSS资源等相对于给定的URI。 不过,我现在生成XHTML,并希望直接呈现到一个PDF(不保存文件)。 在适当的方法ITextRenderer似乎是:

private Document loadDocument(final String uri) {
    return _sharedContext.getUac().getXMLResource(uri).getDocument();
}

public void setDocument(String uri) {
    setDocument(loadDocument(uri), uri);
}

public void setDocument(Document doc, String url) {
    setDocument(doc, url, new XhtmlNamespaceHandler());
}

正如你所看到的,我现有的代码只是给URI和ITextRenderer确实创造的工作Document给我。

什么是创建的最短路径Document从我的XHTML字符串? 我宁愿使用现有的飞碟库,而无需导入另一个XML解析罐子(只是一贯的bug和功能的缘故)。

Answer 1:

以下工作:

Document document = XMLResource.load(new ByteArrayInputStream(templateString.getBytes())).getDocument();

此前,我曾尝试

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);

final DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
Document document = documentBuilder.parse(new ByteArrayInputStream(templateString.getBytes()));

但是,当它试图下载从HTML DOCTYPE失败http://www.w3.org (返回503的用于Java库)。



Answer 2:

我用下面没有任何问题:

    final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    documentBuilderFactory.setValidating(false);
    DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
    builder.setEntityResolver(FSEntityResolver.instance());
    org.w3c.dom.Document document = builder.parse(new ByteArrayInputStream(doc.toString().getBytes()));

    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(document, null);
    renderer.layout();
    renderer.createPDF(os);

这里的关键差异是传递一个空URI,并且还设置有实体解析器中的DocumentBuilder。



文章来源: What's the easiest way of converting an xhtml string to PDF using Flying Saucer?