IO问题 - 将字节数组映像转换为XHTML(FlyingSaucer)

时间:2013-11-19 10:04:05

标签: java file-io xhtml bytearray flying-saucer

我有一个解决方案,可以将字符串插入到XHTML文档中,并将结果打印为Reports。我的雇主问我们是否可以从他们的SQL数据库(存储为字节数组)中提取图像以插入到Reports中。

我使用FlyingSaucer作为XHTML解释器,我一直在使用Java DOM来修改我存储在Report Generator包中的预存报告。

我现在能想到的唯一解决方案是构建图像,将它们保存为文件,将文件链接到构建的报告中的img标记(或背景图像),打印报告然后删除文件。这看起来真的很草率,我想这将是非常耗时的。

我不禁觉得必须有更优雅的解决方案。有关将字节数组插入html的建议吗?

1 个答案:

答案 0 :(得分:3)

  1. 读取图像并将其转换为Base64编码形式:

    InputStream image = getClass().getClassLoader().getResourceAsStream("image.png");
    String encodedImage = BaseEncoding.base64().encode(ByteStreams.toByteArray(image));
    

    我使用了来自BaseEncodingByteStreamsGoogle Guava

  2. 更改src对象中img元素的Document属性。

    Document doc = ...; // get Document from XHTMLPanel.getDocument() or create
                        // new one using DocumentBuilderFactory 
    
    doc.getElementById("myImage").getAttributes().getNamedItem("src").setNodeValue("data:image/png;base64," + encodedImage);
    
  3. Unfortunatley FlyingSaucer不支持开箱即用的DataURI,因此您必须创建自己的ReplacedElementFactory。阅读Using Data URLs for embedding images in Flying Saucer generated PDFs文章 - 它包含完整的解决方案。