从 PDF 导出页面子集
Exporting a subset of pages from a PDF
我想从 PDF 文件中获取部分页面。基本上我给函数一个文件,将它分成几页,然后创建一个新文件,只包含起始页和结束页之间的页面。当用户输入页码时,我需要更正从 0 开始的列表。这是我的代码。
public static String SplitPdf(File source, Integer startPage, Integer endPage) throws Exception {
String sourceFileName = source.getAbsolutePath().replace("\", "/");
File file = new File(sourceFileName);
PDDocument document = PDDocument.load(file);
Splitter splitter = new Splitter();
List<PDDocument> pages = splitter.split(document);
Integer correctedStartPage = startPage < 1 ? 1 : startPage - 1;
Integer correctedEndPage = endPage < 1 ? 1 : endPage - 1;
if (pages.size() <= correctedStartPage) throw new Exception("Start page: " + startPage + " No of pages: " + pages.size());
if (pages.size() <= correctedEndPage) throw new Exception("End page: " + endPage + " No of pages: " + pages.size());
if (startPage > endPage)
throw new Exception("Start page before end page. Start page: " + startPage + " End page: " + endPage);
PDDocument newDoc = new PDDocument();
String filePath = file.getParent() + "\" + FilenameUtils.getBaseName(file.getName()) + "-fittingPart" +
"." + FilenameUtils.getExtension(file.getName());
for (int i = correctedStartPage; i <= correctedEndPage; i++) {
PDDocument currentPage = pages.get(i);
PDPage page = currentPage.getPage(0);
newDoc.addPage(page);
currentPage.close();
}
newDoc.save(filePath);
newDoc.close();
return filePath;
}
我得到的错误是:
COSStream已关闭,无法读取。也许其封闭的 PDDocument 已关闭?
我检查过文件是否存在
据我所知,我没有过早关闭 PDDocument...有什么想法吗?
PS:我需要使用 apache PDFBox 而不是其他库
您需要关闭所有 PDDocument 对象、源对象和您使用 splitter
生成的对象,而不仅仅是最终对象。您还应该使用拆分器方法 setStartPage()
和 setEndPage()
而不是创建所有这些中间文档然后获取第一个文件,从而使您的生活更轻松。确保仅在所有对象都已保存后才关闭对象(由于可能共享资源)
我想从 PDF 文件中获取部分页面。基本上我给函数一个文件,将它分成几页,然后创建一个新文件,只包含起始页和结束页之间的页面。当用户输入页码时,我需要更正从 0 开始的列表。这是我的代码。
public static String SplitPdf(File source, Integer startPage, Integer endPage) throws Exception {
String sourceFileName = source.getAbsolutePath().replace("\", "/");
File file = new File(sourceFileName);
PDDocument document = PDDocument.load(file);
Splitter splitter = new Splitter();
List<PDDocument> pages = splitter.split(document);
Integer correctedStartPage = startPage < 1 ? 1 : startPage - 1;
Integer correctedEndPage = endPage < 1 ? 1 : endPage - 1;
if (pages.size() <= correctedStartPage) throw new Exception("Start page: " + startPage + " No of pages: " + pages.size());
if (pages.size() <= correctedEndPage) throw new Exception("End page: " + endPage + " No of pages: " + pages.size());
if (startPage > endPage)
throw new Exception("Start page before end page. Start page: " + startPage + " End page: " + endPage);
PDDocument newDoc = new PDDocument();
String filePath = file.getParent() + "\" + FilenameUtils.getBaseName(file.getName()) + "-fittingPart" +
"." + FilenameUtils.getExtension(file.getName());
for (int i = correctedStartPage; i <= correctedEndPage; i++) {
PDDocument currentPage = pages.get(i);
PDPage page = currentPage.getPage(0);
newDoc.addPage(page);
currentPage.close();
}
newDoc.save(filePath);
newDoc.close();
return filePath;
}
我得到的错误是:
COSStream已关闭,无法读取。也许其封闭的 PDDocument 已关闭?
我检查过文件是否存在
据我所知,我没有过早关闭 PDDocument...有什么想法吗?
PS:我需要使用 apache PDFBox 而不是其他库
您需要关闭所有 PDDocument 对象、源对象和您使用 splitter
生成的对象,而不仅仅是最终对象。您还应该使用拆分器方法 setStartPage()
和 setEndPage()
而不是创建所有这些中间文档然后获取第一个文件,从而使您的生活更轻松。确保仅在所有对象都已保存后才关闭对象(由于可能共享资源)