【问题标题】:Exporting a subset of pages from a PDF从 PDF 导出页面子集
【发布时间】:2022-01-04 17:07:52
【问题描述】:

我想从 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 而不是其他库????

【问题讨论】:

    标签: java pdf pdfbox


    【解决方案1】:

    您需要关闭所有 PDDocument 对象、源对象和您使用splitter 生成的对象,而不仅仅是最终对象。您还应该使用拆分器方法setStartPage()setEndPage() 让您的生活更轻松,而不是创建所有这些中间文档然后获取第一个文件。确保仅在所有对象都保存后才关闭对象(由于可能共享资源)

    【讨论】:

    • 我尝试这样做,但现在我得到:COSStream 已关闭,无法读取。也许其封闭的 PDDocument 已关闭? -> 要清楚我做了一个加载 orig PDF,设置拆分器的开始和结束,拆分,关闭 orig PDF。我更新了循环只做一个 addPage 然后保存 newDoc...
    • “COSStream 已关闭且无法读取”是指您过早关闭。仅在完成所有保存后关闭任何 PDF。
    • 调用 split 函数后,我确实关闭了 PDDocument 文档 - 我将它移到了函数的末尾,现在它正在工作......不太确定,因为我所做的只是改变我现在在拆分之前设置了开始页面和结束页面......很奇怪。无论如何,它正在工作,非常感谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多