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

发布于 2024-07-30 01:58:10 字数 1098 浏览 7 评论 0原文

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

I've been using Flying Saucer for a while now with awesome results.

I can set a document via uri like so

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

Which is nice, as it will resolve all relative css resources etc relative to the given URI. However, I'm now generating the xhtml, and want to render it directly to a PDF (without saving a file). The appropriate methods in ITextRenderer seem to be:

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

As you can see, my existing code just gives the uri and ITextRenderer does the work of creating the Document for me.

What's the shortest way of creating the Document from my formatted xhtml String? I'd prefer to use the existing Flying Saucer libs without having to import another XML parsing jar (just for the sake of consistent bugs and functionality).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

软甜啾 2024-08-06 01:58:11

以下作品:

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 下载 HTML docType .org(对于 java 库返回 503)。

The following works:

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

Previously, I had tried

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

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

but that fails as it attempts to download the HTML docType from http://www.w3.org (which returns 503's for the java libs).

泅人 2024-08-06 01:58:11

我使用以下内容没有问题:

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

这里的主要区别是传入 null URI,并且还为 DocumentBuilder 提供了实体解析器。

I use the following without problem:

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

The key differences here are passing in a null URI, and also provided the DocumentBuilder with an entity resolver.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文