使用Flying Saucer将xhtml字符串转换为PDF的最简单方法是什么?

时间:2009-08-06 00:33:39

标签: pdf xhtml rendering xhtmlrenderer flying-saucer

我已经使用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(只是为了一致的错误和功能)。

2 个答案:

答案 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提供了一个实体解析器。