2

我有一个项目需要生成 PDF 文件。在这个 PDF 中,我必须插入一段文本以及四到五个大图像(大约 800 像素 * 1000 像素)。为了使其灵活,我选择将 FreeMarker 与 XHTMLRenderer(飞碟)结合使用。

我现在面临几个选择:

  1. 创建图像并将它们作为临时文件保存到磁盘。然后.xhtml使用 FreeMarker 处理模板(将其保存到磁盘)并将处理后的.xhtml文件 URL 传递给 XHTMLRenderer 以生成 PDF。所有这些创建的文件(除了 PDF)都将使用File.createTempFile. 这将允许 FreeMarker 从磁盘中提取图像(就好像它们是在 XHTML 中链接的图像一样)
  2. 处理.xhtml模板并将其保存在内存中。将图像作为 base64 编码的数据 url 传递给模板。这将消除保存任何临时文件的需要,因为 FreeMarker 的输出可以直接传递给 XHTMLRenderer。

Base64 编码图像 URL 示例(一个小文件夹图标):

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExK
cppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" />

我的主要问题是哪种技术更好?创建大量临时文件是否不好(是否会产生大量开销)?创建如此大的 base64 编码字符串时,我可能会耗尽内存吗?

4

2 回答 2

1

PDF 生成不是时间关键的——甚至可以考虑限制通信。在已经很昂贵的模板转换中,在 Base64 中嵌入图像会花费更多的 CPU 和内存:Base64 大数据通过模板管道拖动,然后可能从 Base64 解码为二进制以进行压缩。我什至不知道嵌入图像是可能的。所以临时文件的开销是一个更确定的解决方案。当然要开始了。当然,可以对这两种情况进行基准测试。

于 2012-01-13T00:14:41.587 回答
1

我发现自己最近也在问同样的问题。经过一些基准测试,事实证明数据 URI 方法是最好的选择。

存储一堆 Base64 编码的图像可能很昂贵。但是创建临时文件、流式传输图像数据,然后等待 XHTMLRenderer 在清理该临时文件 4 次之前的开销也很繁重。

在我的实验中,Base64 图像被证明是一种更好的方法。话虽如此,我不确定对于更大的图像在多大程度上仍然如此。就我而言,我使用 32x32 图标、80x80 徽标、400x240 条形图和一个 600x400 图形进行测试。除了 600x400 图形之外,其他所有东西的开销差异都很明显,在这种情况下它真的可以忽略不计。

(Joop Eggen 的旁注——在我的例子中,PDF 生成时间紧迫的。用户单击 PDF 按钮并期望立即开始下载。)

于 2012-01-13T18:02:15.437 回答