使用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
相关产品推荐
相关产品推荐

