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

使用iText在Java中生成PDF副本后无法删除原文件问题

问题原因及修复方案

问题根源

你创建PdfReader时,直接传入了一个未被显式关闭的FileInputStream实例:

PdfReader reader = new PdfReader(new FileInputStream(originalFile));

尽管你调用了reader.close(),但部分iText版本不会自动关闭这个底层的输入流,导致原PDF文件始终被该流占用,无法执行删除操作。

修复方案

方案1:显式管理输入流

将输入流单独声明,使用try-with-resources自动管理资源(推荐),代码块结束后会自动关闭流和阅读器,彻底释放文件资源:

// 用try-with-resources包裹资源,自动完成关闭
try (FileInputStream fis = new FileInputStream(originalFile);
     PdfReader reader = new PdfReader(fis)) {
    // 原有的页面循环处理逻辑
}

方案2:直接传入文件路径给PdfReader

更简洁的方式是直接用文件路径字符串创建PdfReader,iText内部会自行处理流的打开和关闭,无需手动管理:

PdfReader reader = new PdfReader(originalFile);

额外优化建议

原代码中关于输出流和文档的关闭逻辑可以简化:调用duplicateDocument.close()时,会自动关闭关联的PdfWriter和输出流,因此以下冗余代码可以省略:

outputStream.flush();
writer.flush();
writer.close();
outputStream.close();

只保留duplicateDocument.close()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:43:34