private File createFooter(File originalFile) {
    String path = new ClassPathResource("/").getPath();
    File newfile = new File(path + "page" + originalFile.getName());
    Document document = null;
    try {
        PdfReader reader = new PdfReader(originalFile.getAbsolutePath());
        // 原本写法
        // document = new Document(new PdfReader(originalFile.getAbsolutePath()).getPageSize(1));
        document = new Document(reader.getPageSize(1));
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(newfile));
        document.open();
        int pagesNum = 0;//总页码
        int pages = 0;//当前页码
        //PdfReader reader = new PdfReader(originalFile.getAbsolutePath());
        pagesNum += reader.getNumberOfPages();
        PdfCopy.PageStamp stamp;//插入页码所需  不要页码可删除
        int n = reader.getNumberOfPages();
        for (int j = 1; j <=n ; j++) {
            pages++;
            document.newPage();
            PdfImportedPage page=copy.getImportedPage(reader,j);
            stamp=copy.createPageStamp(page);//插入页码所需  不要页码可删除
            ColumnText.showTextAligned(stamp.getUnderContent(), Element.ALIGN_CENTER,new Phrase(String.format("第%d页/共%d页", pages, pagesNum)),475f,30f,0f);//插入页码所需  不要页码可删除
            stamp.alterContents();//插入页码所需  不要页码可删除
            copy.addPage(page);
        reader.close();
        copy.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (DocumentException e) {
        e.printStackTrace();
    }finally {
        if (!Objects.isNull(document)) {
            document.close();
    return newfile;
在例子中发现所有流都是关闭的但是就是针对originalFile删除不了,而newfile可以删除
仔细观察发现(上面代码已经标注了)
  在打开document中的方法是直接写了
    ❗ document = new Document(new PdfReader(originalFile.getAbsolutePath()).getPageSize(1));
  导致PdfReader没有被关闭,所以删除失败(一定要仔细一些)。

3. 特殊情况(zip压缩文件)

zip压缩文件,zipFile最后一定要close;
  调用:❗ java.util.zip.ZipFile.close()方法关闭ZIP文件
关闭此ZIP文件将关闭以前由调用getInputStream()方法返回的所有输入流。这个方法连流都给我们关闭了!就不用我们手动关闭zip文件的流了,最后在调用file.delete()方法就可以删除文件了

4. (终极办法)直接通过new File("文件的绝对路径");然后执行file.delete()便可成功删除。

File file = new File("D:/a.jpg");      
file.delete();         //返回结果就是true
这个依照情况而定,不解决实际问题,一般来说还是需要关闭流操作。