使用PDFBox处理PDF时提示未关闭文档,但已执行关闭操作求助
问题描述
我用Java编写了代码,从指定目录读取PDF文件,将页面复制到新PDF后保存至其他位置,但运行时抛出警告:
org.apache.pdfbox.cos.COSDocument finalize
WARNING: Warning: You did not close a PDF Document
我明明已经关闭了PDF文档!代码如下:
import org.apache.pdfbox.multipdf.Splitter; import org.apache.pdfbox.pdmodel.PDDocument; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) throws IOException{ File srcFolder = new File(System.getProperty("user.dir") + "\\source"); File[] srcFiles = srcFolder.listFiles(); Arrays.sort(srcFiles); for (File srcFile : srcFiles) { PDDocument srcPDDocument = PDDocument.load(srcFile); PDDocument destPDDOcument = new PDDocument(); Splitter splitting = new Splitter(); List<PDDocument> pages = splitting.split(srcPDDocument); for (PDDocument page : pages) { destPDDOcument.addPage(page.getPage(0)); } String dest = System.getProperty("user.dir") + "\\dest\\" + srcFile.getName(); destPDDOcument.save(dest); destPDDOcument.close(); srcPDDocument.close(); System.out.println(srcFile.getName()); } } }
问题原因
你只关闭了原文档srcPDDocument和目标文档destPDDOcument,但**Splitter.split()方法返回的每个PDDocument实例(也就是pages列表里的每个对象)都没有关闭**。这些拆分出来的单页文档是独立的PDF实例,持有未释放的资源,JVM垃圾回收时会检测到它们未被正常关闭,从而抛出警告。
修复方案
在遍历pages列表时,处理完每个单页文档就调用close()方法关闭它。更稳妥的方式是用Java的try-with-resources语句,它会自动完成资源关闭,避免遗漏:
import org.apache.pdfbox.multipdf.Splitter; import org.apache.pdfbox.pdmodel.PDDocument; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) throws IOException{ File srcFolder = new File(System.getProperty("user.dir") + "\\source"); File[] srcFiles = srcFolder.listFiles(); Arrays.sort(srcFiles); for (File srcFile : srcFiles) { // try-with-resources自动关闭原文档和目标文档 try (PDDocument srcPDDocument = PDDocument.load(srcFile); PDDocument destPDDocument = new PDDocument()) { Splitter splitting = new Splitter(); List<PDDocument> pages = splitting.split(srcPDDocument); for (PDDocument page : pages) { // 自动关闭单页文档 try (page) { destPDDocument.addPage(page.getPage(0)); } } String dest = System.getProperty("user.dir") + "\\dest\\" + srcFile.getName(); destPDDocument.save(dest); System.out.println(srcFile.getName()); } } } }
所有PDF文档资源都会被正确释放,警告随之消失。
内容的提问来源于stack exchange,提问作者nonlinear
相关产品推荐
相关产品推荐

