convert-stream 1.1__py3-none-any.whl
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.
Potentially problematic release.
This version of convert-stream might be problematic. Click here for more details.
- convert_stream/__init__.py +19 -0
- convert_stream/__main__.py +29 -0
- convert_stream/_version.py +7 -0
- convert_stream/convert.py +300 -0
- convert_stream/imagelib.py +493 -0
- convert_stream/library.py +5 -0
- convert_stream/models/__init__.py +10 -0
- convert_stream/models/m_imgelib.py +107 -0
- convert_stream/models/m_pdf_convert.py +171 -0
- convert_stream/models/m_pdf_document.py +139 -0
- convert_stream/models/m_pdf_page.py +88 -0
- convert_stream/models/m_text.py +480 -0
- convert_stream/pdf_convert.py +282 -0
- convert_stream/pdf_document.py +534 -0
- convert_stream/pdf_page.py +251 -0
- convert_stream/text.py +8 -0
- convert_stream-1.1.dist-info/METADATA +45 -0
- convert_stream-1.1.dist-info/RECORD +20 -0
- convert_stream-1.1.dist-info/WHEEL +5 -0
- convert_stream-1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#
|
|
3
|
+
from ._version import (
|
|
4
|
+
__version__, __module_name__, __author__, __license__, __modify_date__
|
|
5
|
+
)
|
|
6
|
+
from .text import (
|
|
7
|
+
ArrayString, ConvertDate, DataString, TableText, LibraryDates,
|
|
8
|
+
print_title, print_line, save_data
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from .library import LibraryPDF
|
|
12
|
+
from .imagelib import ImageObject, ImageInverColor, LibraryImage
|
|
13
|
+
from .pdf_page import PageDocumentPdf, FitzPagePdf, PyPdf2PagePdf
|
|
14
|
+
from .pdf_document import DocumentPdf
|
|
15
|
+
from .pdf_convert import ConvertPdfToImage, ImageConvertPdf
|
|
16
|
+
from .convert import PdfStream, ImageStream, get_data_from_pdfs
|
|
17
|
+
|
|
18
|
+
version = __version__
|
|
19
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Configuração instalação:
|
|
5
|
+
$ pip3 install -r requirements.txt
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
------------------[versão 1.1]------------------
|
|
9
|
+
+ Incluir funcionalidade para adicionar imagens ao PdfStream()
|
|
10
|
+
+ Incluir os métodos __eq__() e __hash__() em PageDocumentPdf()
|
|
11
|
+
+ Incluir o método set_rotation() em ImageObject()
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
import sys, os
|
|
15
|
+
this_file = os.path.abspath(os.path.relpath(__file__))
|
|
16
|
+
dir_of_project = os.path.dirname(this_file)
|
|
17
|
+
sys.path.insert(0, dir_of_project)
|
|
18
|
+
|
|
19
|
+
from convertlib import version, __module_name__, __modify_date__, print_title
|
|
20
|
+
|
|
21
|
+
def test():
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
def main():
|
|
25
|
+
print_title(f'{__module_name__} versão {version} - {__modify_date__}', char='-')
|
|
26
|
+
test()
|
|
27
|
+
|
|
28
|
+
if __name__ == '__main__':
|
|
29
|
+
main()
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import List
|
|
5
|
+
import pandas
|
|
6
|
+
|
|
7
|
+
from convertlib.models import ABCDocumentStream, LibraryImage, LibraryPDF
|
|
8
|
+
from convertlib.imagelib import ImageObject
|
|
9
|
+
from convertlib.pdf_page import PageDocumentPdf
|
|
10
|
+
from convertlib.pdf_document import DocumentPdf
|
|
11
|
+
from convertlib.pdf_convert import ConvertPdfToImage, ImageConvertPdf
|
|
12
|
+
from soup_files import File, Directory
|
|
13
|
+
|
|
14
|
+
#==================================================================#
|
|
15
|
+
# PDF
|
|
16
|
+
#==================================================================#
|
|
17
|
+
class PdfStream(ABCDocumentStream):
|
|
18
|
+
"""
|
|
19
|
+
Objeto para manipular a exportação de dados PDF
|
|
20
|
+
"""
|
|
21
|
+
def __init__(self, *, library_pdf=LibraryPDF.FITZ, library_image=LibraryImage.OPENCV):
|
|
22
|
+
|
|
23
|
+
self.num_pages:int = 0
|
|
24
|
+
self.library_pdf:LibraryPDF = library_pdf
|
|
25
|
+
self.library_image:LibraryImage = library_image
|
|
26
|
+
self.document:DocumentPdf = DocumentPdf(self.library_pdf)
|
|
27
|
+
self.converPdfToImages:ConvertPdfToImage = ConvertPdfToImage(library_image=library_image)
|
|
28
|
+
|
|
29
|
+
if self.library_pdf == LibraryPDF.CANVAS:
|
|
30
|
+
self.imagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_canvas(self.library_image)
|
|
31
|
+
elif self.library_pdf == LibraryPDF.PILPDF:
|
|
32
|
+
self.imagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_pil(LibraryImage.PIL)
|
|
33
|
+
else:
|
|
34
|
+
self.imagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_fitz(self.library_image)
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def num_pages(self) -> int:
|
|
38
|
+
return self.document.num_pages
|
|
39
|
+
|
|
40
|
+
@num_pages.setter
|
|
41
|
+
def num_pages(self, num:int):
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def pages(self) -> List[PageDocumentPdf]:
|
|
46
|
+
return self.document.pages
|
|
47
|
+
|
|
48
|
+
@pages.setter
|
|
49
|
+
def pages(self, new:List[PageDocumentPdf]):
|
|
50
|
+
if not isinstance(new, list):
|
|
51
|
+
return
|
|
52
|
+
self.document.clear()
|
|
53
|
+
for pg in new:
|
|
54
|
+
self.add_page(pg)
|
|
55
|
+
|
|
56
|
+
def is_null(self) -> bool:
|
|
57
|
+
return self.document.is_null()
|
|
58
|
+
|
|
59
|
+
def clear(self):
|
|
60
|
+
self.document.clear()
|
|
61
|
+
|
|
62
|
+
def add_page(self, p:PageDocumentPdf):
|
|
63
|
+
if not isinstance(p, PageDocumentPdf):
|
|
64
|
+
return
|
|
65
|
+
self.document.add_page(p)
|
|
66
|
+
|
|
67
|
+
def add_pages(self, pages:List[PageDocumentPdf]):
|
|
68
|
+
if not isinstance(pages, list):
|
|
69
|
+
print(f'{__class__.__name__} Erro: Use lista de PageDocumentPdf, não {type(pages)}')
|
|
70
|
+
return
|
|
71
|
+
for p in pages:
|
|
72
|
+
self.add_page(p)
|
|
73
|
+
|
|
74
|
+
def add_page_pdf_bytes(self, bt:bytes):
|
|
75
|
+
_page = PageDocumentPdf.create_from_page_bytes(bt, library=self.library_pdf)
|
|
76
|
+
self.add_page(_page)
|
|
77
|
+
|
|
78
|
+
def add_file_pdf(self, f:File):
|
|
79
|
+
doc:DocumentPdf = DocumentPdf(self.library_pdf)
|
|
80
|
+
doc.add_file_pdf(f)
|
|
81
|
+
self.add_pages(doc.pages)
|
|
82
|
+
|
|
83
|
+
def add_files_pdf(self, files:List[File]):
|
|
84
|
+
for f in files:
|
|
85
|
+
self.add_file_pdf(f)
|
|
86
|
+
|
|
87
|
+
def add_document(self, doc:DocumentPdf):
|
|
88
|
+
self.add_pages(doc.pages)
|
|
89
|
+
|
|
90
|
+
def add_image(self, image: ImageObject):
|
|
91
|
+
pg: PageDocumentPdf = self.imagesToPdf.from_image(image)
|
|
92
|
+
self.add_page(pg)
|
|
93
|
+
|
|
94
|
+
def to_file_pdf(self, f:File):
|
|
95
|
+
if self.is_null():
|
|
96
|
+
print(
|
|
97
|
+
f'{__class__.__name__} Nenhuma página foi adiconada, adicione páginas ao documento para prosseguir!'
|
|
98
|
+
)
|
|
99
|
+
docpdf:DocumentPdf = DocumentPdf(self.library_pdf)
|
|
100
|
+
docpdf.add_pages(self.pages)
|
|
101
|
+
docpdf.to_file_pdf(f)
|
|
102
|
+
|
|
103
|
+
def to_files_pdf(self, outdir:Directory, *, prefix='pag'):
|
|
104
|
+
if self.is_null():
|
|
105
|
+
print(
|
|
106
|
+
f'{__class__.__name__} Nenhuma página foi adiconada, adicione páginas ao documento para prosseguir!'
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
outdir.mkdir()
|
|
110
|
+
_document:DocumentPdf = DocumentPdf(self.library_pdf)
|
|
111
|
+
for num, p in enumerate(self.pages):
|
|
112
|
+
filename:str = f'{prefix}-{num+1}.pdf'
|
|
113
|
+
print(f'Exportando página: {p.page_number} de {self.num_pages} | [{filename}]')
|
|
114
|
+
_document.add_page(p)
|
|
115
|
+
_document.to_file_pdf(outdir.join_file(filename))
|
|
116
|
+
_document.clear()
|
|
117
|
+
|
|
118
|
+
def to_files_image(self, d:Directory, *, prefix:str='página-para-imagem'):
|
|
119
|
+
"""
|
|
120
|
+
Exporta cada página PDF como um arquivo de imagem.
|
|
121
|
+
"""
|
|
122
|
+
d.mkdir()
|
|
123
|
+
for num, page in enumerate(self.pages):
|
|
124
|
+
filename = f'{prefix}-{page.page_number}.png'
|
|
125
|
+
img = self.converPdfToImages.from_page_pdf(page)
|
|
126
|
+
print(f'Exportando página PDF para imagem: [{num+1} de {self.num_pages}] {filename}')
|
|
127
|
+
img.to_file(d.join_file(filename))
|
|
128
|
+
|
|
129
|
+
def to_images(self) -> List[ImageObject]:
|
|
130
|
+
images_obj:List[ImageObject] = []
|
|
131
|
+
for page in self.pages:
|
|
132
|
+
images_obj.append(self.converPdfToImages.from_page_pdf(page))
|
|
133
|
+
return images_obj
|
|
134
|
+
|
|
135
|
+
def to_document(self) -> DocumentPdf:
|
|
136
|
+
doc = DocumentPdf(self.library_pdf)
|
|
137
|
+
doc.add_pages(self.pages)
|
|
138
|
+
return doc
|
|
139
|
+
|
|
140
|
+
def inner_images(self) -> List[ImageObject]:
|
|
141
|
+
inner_images:List[ImageObject] = []
|
|
142
|
+
for p in self.pages:
|
|
143
|
+
inner_images.extend(
|
|
144
|
+
self.converPdfToImages.inner_images(p.to_bytes())
|
|
145
|
+
)
|
|
146
|
+
return inner_images
|
|
147
|
+
|
|
148
|
+
def inner_images_to_files(self, d:Directory, prefix:str='página-para-imagens') -> None:
|
|
149
|
+
"""
|
|
150
|
+
Salva todas as imagens presentes nas páginas em arquivos de imagem.
|
|
151
|
+
"""
|
|
152
|
+
outdir = d #.concat(f'{num+1}')
|
|
153
|
+
outdir.mkdir()
|
|
154
|
+
for num, page in enumerate(self.pages):
|
|
155
|
+
images = self.converPdfToImages.inner_images(page.to_bytes())
|
|
156
|
+
if len(images) < 1:
|
|
157
|
+
continue
|
|
158
|
+
for n, img in enumerate(images):
|
|
159
|
+
filename = f'{prefix}-{page.page_number}-img-{n+1}.png'
|
|
160
|
+
img.to_file(outdir.join_file(filename))
|
|
161
|
+
|
|
162
|
+
def set_paisagem(self):
|
|
163
|
+
for page in self.pages:
|
|
164
|
+
page.set_paisagem()
|
|
165
|
+
|
|
166
|
+
#==================================================================#
|
|
167
|
+
# Imagens
|
|
168
|
+
#==================================================================#
|
|
169
|
+
class ImageStream(object):
|
|
170
|
+
def __init__(self, *, library_image=LibraryImage.OPENCV, library_pdf=LibraryPDF.PILPDF):
|
|
171
|
+
self.__images:List[ImageObject] = []
|
|
172
|
+
self.num_images:int = len(self.__images)
|
|
173
|
+
self.library_image:LibraryImage = library_image
|
|
174
|
+
self.library_pdf:LibraryPDF = library_pdf
|
|
175
|
+
# Objeto para converter IMAGEM em pdf.
|
|
176
|
+
if library_pdf == LibraryPDF.FITZ:
|
|
177
|
+
self.convertImagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_fitz(library_image)
|
|
178
|
+
elif library_pdf == LibraryPDF.CANVAS:
|
|
179
|
+
self.convertImagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_canvas(library_image)
|
|
180
|
+
elif library_pdf == LibraryPDF.PILPDF:
|
|
181
|
+
self.convertImagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_pil(library_image)
|
|
182
|
+
|
|
183
|
+
# Objeto para converter PDF em imagem
|
|
184
|
+
self.convertPdfToImages:ConvertPdfToImage = ConvertPdfToImage(
|
|
185
|
+
library_pdf=LibraryPDF.FITZ, library_image=library_image, dpi=200,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
@property
|
|
189
|
+
def images(self) -> List[ImageObject]:
|
|
190
|
+
return self.__images
|
|
191
|
+
|
|
192
|
+
@images.setter
|
|
193
|
+
def images(self, imgs:List[ImageObject]) -> None:
|
|
194
|
+
if not isinstance(imgs, list):
|
|
195
|
+
print(f'Erro: Use: list() não {type(imgs)}')
|
|
196
|
+
return
|
|
197
|
+
self.num_images = 0
|
|
198
|
+
for img in imgs:
|
|
199
|
+
self.add_image(img)
|
|
200
|
+
|
|
201
|
+
def add_image(self, img:ImageObject) -> None:
|
|
202
|
+
if not isinstance(img, ImageObject):
|
|
203
|
+
return
|
|
204
|
+
print(f'{__class__.__name__} Adicionando imagem {self.num_images+1}')
|
|
205
|
+
self.__images.append(img)
|
|
206
|
+
self.num_images += 1
|
|
207
|
+
|
|
208
|
+
def add_images(self, images:List[ImageObject]):
|
|
209
|
+
for i in images:
|
|
210
|
+
self.add_image(i)
|
|
211
|
+
|
|
212
|
+
def add_file_image(self, f:File):
|
|
213
|
+
img = ImageObject.create_from_file(f, library=self.library_image)
|
|
214
|
+
self.add_image(img)
|
|
215
|
+
|
|
216
|
+
def add_files_image(self, files:List[File]):
|
|
217
|
+
for f in files:
|
|
218
|
+
self.add_file_image(f)
|
|
219
|
+
|
|
220
|
+
def is_null(self) -> bool:
|
|
221
|
+
if self.num_images < 1:
|
|
222
|
+
return True
|
|
223
|
+
return False
|
|
224
|
+
|
|
225
|
+
def clear(self):
|
|
226
|
+
self.__images.clear()
|
|
227
|
+
self.num_images = 0
|
|
228
|
+
|
|
229
|
+
def to_files_image(self, d:Directory, prefix:str='imagem'):
|
|
230
|
+
d.mkdir()
|
|
231
|
+
for num, image in enumerate(self.images):
|
|
232
|
+
filename = f'{prefix}-{num+1}.png'
|
|
233
|
+
print(f'Exportando imagem: {num+1} de {self.num_images} [{filename}]')
|
|
234
|
+
image.to_file(d.join_file(filename))
|
|
235
|
+
|
|
236
|
+
def to_pages_pdf(self) -> List[PageDocumentPdf]:
|
|
237
|
+
if self.is_null():
|
|
238
|
+
print(f'{__class__.__name__} Adicione imagens para prosseguir!')
|
|
239
|
+
return []
|
|
240
|
+
new_pages = []
|
|
241
|
+
for image in self.images:
|
|
242
|
+
new_pages.append(self.convertImagesToPdf.from_image(image))
|
|
243
|
+
return new_pages
|
|
244
|
+
|
|
245
|
+
def set_paisagem(self):
|
|
246
|
+
for num, img in enumerate(self.images):
|
|
247
|
+
self.images[num].set_paisagem()
|
|
248
|
+
|
|
249
|
+
def set_gaussian_blur(self):
|
|
250
|
+
for num, img in enumerate(self.images):
|
|
251
|
+
print(f'Removendo ruido de imagem: [{num+1} de {self.num_images}]')
|
|
252
|
+
self.images[num].set_gaussian()
|
|
253
|
+
|
|
254
|
+
def set_backgroud_black(self):
|
|
255
|
+
for num, img in enumerate(self.images):
|
|
256
|
+
print(f'Escurecendo imagem: [{num+1} de {self.num_images}]')
|
|
257
|
+
self.images[num].set_background_black()
|
|
258
|
+
|
|
259
|
+
def set_background_gray(self):
|
|
260
|
+
for num, img in enumerate(self.images):
|
|
261
|
+
print(f'Escurecendo imagem: [{num+1} de {self.num_images}]')
|
|
262
|
+
self.images[num].set_background_gray()
|
|
263
|
+
|
|
264
|
+
def set_optimize(self):
|
|
265
|
+
for num, img in enumerate(self.images):
|
|
266
|
+
print(f'Otimizando imagem: [{num+1} de {self.num_images}]')
|
|
267
|
+
self.images[num].set_optimize()
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def get_data_from_pdfs(*, files_pdf:List[File]) -> pandas.DataFrame:
|
|
271
|
+
"""
|
|
272
|
+
Recebe uma lista de arquivos PDF e retorna um DataFrame com os dados das cartas.
|
|
273
|
+
"""
|
|
274
|
+
if not isinstance(files_pdf, list):
|
|
275
|
+
raise ValueError(f'Erro: Use: list() não {type(files_pdf)}')
|
|
276
|
+
|
|
277
|
+
data:List[pandas.DataFrame] = []
|
|
278
|
+
values:List[str] = []
|
|
279
|
+
doc = DocumentPdf()
|
|
280
|
+
for file in files_pdf:
|
|
281
|
+
doc.add_file_pdf(file)
|
|
282
|
+
for page in doc.pages:
|
|
283
|
+
text = page.to_string()
|
|
284
|
+
if (text is not None) and (text != ''):
|
|
285
|
+
values.extend(text.split('\n'))
|
|
286
|
+
data.append(
|
|
287
|
+
pandas.DataFrame(
|
|
288
|
+
{
|
|
289
|
+
'TEXT': values,
|
|
290
|
+
'ARQUIVO': [file.absolute()] * len(values)
|
|
291
|
+
}
|
|
292
|
+
)
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
values.clear()
|
|
296
|
+
doc.clear()
|
|
297
|
+
if len(data) < 1:
|
|
298
|
+
return pandas.DataFrame()
|
|
299
|
+
return pandas.concat(data).astype('str')
|
|
300
|
+
|