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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:17:38