我已经使用Flying Saucer一段时间了,结果非常棒。
我可以通过uri设置文档,如此
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(xhtmlUri);
这很好,因为它将解析相对于给定URI的所有相对css资源等。但是,我现在正在生成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
。
从格式化的xhtml字符串创建Document
的最短方法是什么?我更喜欢使用现有的Flying Saucer库,而不必导入另一个XML解析jar(只是为了一致的错误和功能)。
答案 0 :(得分:5)
以下作品:
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()));
但是它失败了,因为它试图从http://www.w3.org下载HTML docType(它为java库返回503)。
答案 1 :(得分:1)
我使用以下内容没有问题:
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提供了一个实体解析器。