Java生成PDF的若干坑

本文介绍了作者在使用Java生成PDF时遇到的问题及解决方案,包括内存溢出(由PD4ML框架引起,转而使用iText)、字体路径的Windows与Linux兼容问题、字符编码错误、生僻字支持以及HTML语义标签的严格性。这些问题在实际开发中至关重要,作者通过这些经验分享,提醒开发者注意避免类似坑点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文首发于个人微信公众号《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("https://"), "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
     */
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值