convert-stream 1.2.1__tar.gz → 1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {convert_stream-1.2.1 → convert_stream-1.3}/PKG-INFO +1 -1
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/__init__.py +5 -6
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/__main__.py +2 -8
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/_version.py +3 -3
- convert_stream-1.3/convert_stream/convert.py +537 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/image_to_pdf.py +88 -36
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/imagelib.py +100 -60
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/models/__init__.py +1 -2
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/models/m_text.py +2 -2
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/models/models_image.py +3 -1
- convert_stream-1.3/convert_stream/models/models_pdf.py +98 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/pdf_compress.py +2 -2
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/pdf_document.py +412 -215
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/pdf_page.py +74 -56
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/pdf_to_images.py +61 -28
- convert_stream-1.3/convert_stream/progress/__init__.py +1 -0
- convert_stream-1.3/convert_stream/progress/progress_bar.py +24 -0
- convert_stream-1.3/convert_stream/table_files.py +215 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream.egg-info/PKG-INFO +1 -1
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream.egg-info/SOURCES.txt +1 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/pyproject.toml +1 -1
- convert_stream-1.2.1/convert_stream/convert.py +0 -339
- convert_stream-1.2.1/convert_stream/models/models_pdf.py +0 -381
- convert_stream-1.2.1/convert_stream/progress/__init__.py +0 -0
- convert_stream-1.2.1/convert_stream/progress/progress_bar.py +0 -156
- {convert_stream-1.2.1 → convert_stream-1.3}/README.md +0 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream/text.py +0 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream.egg-info/dependency_links.txt +0 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream.egg-info/requires.txt +0 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/convert_stream.egg-info/top_level.txt +0 -0
- {convert_stream-1.2.1 → convert_stream-1.3}/setup.cfg +0 -0
|
@@ -12,17 +12,16 @@ from .text import (
|
|
|
12
12
|
LibraryDates, print_title, print_line, save_data
|
|
13
13
|
)
|
|
14
14
|
|
|
15
|
-
from
|
|
16
|
-
|
|
17
|
-
ProgressBarTqdm, ABCProgressBar
|
|
18
|
-
)
|
|
19
|
-
|
|
15
|
+
from .models import LibConvertPDF, LibraryPDF, LibImageToPDF
|
|
16
|
+
from .progress.progress_bar import CreatePbar
|
|
20
17
|
from .models.models_pdf import LibraryPDF
|
|
21
18
|
from .imagelib import ImageObject, ImageInverColor, LibraryImage
|
|
22
19
|
from .pdf_page import PageDocumentPdf, PagePdfFitz, PagePyPdf2
|
|
23
20
|
from .pdf_document import DocumentPdf, FileDocumentPdf
|
|
24
21
|
from .pdf_to_images import ConvertPdfToImage
|
|
25
|
-
from .image_to_pdf import
|
|
22
|
+
from .image_to_pdf import ImageToPdf
|
|
26
23
|
from .convert import PdfStream, ImageStream, get_data_from_pdfs
|
|
27
24
|
from .pdf_compress import CompressDocument
|
|
25
|
+
from .table_files import FileToTable
|
|
26
|
+
|
|
28
27
|
|
|
@@ -18,20 +18,14 @@ this_file = os.path.abspath(os.path.relpath(__file__))
|
|
|
18
18
|
dir_of_project = os.path.dirname(this_file)
|
|
19
19
|
sys.path.insert(0, dir_of_project)
|
|
20
20
|
|
|
21
|
+
|
|
21
22
|
from convert_stream import (
|
|
22
23
|
version, __module_name__, __modify_date__, print_title
|
|
23
24
|
)
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
def test():
|
|
27
|
-
|
|
28
|
-
from soup_files import Directory, File, UserFileSystem
|
|
29
|
-
|
|
30
|
-
outdir = UserFileSystem().userDownloads.concat('output', create=True)
|
|
31
|
-
base = UserFileSystem().userDownloads.join_file('base.pdf')
|
|
32
|
-
|
|
33
|
-
comp = CompressDocument.create_from_file(base, dpi=100)
|
|
34
|
-
comp.to_file(outdir.join_file('teste.pdf'))
|
|
28
|
+
pass
|
|
35
29
|
|
|
36
30
|
|
|
37
31
|
def main():
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
__version__ = '1.
|
|
3
|
+
__version__ = '1.3'
|
|
4
4
|
__author__ = 'Bruno Chaves'
|
|
5
5
|
__license__ = 'MIT'
|
|
6
|
-
__module_name__ = '
|
|
7
|
-
__modify_date__ = '2025-06
|
|
6
|
+
__module_name__ = 'convert_stream'
|
|
7
|
+
__modify_date__ = '2025-07-06'
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import List
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
import pandas
|
|
7
|
+
|
|
8
|
+
from convert_stream.models import LibraryImage, LibraryPDF, LibImageToPDF, LibConvertPDF
|
|
9
|
+
from convert_stream.imagelib import ImageObject
|
|
10
|
+
from convert_stream.progress.progress_bar import CreatePbar
|
|
11
|
+
from convert_stream.pdf_page import PageDocumentPdf
|
|
12
|
+
from convert_stream.pdf_document import DocumentPdf
|
|
13
|
+
from convert_stream.pdf_to_images import ConvertPdfToImage
|
|
14
|
+
from convert_stream.image_to_pdf import ImageToPdf
|
|
15
|
+
from soup_files import File, Directory, ProgressBarAdapter, InputFiles, LibraryDocs
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#==================================================================#
|
|
19
|
+
# PDF
|
|
20
|
+
#==================================================================#
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ABCDocumentStream(ABC):
|
|
24
|
+
"""
|
|
25
|
+
Objeto para manipular a exportação de dados PDF
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self, *,
|
|
30
|
+
library_pdf: LibraryPDF = LibraryPDF.FITZ,
|
|
31
|
+
library_image: LibraryImage = LibraryImage.OPENCV,
|
|
32
|
+
progress_bar: ProgressBarAdapter = CreatePbar().get(),
|
|
33
|
+
):
|
|
34
|
+
self.library_pdf: LibraryPDF = library_pdf
|
|
35
|
+
self.liabrary_image: LibraryImage = library_image
|
|
36
|
+
self.progress_bar: ProgressBarAdapter = progress_bar
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def is_null(self) -> bool:
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
def clear(self):
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def to_file_pdf(self, f: File):
|
|
48
|
+
"""
|
|
49
|
+
Exporta os dados para um arquivo PDF no disco.
|
|
50
|
+
"""
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
def to_files_pdf(self, outdir: Directory, *, prefix='pag'):
|
|
55
|
+
"""Exporta cada página para um novo arquivo PDF no disco"""
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
def to_files_image(self, d: Directory, *, prefix: str = 'página-para-imagem'):
|
|
60
|
+
"""
|
|
61
|
+
Exporta cada página PDF como um arquivo de imagem.
|
|
62
|
+
"""
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
def to_images(self) -> List[ImageObject]:
|
|
67
|
+
"""Retorna uma lista de imagens, dos documentos adicionados."""
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
@abstractmethod
|
|
71
|
+
def to_document(self) -> DocumentPdf:
|
|
72
|
+
"""Converte os itens adicionados em documento"""
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
def inner_images(self) -> List[ImageObject]:
|
|
76
|
+
"""
|
|
77
|
+
Retorna uma lista com todas as imagens presentes em todas as páginas
|
|
78
|
+
"""
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
@abstractmethod
|
|
82
|
+
def inner_images_to_files(self, d: Directory, prefix: str = 'página-para-imagens') -> None:
|
|
83
|
+
"""
|
|
84
|
+
Salva todas as imagens presentes nas páginas em arquivos de imagem.
|
|
85
|
+
"""
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
@abstractmethod
|
|
89
|
+
def add_page(self, p: PageDocumentPdf):
|
|
90
|
+
"""Adiciona uma página PDF"""
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
@abstractmethod
|
|
94
|
+
def add_pages(self, pages: List[PageDocumentPdf]):
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def add_page_pdf_bytes(self, bt: bytes):
|
|
99
|
+
"""Adicona os bytes de uma página PDF."""
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
@abstractmethod
|
|
103
|
+
def add_file_pdf(self, f: File):
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
@abstractmethod
|
|
107
|
+
def add_files_pdf(self, files: List[File]):
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
@abstractmethod
|
|
111
|
+
def add_document(self, doc: DocumentPdf):
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
@abstractmethod
|
|
115
|
+
def add_image(self, image: ImageObject):
|
|
116
|
+
pass
|
|
117
|
+
|
|
118
|
+
@abstractmethod
|
|
119
|
+
def set_paisagem(self):
|
|
120
|
+
"""Define todas as páginas como paisagem."""
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class PdfStream(ABCDocumentStream):
|
|
125
|
+
"""
|
|
126
|
+
Objeto para manipular a exportação de dados PDF
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
def __init__(
|
|
130
|
+
self, *,
|
|
131
|
+
library_pdf: LibraryPDF = LibraryPDF.FITZ,
|
|
132
|
+
library_image: LibraryImage = LibraryImage.OPENCV,
|
|
133
|
+
lib_image_to_pdf: LibImageToPDF = LibImageToPDF.PILPDF,
|
|
134
|
+
progress_bar: ProgressBarAdapter = CreatePbar().get(),
|
|
135
|
+
maximum_pages: int = 3500
|
|
136
|
+
):
|
|
137
|
+
super().__init__(library_pdf=library_pdf, library_image=library_image, progress_bar=progress_bar)
|
|
138
|
+
self.library_pdf: LibraryPDF = library_pdf
|
|
139
|
+
self.library_image: LibraryImage = library_image
|
|
140
|
+
self.lib_image_to_pdf: LibImageToPDF = lib_image_to_pdf
|
|
141
|
+
self.document: DocumentPdf = DocumentPdf(
|
|
142
|
+
self.library_pdf, progress_bar=progress_bar, maximum_pages=maximum_pages
|
|
143
|
+
)
|
|
144
|
+
#
|
|
145
|
+
self.convert_pdf_to_images = ConvertPdfToImage.create(
|
|
146
|
+
self.library_image,
|
|
147
|
+
pbar=self.progress_bar,
|
|
148
|
+
lib_convert_pdf=LibConvertPDF.FITZ
|
|
149
|
+
)
|
|
150
|
+
if self.lib_image_to_pdf == LibImageToPDF.CANVAS:
|
|
151
|
+
self.convert_images_to_pdf: ImageToPdf = ImageToPdf.create_from_canvas(self.library_image)
|
|
152
|
+
elif self.lib_image_to_pdf == LibImageToPDF.PILPDF:
|
|
153
|
+
self.convert_images_to_pdf: ImageToPdf = ImageToPdf.create_from_pil(LibraryImage.PIL)
|
|
154
|
+
elif self.lib_image_to_pdf == LibImageToPDF.FITZ:
|
|
155
|
+
self.convert_images_to_pdf: ImageToPdf = ImageToPdf.create_from_fitz(LibraryImage.PIL)
|
|
156
|
+
else:
|
|
157
|
+
self.convert_images_to_pdf: ImageToPdf = ImageToPdf.create_from_pil(self.library_image)
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def num_pages(self) -> int:
|
|
161
|
+
return self.document.get_num_pages()
|
|
162
|
+
|
|
163
|
+
@num_pages.setter
|
|
164
|
+
def num_pages(self, num: int):
|
|
165
|
+
self.document.set_num_pages(num)
|
|
166
|
+
|
|
167
|
+
@property
|
|
168
|
+
def pages(self) -> List[PageDocumentPdf]:
|
|
169
|
+
return self.document.get_pages()
|
|
170
|
+
|
|
171
|
+
@pages.setter
|
|
172
|
+
def pages(self, new: List[PageDocumentPdf]):
|
|
173
|
+
if not isinstance(new, list):
|
|
174
|
+
return
|
|
175
|
+
self.document.clear()
|
|
176
|
+
for pg in new:
|
|
177
|
+
self.add_page(pg)
|
|
178
|
+
|
|
179
|
+
def is_null(self) -> bool:
|
|
180
|
+
return self.document.is_null()
|
|
181
|
+
|
|
182
|
+
def clear(self):
|
|
183
|
+
self.document.clear()
|
|
184
|
+
|
|
185
|
+
def add_page(self, p: PageDocumentPdf):
|
|
186
|
+
if not isinstance(p, PageDocumentPdf):
|
|
187
|
+
return
|
|
188
|
+
self.document.add_page(p)
|
|
189
|
+
|
|
190
|
+
def add_pages(self, pages: List[PageDocumentPdf]):
|
|
191
|
+
if not isinstance(pages, list):
|
|
192
|
+
print(f'{__class__.__name__} Erro: Use lista de PageDocumentPdf, não {type(pages)}')
|
|
193
|
+
return
|
|
194
|
+
max_num: int = len(pages)
|
|
195
|
+
self.progress_bar.start()
|
|
196
|
+
for num, p in enumerate(pages):
|
|
197
|
+
self.progress_bar.update(
|
|
198
|
+
((num+1)/max_num) * 100,
|
|
199
|
+
f'Adicionando página: [{num+1} de {max_num}]'
|
|
200
|
+
)
|
|
201
|
+
self.add_page(p)
|
|
202
|
+
self.progress_bar.stop()
|
|
203
|
+
|
|
204
|
+
def add_folder(
|
|
205
|
+
self, d: Directory, *,
|
|
206
|
+
file_type: LibraryDocs = LibraryDocs.PDF,
|
|
207
|
+
max_files: int = 4000
|
|
208
|
+
):
|
|
209
|
+
files = InputFiles(d, maxFiles=max_files).get_files(file_type=file_type)
|
|
210
|
+
if file_type == LibraryDocs.PDF:
|
|
211
|
+
self.add_files_pdf(files)
|
|
212
|
+
elif file_type == LibraryDocs.IMAGE:
|
|
213
|
+
self.add_images([ImageObject.create_from_file(f) for f in files])
|
|
214
|
+
|
|
215
|
+
def add_page_pdf_bytes(self, bt: bytes):
|
|
216
|
+
_page = PageDocumentPdf.create_from_page_bytes(bt, library=self.library_pdf)
|
|
217
|
+
self.add_page(_page)
|
|
218
|
+
|
|
219
|
+
def add_file_pdf(self, f: File):
|
|
220
|
+
self.document.add_file_pdf(f)
|
|
221
|
+
|
|
222
|
+
def add_files_pdf(self, files: List[File]):
|
|
223
|
+
for f in files:
|
|
224
|
+
self.add_file_pdf(f)
|
|
225
|
+
|
|
226
|
+
def add_document(self, doc: DocumentPdf):
|
|
227
|
+
self.add_pages(doc.get_pages())
|
|
228
|
+
|
|
229
|
+
def add_image(self, image: ImageObject):
|
|
230
|
+
pg: PageDocumentPdf = self.convert_images_to_pdf.from_image(image)
|
|
231
|
+
self.add_page(pg)
|
|
232
|
+
|
|
233
|
+
def add_images(self, images: List[ImageObject]):
|
|
234
|
+
maxnum: int = len(images)
|
|
235
|
+
self.progress_bar.start()
|
|
236
|
+
for n, img in enumerate(images):
|
|
237
|
+
self.progress_bar.update(
|
|
238
|
+
((n+1)/maxnum) * 100,
|
|
239
|
+
f'Adicionando imagens ao documento: [{n+1}] de {maxnum}'
|
|
240
|
+
)
|
|
241
|
+
self.add_image(img)
|
|
242
|
+
self.progress_bar.stop()
|
|
243
|
+
|
|
244
|
+
def to_file_pdf(self, f: File):
|
|
245
|
+
if self.is_null():
|
|
246
|
+
print(
|
|
247
|
+
f'{__class__.__name__} Nenhuma página foi adiconada, adicione páginas ao documento para prosseguir!'
|
|
248
|
+
)
|
|
249
|
+
docpdf: DocumentPdf = DocumentPdf(
|
|
250
|
+
self.library_pdf, progress_bar=self.progress_bar, pages=self.pages
|
|
251
|
+
)
|
|
252
|
+
docpdf.to_file_pdf(f)
|
|
253
|
+
|
|
254
|
+
def to_files_pdf(self, outdir: Directory, *, prefix='documento', replace: bool = False):
|
|
255
|
+
if self.is_null():
|
|
256
|
+
print(
|
|
257
|
+
f'{__class__.__name__} Adicione páginas ao documento para prosseguir!'
|
|
258
|
+
)
|
|
259
|
+
return
|
|
260
|
+
self.document.to_files_pdf(outdir, prefix, replace=replace)
|
|
261
|
+
|
|
262
|
+
def to_files_image(self, d: Directory, *, prefix: str = 'pdf-para-imagem', replace: bool = False):
|
|
263
|
+
"""
|
|
264
|
+
Exporta cada página PDF como um arquivo de imagem.
|
|
265
|
+
"""
|
|
266
|
+
d.mkdir()
|
|
267
|
+
self.progress_bar.start()
|
|
268
|
+
for num, page in enumerate(self.pages):
|
|
269
|
+
output_file: File = d.join_file(f'{prefix}_{page.page_number}.png')
|
|
270
|
+
if not replace:
|
|
271
|
+
if output_file.exists():
|
|
272
|
+
print(f'[A IMAGEM JÁ EXISTE]: {output_file.absolute()}')
|
|
273
|
+
continue
|
|
274
|
+
img = self.convert_pdf_to_images.from_page_pdf(page)
|
|
275
|
+
self.progress_bar.update_text(
|
|
276
|
+
f'Exportando página PDF para imagem: [{num+1} de {self.num_pages}] {output_file.basename()}'
|
|
277
|
+
)
|
|
278
|
+
img.to_file(output_file)
|
|
279
|
+
print()
|
|
280
|
+
self.progress_bar.stop()
|
|
281
|
+
|
|
282
|
+
def to_images(self) -> List[ImageObject]:
|
|
283
|
+
images_obj: List[ImageObject] = []
|
|
284
|
+
for page in self.pages:
|
|
285
|
+
_image: ImageObject = self.convert_pdf_to_images.from_page_pdf(page)
|
|
286
|
+
images_obj.append(_image)
|
|
287
|
+
return images_obj
|
|
288
|
+
|
|
289
|
+
def to_document(self) -> DocumentPdf:
|
|
290
|
+
return DocumentPdf(
|
|
291
|
+
self.library_pdf,
|
|
292
|
+
progress_bar=self.progress_bar,
|
|
293
|
+
pages=self.pages,
|
|
294
|
+
maximum_pages=self.document.get_maximum_pages(),
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
def inner_images(self) -> List[ImageObject]:
|
|
298
|
+
inner_images: List[ImageObject] = []
|
|
299
|
+
for num, p in enumerate(self.pages):
|
|
300
|
+
self.progress_bar.update(
|
|
301
|
+
((num+1)/self.num_pages) * 100,
|
|
302
|
+
f'Convertendo página [{num+1} de {self.num_pages}]'
|
|
303
|
+
)
|
|
304
|
+
imgs: List[ImageObject] = self.convert_pdf_to_images.inner_images(p.to_bytes())
|
|
305
|
+
inner_images.extend(imgs)
|
|
306
|
+
return inner_images
|
|
307
|
+
|
|
308
|
+
def inner_images_to_files(self, d: Directory, prefix: str = 'página-para-imagens') -> None:
|
|
309
|
+
"""
|
|
310
|
+
Salva todas as imagens presentes nas páginas PDF, em arquivos de imagem.
|
|
311
|
+
"""
|
|
312
|
+
d.mkdir()
|
|
313
|
+
for num, page in enumerate(self.pages):
|
|
314
|
+
images = self.convert_pdf_to_images.inner_images(page.to_bytes())
|
|
315
|
+
if len(images) < 1:
|
|
316
|
+
continue
|
|
317
|
+
for n, img in enumerate(images):
|
|
318
|
+
filename = f'{prefix}-{page.page_number}-img-{n+1}.png'
|
|
319
|
+
img.to_file(d.join_file(filename))
|
|
320
|
+
|
|
321
|
+
def set_paisagem(self):
|
|
322
|
+
for page in self.pages:
|
|
323
|
+
page.set_paisagem()
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
#==================================================================#
|
|
327
|
+
# Imagens
|
|
328
|
+
#==================================================================#
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
class ImageStream(object):
|
|
332
|
+
"""
|
|
333
|
+
Conversão de imagens.
|
|
334
|
+
"""
|
|
335
|
+
def __init__(
|
|
336
|
+
self, *,
|
|
337
|
+
library_image: LibraryImage = LibraryImage.OPENCV,
|
|
338
|
+
library_pdf: LibraryPDF = LibraryPDF.FITZ,
|
|
339
|
+
lib_image_to_pdf: LibImageToPDF = LibImageToPDF.FITZ,
|
|
340
|
+
progress_bar: ProgressBarAdapter = CreatePbar().get(),
|
|
341
|
+
):
|
|
342
|
+
self._images: List[ImageObject] = []
|
|
343
|
+
self.num_images: int = len(self._images)
|
|
344
|
+
self.library_image: LibraryImage = library_image
|
|
345
|
+
self.library_pdf: LibraryPDF = library_pdf
|
|
346
|
+
self.lib_image_to_pdf: LibImageToPDF = lib_image_to_pdf
|
|
347
|
+
|
|
348
|
+
self.convert_pdf_to_images = ConvertPdfToImage.create(
|
|
349
|
+
self.library_image,
|
|
350
|
+
pbar=progress_bar,
|
|
351
|
+
lib_convert_pdf=LibConvertPDF.FITZ
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
# Objeto para converter PDF em imagem.
|
|
355
|
+
if self.lib_image_to_pdf == LibImageToPDF.PILPDF:
|
|
356
|
+
self.convert_image_to_pdf: ImageToPdf = ImageToPdf.create_from_pil(library_image)
|
|
357
|
+
elif self.lib_image_to_pdf == LibImageToPDF.FITZ:
|
|
358
|
+
self.convert_image_to_pdf: ImageToPdf = ImageToPdf.create_from_fitz(library_image)
|
|
359
|
+
elif self.lib_image_to_pdf == LibImageToPDF.CANVAS:
|
|
360
|
+
self.convert_image_to_pdf: ImageToPdf = ImageToPdf.create_from_canvas(library_image)
|
|
361
|
+
else:
|
|
362
|
+
raise NotImplementedError()
|
|
363
|
+
|
|
364
|
+
@property
|
|
365
|
+
def progress_bar(self) -> ProgressBarAdapter:
|
|
366
|
+
return self.convert_pdf_to_images.pbar
|
|
367
|
+
|
|
368
|
+
@property
|
|
369
|
+
def images(self) -> List[ImageObject]:
|
|
370
|
+
return self._images
|
|
371
|
+
|
|
372
|
+
@images.setter
|
|
373
|
+
def images(self, imgs: List[ImageObject]) -> None:
|
|
374
|
+
if not isinstance(imgs, list):
|
|
375
|
+
print(f'Erro: Use: list() não {type(imgs)}')
|
|
376
|
+
return
|
|
377
|
+
self.num_images = 0
|
|
378
|
+
for img in imgs:
|
|
379
|
+
self.add_image(img)
|
|
380
|
+
|
|
381
|
+
def add_image(self, img: ImageObject) -> None:
|
|
382
|
+
if not isinstance(img, ImageObject):
|
|
383
|
+
return
|
|
384
|
+
self._images.append(img)
|
|
385
|
+
self.num_images += 1
|
|
386
|
+
|
|
387
|
+
def add_images(self, images: List[ImageObject]):
|
|
388
|
+
maxnum: int = len(images)
|
|
389
|
+
self.progress_bar.start()
|
|
390
|
+
for num, i in enumerate(images):
|
|
391
|
+
self.add_image(i)
|
|
392
|
+
self.progress_bar.stop()
|
|
393
|
+
|
|
394
|
+
def add_file_image(self, f: File):
|
|
395
|
+
img = ImageObject.create_from_file(f, library=self.library_image)
|
|
396
|
+
self.add_image(img)
|
|
397
|
+
|
|
398
|
+
def add_files_image(self, files: List[File]):
|
|
399
|
+
maxnum: int = len(files)
|
|
400
|
+
for num, f in enumerate(files):
|
|
401
|
+
self.progress_bar.update(
|
|
402
|
+
((num + 1) / maxnum) * 100,
|
|
403
|
+
f'Adicionando imagens: [{num + 1} de {maxnum}] {f.basename()}'
|
|
404
|
+
)
|
|
405
|
+
self.add_file_image(f)
|
|
406
|
+
|
|
407
|
+
def is_null(self) -> bool:
|
|
408
|
+
if self.num_images < 1:
|
|
409
|
+
return True
|
|
410
|
+
return False
|
|
411
|
+
|
|
412
|
+
def clear(self):
|
|
413
|
+
self._images.clear()
|
|
414
|
+
self.num_images = 0
|
|
415
|
+
|
|
416
|
+
def to_files_image(self, d: Directory, prefix: str = 'imagem', *, replace: bool = False):
|
|
417
|
+
"""
|
|
418
|
+
@param replace: substituir arquivos existentes no destino.
|
|
419
|
+
@param d: Diretório para exportar as imagens
|
|
420
|
+
@param prefix: prefixo para o nome das imagens
|
|
421
|
+
@return: None
|
|
422
|
+
|
|
423
|
+
@type d: Directory
|
|
424
|
+
@type prefix: str
|
|
425
|
+
@rtype: None
|
|
426
|
+
"""
|
|
427
|
+
d.mkdir()
|
|
428
|
+
self.progress_bar.start()
|
|
429
|
+
for num, image in enumerate(self.images):
|
|
430
|
+
filename = f'{prefix}-{num+1}.png'
|
|
431
|
+
output_file: File = d.join_file(filename)
|
|
432
|
+
if not replace:
|
|
433
|
+
if output_file.exists():
|
|
434
|
+
continue
|
|
435
|
+
self.progress_bar.update(
|
|
436
|
+
((num+1)/self.num_images) * 100,
|
|
437
|
+
f'Exportando imagem: {num+1} de {self.num_images} [{filename}]'
|
|
438
|
+
)
|
|
439
|
+
image.to_file(output_file)
|
|
440
|
+
self.progress_bar.stop()
|
|
441
|
+
|
|
442
|
+
def to_pages_pdf(self) -> List[PageDocumentPdf]:
|
|
443
|
+
if self.is_null():
|
|
444
|
+
print(f'{__class__.__name__} Adicione imagens para prosseguir!')
|
|
445
|
+
return []
|
|
446
|
+
new_pages: List[PageDocumentPdf] = []
|
|
447
|
+
maxnum: int = len(self.images)
|
|
448
|
+
self.progress_bar.start()
|
|
449
|
+
for num, image in enumerate(self.images):
|
|
450
|
+
self.progress_bar.update(
|
|
451
|
+
((num + 1) / maxnum) * 100,
|
|
452
|
+
f'Criando páginas PDF: [{num + 1} de {maxnum}]'
|
|
453
|
+
)
|
|
454
|
+
im = self.convert_image_to_pdf.from_image(image)
|
|
455
|
+
new_pages.append(im)
|
|
456
|
+
self.progress_bar.stop()
|
|
457
|
+
return new_pages
|
|
458
|
+
|
|
459
|
+
def to_documet(self) -> DocumentPdf:
|
|
460
|
+
return DocumentPdf(progress_bar=self.progress_bar, pages=self.to_pages_pdf())
|
|
461
|
+
|
|
462
|
+
def set_paisagem(self):
|
|
463
|
+
for num, img in enumerate(self.images):
|
|
464
|
+
self.images[num].set_paisagem()
|
|
465
|
+
|
|
466
|
+
def set_gaussian_blur(self):
|
|
467
|
+
self.progress_bar.start()
|
|
468
|
+
for num, img in enumerate(self.images):
|
|
469
|
+
self.progress_bar.update(
|
|
470
|
+
((num+1) / self.num_images) * 100,
|
|
471
|
+
f'Removendo o ruido [{num+1} de {self.num_images}]'
|
|
472
|
+
)
|
|
473
|
+
self.images[num].set_gaussian()
|
|
474
|
+
self.progress_bar.stop()
|
|
475
|
+
|
|
476
|
+
def set_backgroud_black(self):
|
|
477
|
+
self.progress_bar.start()
|
|
478
|
+
for num, img in enumerate(self.images):
|
|
479
|
+
self.progress_bar.update(
|
|
480
|
+
((num + 1) / self.num_images) * 100,
|
|
481
|
+
f'Removendo o ruido [{num + 1} de {self.num_images}]'
|
|
482
|
+
)
|
|
483
|
+
self.images[num].set_background_black()
|
|
484
|
+
self.progress_bar.stop()
|
|
485
|
+
|
|
486
|
+
def set_background_gray(self):
|
|
487
|
+
self.progress_bar.start()
|
|
488
|
+
for num, img in enumerate(self.images):
|
|
489
|
+
self.progress_bar.update(
|
|
490
|
+
((num + 1) / self.num_images) * 100,
|
|
491
|
+
f'Removendo o ruido [{num + 1} de {self.num_images}]'
|
|
492
|
+
)
|
|
493
|
+
self.images[num].set_background_gray()
|
|
494
|
+
self.progress_bar.stop()
|
|
495
|
+
|
|
496
|
+
def set_optimize(self):
|
|
497
|
+
self.progress_bar.start()
|
|
498
|
+
for num, img in enumerate(self.images):
|
|
499
|
+
self.progress_bar.update(
|
|
500
|
+
((num + 1) / self.num_images) * 100,
|
|
501
|
+
f'Otimizando imagem [{num + 1} de {self.num_images}]'
|
|
502
|
+
)
|
|
503
|
+
self.images[num].set_optimize()
|
|
504
|
+
self.progress_bar.stop()
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
def get_data_from_pdfs(*, files_pdf: List[File]) -> pandas.DataFrame:
|
|
508
|
+
"""
|
|
509
|
+
Recebe uma lista de arquivos PDF e retorna um DataFrame com os dados das cartas.
|
|
510
|
+
"""
|
|
511
|
+
if not isinstance(files_pdf, list):
|
|
512
|
+
raise ValueError(f'Erro: Use: list() não {type(files_pdf)}')
|
|
513
|
+
|
|
514
|
+
data: List[pandas.DataFrame] = []
|
|
515
|
+
values: List[str] = []
|
|
516
|
+
doc = DocumentPdf()
|
|
517
|
+
for file in files_pdf:
|
|
518
|
+
doc.add_file_pdf(file)
|
|
519
|
+
for page in doc.pages:
|
|
520
|
+
text = page.to_string()
|
|
521
|
+
if (text is not None) and (text != ''):
|
|
522
|
+
values.extend(text.split('\n'))
|
|
523
|
+
data.append(
|
|
524
|
+
pandas.DataFrame(
|
|
525
|
+
{
|
|
526
|
+
'TEXT': values,
|
|
527
|
+
'ARQUIVO': [file.absolute()] * len(values)
|
|
528
|
+
}
|
|
529
|
+
)
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
values.clear()
|
|
533
|
+
doc.clear()
|
|
534
|
+
if len(data) < 1:
|
|
535
|
+
return pandas.DataFrame()
|
|
536
|
+
return pandas.concat(data).astype('str')
|
|
537
|
+
|