本文首发于个人微信公众号《andyqian》,期待你的关注~
前言
由于工作原因,使用Java生成大量的电子凭证,也就是PDF。在之前的文章中,有写过,如何通过Java生成PDF。这里就不再描述,写这篇文章主要是为了记录我在使用Java生成PDF过程中犯过的错,以及踩过的坑。
内存溢出
之前在使用生成方案的时候,我们一开始采用的是《PD4ML》框架,这个框架相对来说,要小巧些。但是不足的是:它是闭源的。在批量生成PDF文件时会出现内存泄漏的现象。我们在分析内存原因时,都止步于下面这一段代码:
private void createPdfByHtml(String html, File file) throws Exception{
FileOutputStream fos = new FileOutputStream(file);
...
// 这一行
pd4ml.render(sr, fos, new URL("http://"), "UTF-8");
}
因此,我们不得不考虑换一个第三方库。目前我们使用的是开源库《iText》,到目前为止,稳定运行。
(我们在选择第三方框架时,尽量选择开源的,因为在出现问题后,我们可以通过查看源代码分析,甚至可以修改源代码进行优化)。
字体路径
这个问题是这样的,我们生成PDF时为了支持中文字体,需要通过路径加载指定的字体文件。而开发环境是windows,测试/生产环境均是Linux。字体放在
/resources/fonts/
因为:
1. 在Window下获取Thread.currentThread()为null值
2. 在Linux下获取this.class.getClass().getResource(“/”).getPath();获取为null
所以在加载路径时,我们通过下述方法进行了兼容处理。
/**
* 应用场景:
* 1.在windows下,使用Thread.currentThread()获取路径时,出现空对象,导致不能使用
* 2.在linux下,使用PdfUtils.class获取路径为null,
* 获取字体路径
* @return
*/