|
9 | 9 | from mindee.error.mindee_error import MindeeError |
10 | 10 | from mindee.input.local_input_source import LocalInputSource |
11 | 11 | from mindee.pdf.extracted_pdf import ExtractedPDF |
| 12 | +from mindee.pdf.extracted_pdfs import ExtractedPDFs |
12 | 13 |
|
13 | 14 | if PYPDFIUM2_AVAILABLE: |
14 | 15 | # pylint: disable=import-error |
@@ -42,60 +43,51 @@ def __init__(self, local_input: LocalInputSource): |
42 | 43 | pdf_image.save(self._source_pdf, format="PDF") |
43 | 44 |
|
44 | 45 | @requires_pypdfium2 |
45 | | - def cut_pages(self, page_indexes: list) -> BinaryIO: |
| 46 | + def extract_single_document(self, page_indexes: list[int]) -> ExtractedPDF: |
46 | 47 | """ |
47 | 48 | Create a new PDF from pages and save it into a buffer. |
48 | 49 |
|
49 | 50 | :param page_indexes: List of pages number to use for merging in the original PDF. |
50 | 51 | :return: The buffer containing the new PDF. |
51 | 52 | """ |
| 53 | + if not page_indexes or len(page_indexes) == 0: |
| 54 | + raise MindeeError("Empty indexes aren't allowed for extraction.") |
| 55 | + for page_index in page_indexes: |
| 56 | + if page_index > self._page_count: |
| 57 | + raise MindeeError(f"Index {page_index} is out of range.") |
| 58 | + |
52 | 59 | self._source_pdf.seek(0) |
53 | 60 | new_pdf = pdfium.PdfDocument.new() |
54 | 61 | pdf = pdfium.PdfDocument(self._source_pdf) |
55 | 62 | new_pdf.import_pages(pdf, page_indexes) |
56 | 63 | bytes_io = io.BytesIO() |
57 | 64 | new_pdf.save(bytes_io) |
58 | | - return bytes_io |
| 65 | + |
| 66 | + first_page = page_indexes[0] |
| 67 | + last_page = page_indexes[len(page_indexes) - 1] |
| 68 | + return ExtractedPDF( |
| 69 | + pdf_byte_stream=bytes_io, |
| 70 | + filename=self._make_filename(first_page, last_page), |
| 71 | + page_indexes=page_indexes, |
| 72 | + ) |
59 | 73 |
|
60 | 74 | @requires_pypdfium2 |
61 | | - def extract_sub_documents( |
| 75 | + def extract_multiple_documents( |
62 | 76 | self, page_indexes: list[list[int]] |
63 | | - ) -> list[ExtractedPDF]: |
| 77 | + ) -> ExtractedPDFs: |
64 | 78 | """ |
65 | 79 | Extract the sub-documents from the main pdf, based on the given list of page indexes. |
66 | 80 |
|
67 | 81 | :param page_indexes: 2D list of numbers, representing page indexes. |
68 | 82 | :return: A list of created PDFS. |
69 | 83 | """ |
| 84 | + if len(page_indexes) < 1: |
| 85 | + raise MindeeError("No indexes provided.") |
70 | 86 | extracted_pdfs: list[ExtractedPDF] = [] |
71 | | - extension = Path(self._filename).suffix |
72 | | - stem = Path(self._filename).stem |
73 | 87 | for page_index_elem in page_indexes: |
74 | | - if not page_index_elem or len(page_index_elem) == 0: |
75 | | - raise MindeeError("Empty indexes aren't allowed for extraction.") |
76 | | - for page_index in page_index_elem: |
77 | | - if page_index > self._page_count: |
78 | | - raise MindeeError(f"Index {page_index} is out of range.") |
79 | | - first_page = page_index_elem[0] |
80 | | - last_page = page_index_elem[len(page_index_elem) - 1] |
81 | | - extracted_pdf = ExtractedPDF( |
82 | | - self.cut_pages(page_index_elem), |
83 | | - f"{stem}_pages-{(first_page + 1):03d}-{(last_page + 1):03d}{extension}", |
84 | | - (first_page, last_page), |
85 | | - ) |
86 | | - extracted_pdfs.append(extracted_pdf) |
87 | | - return extracted_pdfs |
| 88 | + extracted_pdfs.append(self.extract_single_document(page_index_elem)) |
| 89 | + return ExtractedPDFs(extracted_pdfs) |
88 | 90 |
|
89 | | - def extract_documents( |
90 | | - self, |
91 | | - page_indexes: list[list[int]], |
92 | | - ) -> list[ExtractedPDF]: |
93 | | - """ |
94 | | - Extracts complete PDFs from the document. |
95 | | -
|
96 | | - :param page_indexes: List of sub-lists of pages to keep. |
97 | | - :return: A list of extracted invoices. |
98 | | - """ |
99 | | - if len(page_indexes) < 1: |
100 | | - raise MindeeError("No indexes provided.") |
101 | | - return self.extract_sub_documents(page_indexes) |
| 91 | + def _make_filename(self, first_page: int, last_page: int) -> str: |
| 92 | + stem = Path(self._filename).stem |
| 93 | + return f"{stem}_pages-{(first_page + 1):03d}-{(last_page + 1):03d}.pdf" |
0 commit comments