我一直在使用飞碟 ,而现在与真棒结果。
我可以通过像这样的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和功能的缘故)。
以下工作:
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库)。
我用下面没有任何问题:
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?