在文件循环中使用 iText 拆分 pdf 会在删除原始关闭文件时引发错误

问题描述 投票:0回答:0

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.utils.PageRange;
import com.itextpdf.kernel.utils.PdfSplitter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class PDFSplitter {
    private static final String OUTPUT_FOLDER = "\dest";
    private static final String INPUT_FOLDER = "\source";
    private static int partNumber = 1;

    public static void main(String args[]) throws IOException {
        final int maxPageCount = 2; // create a new PDF per 2 pages from the original file
        File[] srcFiles = new File(INPUT_FOLDER).listFiles();

        for (File srcFile : srcFiles) {
            PdfDocument pdfDocument = new PdfDocument(new PdfReader(new File(srcFile.getCanonicalPath())));
            PdfSplitter pdfSplitter = new PdfSplitter(pdfDocument) {

                @Override
                protected PdfWriter getNextPdfWriter(PageRange documentPageRange) {
                    try {
                        return new PdfWriter(OUTPUT_FOLDER + "\\" + String.format("%05d", partNumber++) + ".pdf");
                    } catch (final FileNotFoundException ignored) {
                        throw new RuntimeException();
                    }
                }
            };

            pdfSplitter.splitByPageCount(maxPageCount, (pdfDoc, pageRange) -> pdfDoc.close());
            pdfDocument.close();
            Files.delete(Paths.get(srcFile.getCanonicalPath()));
        }
    }

}

我使用这段代码,它适用于一个源文件。它将源文件拆分到目标文件夹。最后删除源文件。但是当我在循环中使用它时,它会抛出源文件正在被另一个进程使用,因此无法删除。该错误总是发生在要拆分的文件集中的随机文件上。有时它可能根本不会发生!!这是一种奇怪的行为,让我想起了并发行为。代码取自here

更新

我发现当我删除循环时它就可以工作了。如果我有一个循环,即使只有一个文件,它也不能删除文件!

java itext
© www.soinside.com 2019 - 2024. All rights reserved.