Skip to main content

rust_pdf_box/manipulation/
splitter.rs

1use crate::error::PdfResult;
2use crate::manipulation::merger::PDFMerger;
3use crate::pd::document::PDDocument;
4
5/// Splits PDF documents into single pages or page chunks.
6pub struct PDFSplitter;
7
8impl PDFSplitter {
9    /// Splits a document into multiple 1-page documents.
10    pub fn split_into_single_pages(doc: &PDDocument) -> PdfResult<Vec<PDDocument>> {
11        Self::split_by_chunk_size(doc, 1)
12    }
13
14    /// Splits a document into chunks of `chunk_size` pages each.
15    pub fn split_by_chunk_size(doc: &PDDocument, chunk_size: usize) -> PdfResult<Vec<PDDocument>> {
16        let chunk_size = chunk_size.max(1);
17        let mut results = Vec::new();
18        let total_pages = doc.page_count();
19
20        for chunk_start in (0..total_pages).step_by(chunk_size) {
21            let chunk_end = (chunk_start + chunk_size).min(total_pages);
22            let mut sub_doc = PDDocument::new();
23
24            for p_idx in chunk_start..chunk_end {
25                let page = doc.get_page(p_idx)?;
26                let mut temp_single = PDDocument::new();
27                temp_single.add_page(page.clone());
28                PDFMerger::append_document(&mut sub_doc, &temp_single)?;
29            }
30
31            results.push(sub_doc);
32        }
33
34        Ok(results)
35    }
36}