使用来自html的Flying-Saucer渲染PDF格式的嵌入图像

时间:2012-05-31 20:40:47

标签: java pdf-generation embedded-resource flying-saucer xhtmlrenderer

我有一个xhtml文档,我正在使用flyingsaucer变成PDF。 xhtml有几个标签,内嵌base64编码图像。 xhtml的来源是动态的,因此图像标签所在的结构可能会有所不同。这是标签的样本:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAagAAAEuCAYAAADbW4YFAAAgAElEQVR4Aex9CYBdRZ ...

当我在浏览器中查看html时,图像显示正确,但是,img元素不会在最终PDF中呈现。以下是我如何渲染它以创建PDF。

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(builder.parse(source), "");
renderer.layout();
renderer.createPDF(response.getOutputStream(),true);

任何人都可以让我知道我应该采取什么方法来实现这一目标?我看到了this posting,然而,我正在使用内嵌图像,因此我无法看到如何使用Edd的解决方案来实现这一目标。

提前致谢

2 个答案:

答案 0 :(得分:9)

是的,您可以使用此处给出的方法:Render image from servlet in flyingsaucer generated pdf

Edd在哪里:

        InputStream input = null;
        try {
            input = ...;
            byte[] bytes = IOUtils.toByteArray(input);
            Image image = Image.getInstance(bytes);

在Edd的情况下,图像来自远程源(他用input = ...;跳过该位)。在您的情况下,您只想从Base64编码数据(base64,之后的文本中读取它。首先使用Base64 decoder获取二进制数据,转换为byte[]或流,您然后可以使用Java ImageIO从您的字节创建图像,并按照Edd的方法将图像转换为PDF。感谢Edd在这里(肯定是upvote!)。

答案 1 :(得分:7)

Flying-Saucer本身支持数据:协议。您所要做的就是注册一个协议处理程序:

-Djava.protocol.handler.pkgs=org.xhtmlrenderer.protocols

无论如何都不需要servlet。

相关问题