You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java11中RandomAccessFileOrArray.close()告警且资源未释放的解决办法

解决iText5.5.13.3在Java11下TIFF转PDF的资源释放与反射警告问题

一、解决当前iText5的问题

1. 升级iText版本(推荐)

iText5.5.13.3属于旧版本,对Java9+的模块化和反射权限限制适配不足。优先推荐升级到iText7——iText的新一代版本,完全适配Java11+,API设计更规范,相关资源类已实现AutoCloseable,可直接使用try-with-resources语法,同时彻底消除反射警告。

适配SpringBoot2.7.9的iText7 Maven依赖:

<!-- iText7核心模块 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>kernel</artifactId>
    <version>7.2.5</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>io</artifactId>
    <version>7.2.5</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.2.5</version>
</dependency>
<!-- TIFF格式处理依赖 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>pdfa</artifactId>
    <version>7.2.5</version>
</dependency>

2. 兼容现有iText5的临时方案

如果暂时无法升级版本,可通过以下两种方式解决:

(1)添加JVM参数放行反射访问

在项目启动参数中添加:

--add-opens java.base/java.nio=ALL-UNNAMED

该参数允许iText5反射访问DirectByteBuffer的cleaner()方法,既消除警告,也能让close()方法正常释放文件资源。

(2)封装AutoCloseable包装类

手动封装一个实现AutoCloseable的包装类,让RandomAccessFileOrArray支持try-with-resources语法,避免手动关闭遗漏:

public class AutoCloseableRandomAccessFileOrArray implements AutoCloseable {
    private final RandomAccessFileOrArray delegate;

    public AutoCloseableRandomAccessFileOrArray(RandomAccessFileOrArray delegate) {
        this.delegate = delegate;
    }

    public RandomAccessFileOrArray getDelegate() {
        return delegate;
    }

    @Override
    public void close() throws IOException {
        delegate.close();
    }
}

使用示例:

RandomAccessSourceFactory rasf = new RandomAccessSourceFactory();
try (AutoCloseableRandomAccessFileOrArray myTiffFile = new AutoCloseableRandomAccessFileOrArray(
        new RandomAccessFileOrArray(rasf.createBestSource(tiffFilepath)))) {
    // TIFF转PDF的业务逻辑
} catch (IOException e) {
    // 异常处理逻辑
}

配合上述JVM参数,即可正常释放资源并消除警告。

二、可用的PDF生成替代方案

  • Apache PDFBox:开源免费的PDF处理库,支持TIFF转PDF,API简洁易懂,完全适配Java11+,SpringBoot集成无压力。Maven依赖:

    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.29</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox-tools</artifactId>
        <version>2.0.29</version>
    </dependency>
    
  • Flying Saucer:基于旧版iText开发的HTML转PDF工具,适合将HTML模板渲染为PDF,也支持嵌入各类图片格式,适配Java11+。

  • Aspose.PDF:商业级PDF处理库,功能覆盖几乎所有PDF操作与格式转换场景,文档完善,但需要付费授权。

内容的提问来源于stack exchange,提问作者Alexxxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:53:07