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
更新
我发现当我删除循环时它就可以工作了。如果我有一个循环,即使只有一个文件,它也不能删除文件!