convert-stream 1.1.1__tar.gz → 1.2__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.
Potentially problematic release.
This version of convert-stream might be problematic. Click here for more details.
- {convert_stream-1.1.1 → convert_stream-1.2}/PKG-INFO +1 -1
- convert_stream-1.2/convert_stream/__init__.py +23 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/__main__.py +8 -3
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/_version.py +2 -2
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/convert.py +35 -21
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/imagelib.py +1 -1
- convert_stream-1.2/convert_stream/models/__init__.py +13 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/models/m_text.py +103 -111
- convert_stream-1.1.1/convert_stream/models/m_imgelib.py → convert_stream-1.2/convert_stream/models/models_image.py +1 -2
- convert_stream-1.2/convert_stream/models/models_pdf.py +366 -0
- convert_stream-1.2/convert_stream/models/progress_bar.py +156 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/pdf_convert.py +40 -28
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/pdf_document.py +122 -71
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/pdf_page.py +96 -55
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream/text.py +1 -1
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream.egg-info/PKG-INFO +1 -1
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream.egg-info/SOURCES.txt +4 -6
- {convert_stream-1.1.1 → convert_stream-1.2}/pyproject.toml +1 -1
- convert_stream-1.1.1/convert_stream/__init__.py +0 -19
- convert_stream-1.1.1/convert_stream/library.py +0 -5
- convert_stream-1.1.1/convert_stream/models/__init__.py +0 -10
- convert_stream-1.1.1/convert_stream/models/m_pdf_convert.py +0 -171
- convert_stream-1.1.1/convert_stream/models/m_pdf_document.py +0 -139
- convert_stream-1.1.1/convert_stream/models/m_pdf_page.py +0 -88
- {convert_stream-1.1.1 → convert_stream-1.2}/README.md +0 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream.egg-info/dependency_links.txt +0 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream.egg-info/requires.txt +0 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/convert_stream.egg-info/top_level.txt +0 -0
- {convert_stream-1.1.1 → convert_stream-1.2}/setup.cfg +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#
|
|
3
|
+
from ._version import (
|
|
4
|
+
__version__, __module_name__,
|
|
5
|
+
__author__, __license__, __modify_date__
|
|
6
|
+
)
|
|
7
|
+
version = __version__
|
|
8
|
+
|
|
9
|
+
from .text import (
|
|
10
|
+
ArrayString, ConvertDate, DataString,
|
|
11
|
+
LibraryDates, print_title, print_line, save_data
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from .models.progress_bar import (
|
|
15
|
+
ProgressBarAdapter, ProgressBarSimple, ProgressBarTqdm, ABCProgressBar
|
|
16
|
+
)
|
|
17
|
+
from .models.models_pdf import LibraryPDF
|
|
18
|
+
from .imagelib import ImageObject, ImageInverColor, LibraryImage
|
|
19
|
+
from .pdf_page import PageDocumentPdf, PagePdfFitz, PagePyPdf2
|
|
20
|
+
from .pdf_document import DocumentPdf
|
|
21
|
+
from .pdf_convert import ConvertPdfToImage, ImageConvertPdf
|
|
22
|
+
from .convert import PdfStream, ImageStream, get_data_from_pdfs
|
|
23
|
+
|
|
@@ -16,11 +16,16 @@ this_file = os.path.abspath(os.path.relpath(__file__))
|
|
|
16
16
|
dir_of_project = os.path.dirname(this_file)
|
|
17
17
|
sys.path.insert(0, dir_of_project)
|
|
18
18
|
|
|
19
|
-
from convert_stream import
|
|
19
|
+
from convert_stream import (
|
|
20
|
+
version, __module_name__, __modify_date__, print_title
|
|
21
|
+
)
|
|
22
|
+
|
|
20
23
|
|
|
21
24
|
def test():
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
from convert_stream import PageDocumentPdf, PdfStream, DocumentPdf
|
|
26
|
+
from soup_files import File, Directory, UserFileSystem
|
|
27
|
+
|
|
28
|
+
|
|
24
29
|
def main():
|
|
25
30
|
print_title(f'{__module_name__} versão {version} - {__modify_date__}', char='-')
|
|
26
31
|
test()
|
|
@@ -6,6 +6,7 @@ import pandas
|
|
|
6
6
|
|
|
7
7
|
from convert_stream.models import ABCDocumentStream, LibraryImage, LibraryPDF
|
|
8
8
|
from convert_stream.imagelib import ImageObject
|
|
9
|
+
from convert_stream.models.progress_bar import ProgressBarAdapter, ProgressBarSimple
|
|
9
10
|
from convert_stream.pdf_page import PageDocumentPdf
|
|
10
11
|
from convert_stream.pdf_document import DocumentPdf
|
|
11
12
|
from convert_stream.pdf_convert import ConvertPdfToImage, ImageConvertPdf
|
|
@@ -14,17 +15,24 @@ from soup_files import File, Directory
|
|
|
14
15
|
#==================================================================#
|
|
15
16
|
# PDF
|
|
16
17
|
#==================================================================#
|
|
18
|
+
|
|
17
19
|
class PdfStream(ABCDocumentStream):
|
|
18
20
|
"""
|
|
19
21
|
Objeto para manipular a exportação de dados PDF
|
|
20
22
|
"""
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self, *,
|
|
26
|
+
library_pdf: LibraryPDF = LibraryPDF.FITZ,
|
|
27
|
+
library_image: LibraryImage = LibraryImage.OPENCV,
|
|
28
|
+
progress_bar: ProgressBarAdapter = ProgressBarAdapter(ProgressBarSimple())
|
|
29
|
+
):
|
|
30
|
+
super().__init__(library_pdf=library_pdf, library_image=library_image, progress_bar=progress_bar)
|
|
31
|
+
self.num_pages: int = 0
|
|
32
|
+
self.library_pdf: LibraryPDF = library_pdf
|
|
33
|
+
self.library_image: LibraryImage = library_image
|
|
34
|
+
self.document: DocumentPdf = DocumentPdf(self.library_pdf, progress_bar=progress_bar)
|
|
35
|
+
self.convertPdfToImages: ConvertPdfToImage = ConvertPdfToImage(library_image=library_image)
|
|
28
36
|
|
|
29
37
|
if self.library_pdf == LibraryPDF.CANVAS:
|
|
30
38
|
self.imagesToPdf:ImageConvertPdf = ImageConvertPdf.create_from_canvas(self.library_image)
|
|
@@ -64,23 +72,28 @@ class PdfStream(ABCDocumentStream):
|
|
|
64
72
|
return
|
|
65
73
|
self.document.add_page(p)
|
|
66
74
|
|
|
67
|
-
def add_pages(self, pages:List[PageDocumentPdf]):
|
|
75
|
+
def add_pages(self, pages: List[PageDocumentPdf]):
|
|
68
76
|
if not isinstance(pages, list):
|
|
69
77
|
print(f'{__class__.__name__} Erro: Use lista de PageDocumentPdf, não {type(pages)}')
|
|
70
78
|
return
|
|
71
|
-
|
|
79
|
+
max_num: int = len(pages)
|
|
80
|
+
for num, p in enumerate(pages):
|
|
81
|
+
self.progress_bar.update(
|
|
82
|
+
((num+1)/max_num) * 100,
|
|
83
|
+
f'Adicionando página: [{num+1} de {max_num}]'
|
|
84
|
+
)
|
|
72
85
|
self.add_page(p)
|
|
73
|
-
|
|
74
|
-
def add_page_pdf_bytes(self, bt:bytes):
|
|
86
|
+
|
|
87
|
+
def add_page_pdf_bytes(self, bt: bytes):
|
|
75
88
|
_page = PageDocumentPdf.create_from_page_bytes(bt, library=self.library_pdf)
|
|
76
89
|
self.add_page(_page)
|
|
77
90
|
|
|
78
|
-
def add_file_pdf(self, f:File):
|
|
79
|
-
doc:DocumentPdf = DocumentPdf(self.library_pdf)
|
|
91
|
+
def add_file_pdf(self, f: File):
|
|
92
|
+
doc: DocumentPdf = DocumentPdf(self.library_pdf)
|
|
80
93
|
doc.add_file_pdf(f)
|
|
81
94
|
self.add_pages(doc.pages)
|
|
82
95
|
|
|
83
|
-
def add_files_pdf(self, files:List[File]):
|
|
96
|
+
def add_files_pdf(self, files: List[File]):
|
|
84
97
|
for f in files:
|
|
85
98
|
self.add_file_pdf(f)
|
|
86
99
|
|
|
@@ -91,16 +104,16 @@ class PdfStream(ABCDocumentStream):
|
|
|
91
104
|
pg: PageDocumentPdf = self.imagesToPdf.from_image(image)
|
|
92
105
|
self.add_page(pg)
|
|
93
106
|
|
|
94
|
-
def to_file_pdf(self, f:File):
|
|
107
|
+
def to_file_pdf(self, f: File):
|
|
95
108
|
if self.is_null():
|
|
96
109
|
print(
|
|
97
110
|
f'{__class__.__name__} Nenhuma página foi adiconada, adicione páginas ao documento para prosseguir!'
|
|
98
111
|
)
|
|
99
|
-
docpdf:DocumentPdf = DocumentPdf(self.library_pdf)
|
|
112
|
+
docpdf: DocumentPdf = DocumentPdf(self.library_pdf, progress_bar=self.progress_bar)
|
|
100
113
|
docpdf.add_pages(self.pages)
|
|
101
114
|
docpdf.to_file_pdf(f)
|
|
102
115
|
|
|
103
|
-
def to_files_pdf(self, outdir:Directory, *, prefix='pag'):
|
|
116
|
+
def to_files_pdf(self, outdir: Directory, *, prefix='pag'):
|
|
104
117
|
if self.is_null():
|
|
105
118
|
print(
|
|
106
119
|
f'{__class__.__name__} Nenhuma página foi adiconada, adicione páginas ao documento para prosseguir!'
|
|
@@ -122,14 +135,14 @@ class PdfStream(ABCDocumentStream):
|
|
|
122
135
|
d.mkdir()
|
|
123
136
|
for num, page in enumerate(self.pages):
|
|
124
137
|
filename = f'{prefix}-{page.page_number}.png'
|
|
125
|
-
img = self.
|
|
138
|
+
img = self.convertPdfToImages.from_page_pdf(page)
|
|
126
139
|
print(f'Exportando página PDF para imagem: [{num+1} de {self.num_pages}] {filename}')
|
|
127
140
|
img.to_file(d.join_file(filename))
|
|
128
141
|
|
|
129
142
|
def to_images(self) -> List[ImageObject]:
|
|
130
143
|
images_obj:List[ImageObject] = []
|
|
131
144
|
for page in self.pages:
|
|
132
|
-
images_obj.append(self.
|
|
145
|
+
images_obj.append(self.convertPdfToImages.from_page_pdf(page))
|
|
133
146
|
return images_obj
|
|
134
147
|
|
|
135
148
|
def to_document(self) -> DocumentPdf:
|
|
@@ -141,7 +154,7 @@ class PdfStream(ABCDocumentStream):
|
|
|
141
154
|
inner_images:List[ImageObject] = []
|
|
142
155
|
for p in self.pages:
|
|
143
156
|
inner_images.extend(
|
|
144
|
-
self.
|
|
157
|
+
self.convertPdfToImages.inner_images(p.to_bytes())
|
|
145
158
|
)
|
|
146
159
|
return inner_images
|
|
147
160
|
|
|
@@ -152,7 +165,7 @@ class PdfStream(ABCDocumentStream):
|
|
|
152
165
|
outdir = d #.concat(f'{num+1}')
|
|
153
166
|
outdir.mkdir()
|
|
154
167
|
for num, page in enumerate(self.pages):
|
|
155
|
-
images = self.
|
|
168
|
+
images = self.convertPdfToImages.inner_images(page.to_bytes())
|
|
156
169
|
if len(images) < 1:
|
|
157
170
|
continue
|
|
158
171
|
for n, img in enumerate(images):
|
|
@@ -166,6 +179,7 @@ class PdfStream(ABCDocumentStream):
|
|
|
166
179
|
#==================================================================#
|
|
167
180
|
# Imagens
|
|
168
181
|
#==================================================================#
|
|
182
|
+
|
|
169
183
|
class ImageStream(object):
|
|
170
184
|
def __init__(self, *, library_image=LibraryImage.OPENCV, library_pdf=LibraryPDF.PILPDF):
|
|
171
185
|
self.__images:List[ImageObject] = []
|
|
@@ -9,7 +9,7 @@ import cv2
|
|
|
9
9
|
import numpy as np
|
|
10
10
|
|
|
11
11
|
from soup_files import File
|
|
12
|
-
from convert_stream.models.
|
|
12
|
+
from convert_stream.models.models_image import LibraryImage, ABCImageObject, ABCInvertColor
|
|
13
13
|
|
|
14
14
|
#=============================================================================#
|
|
15
15
|
# Inverter cores em imagens
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from .m_text import (
|
|
3
|
+
DataString, ConvertDate, ConvertStringDate,
|
|
4
|
+
ArrayString, LibraryDates,
|
|
5
|
+
print_line, print_title, save_data
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
from .models_image import LibraryImage, ABCImageObject, ABCInvertColor
|
|
9
|
+
from .models_pdf import (
|
|
10
|
+
LibraryPDF, ABCDocumentPdf, ABCPagePdf,
|
|
11
|
+
ABCConvertPdf, ABCImageConvertPdf, ABCDocumentStream,
|
|
12
|
+
)
|
|
13
|
+
|
|
@@ -34,7 +34,6 @@ def print_title(title:str, char:str='='):
|
|
|
34
34
|
print(title.center(num_size, char))
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
|
|
38
37
|
class LibraryDates(Enum):
|
|
39
38
|
D_M_Y = '%d-%m-%Y'
|
|
40
39
|
DMY = '%d/%m/%Y'
|
|
@@ -42,38 +41,8 @@ class LibraryDates(Enum):
|
|
|
42
41
|
d_m_y = '%d-%m-%y'
|
|
43
42
|
YMD = '%Y/%m/%d'
|
|
44
43
|
Y_M_D = '%Y-%m-%d'
|
|
44
|
+
|
|
45
45
|
|
|
46
|
-
def is_valid_date(d) -> bool:
|
|
47
|
-
valid_formats = (
|
|
48
|
-
'%d-%m-%Y', # Exemplo: 11-01-2025
|
|
49
|
-
'%d/%m/%y',
|
|
50
|
-
'%d-%m-%y',
|
|
51
|
-
'%Y/%m/%d', # Exemplo: 2025/01/11
|
|
52
|
-
'%d/%m/%Y', # Exemplo: 11/01/2025
|
|
53
|
-
'%Y-%m-%d', # Exemplo: 2025-01-11
|
|
54
|
-
'%d %B %Y', # Exemplo: 11 Janeiro 2025
|
|
55
|
-
'%b %d, %Y', # Exemplo: Jan 11, 2025
|
|
56
|
-
'%A, %d %B %Y', # Exemplo: Sábado, 11 Janeiro 2025
|
|
57
|
-
'%H:%M:%S', # Exemplo: 08:35:00
|
|
58
|
-
'%H:%M', # Exemplo: 08:35
|
|
59
|
-
'%I:%M %p', # Exemplo: 08:35 AM
|
|
60
|
-
'%Y-%m-%d %H:%M:%S', # Exemplo: 2025-01-11 08:35:00
|
|
61
|
-
'%Y-%m-%dT%H:%M:%S', # Exemplo: 2025-01-11T08:35:00 (Formato ISO 8601)
|
|
62
|
-
'%Y%m%dT%H%M%S', # Exemplo: 20250111T083500 (Formato compactado)
|
|
63
|
-
)
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
_valid = False
|
|
67
|
-
for fmt in valid_formats:
|
|
68
|
-
try:
|
|
69
|
-
datetime.strptime(d, fmt)
|
|
70
|
-
_valid = True
|
|
71
|
-
break
|
|
72
|
-
except ValueError:
|
|
73
|
-
pass
|
|
74
|
-
#
|
|
75
|
-
return _valid
|
|
76
|
-
|
|
77
46
|
def save_data(df:DataFrame, file:File):
|
|
78
47
|
try:
|
|
79
48
|
df.to_excel(file.absolute(), index=False)
|
|
@@ -82,10 +51,11 @@ def save_data(df:DataFrame, file:File):
|
|
|
82
51
|
else:
|
|
83
52
|
print('OK')
|
|
84
53
|
|
|
85
|
-
|
|
54
|
+
|
|
55
|
+
class ConvertStringDate(object):
|
|
86
56
|
def __init__(self):
|
|
87
57
|
"""
|
|
88
|
-
|
|
58
|
+
Converter vários formatos de datas.
|
|
89
59
|
"""
|
|
90
60
|
self.valid_formats = (
|
|
91
61
|
'%d-%m-%Y', # Exemplo: 11-01-2025
|
|
@@ -119,7 +89,7 @@ class ConvertDate(object):
|
|
|
119
89
|
)
|
|
120
90
|
#
|
|
121
91
|
# Dicionário de mapeamento de nomes de meses em português para inglês
|
|
122
|
-
self.
|
|
92
|
+
self.meses_ptbr_para_ingles = {
|
|
123
93
|
'Janeiro': 'January',
|
|
124
94
|
'Fevereiro': 'February',
|
|
125
95
|
'Março': 'March',
|
|
@@ -141,25 +111,43 @@ class ConvertDate(object):
|
|
|
141
111
|
"setembro": "09", "outubro": "10", "novembro": "11", "dezembro": "12"
|
|
142
112
|
}
|
|
143
113
|
|
|
144
|
-
def is_valid_date(self,
|
|
114
|
+
def is_valid_date(self, date_str:str) -> bool:
|
|
115
|
+
"""
|
|
116
|
+
Verificar se uma string é uma data válida
|
|
117
|
+
"""
|
|
118
|
+
# Tentar conversão com formatos tradicionais.
|
|
119
|
+
date_str = date_str.strip()
|
|
145
120
|
for fmt in self.valid_formats:
|
|
146
121
|
try:
|
|
147
|
-
datetime.strptime(
|
|
122
|
+
datetime.strptime(date_str, fmt)
|
|
148
123
|
return True
|
|
149
124
|
except:
|
|
150
125
|
pass
|
|
151
126
|
|
|
152
|
-
if ',' in
|
|
127
|
+
if ('de' in date_str) and (',' in date_str):
|
|
128
|
+
# Sexta-feira, 25 de abril de 2025
|
|
129
|
+
date_str = date_str.split(',')[1].strip()
|
|
130
|
+
date_str = date_str.replace(' ', '-').replace('de', '').replace('--', '-').strip()
|
|
131
|
+
|
|
132
|
+
if '-' in date_str:
|
|
133
|
+
for _key in self.meses_ptbr_para_numeros.keys():
|
|
134
|
+
if _key in date_str:
|
|
135
|
+
new = self._long_date_ptbr_format(date_str)
|
|
136
|
+
if new is not None:
|
|
137
|
+
return True
|
|
138
|
+
|
|
139
|
+
if self._long_date_ptbr_format(date_str) is not None:
|
|
140
|
+
return True
|
|
141
|
+
if self.is_timestamp(date_str):
|
|
142
|
+
return True
|
|
143
|
+
if ',' in date_str:
|
|
153
144
|
try:
|
|
154
|
-
|
|
145
|
+
# Sábado, 11 Janeiro 2025
|
|
146
|
+
date_str = self._long_date_ptbr_to_eng(date_str)
|
|
155
147
|
except:
|
|
156
148
|
pass
|
|
157
149
|
else:
|
|
158
150
|
return True
|
|
159
|
-
if self.is_timestamp(d):
|
|
160
|
-
return True
|
|
161
|
-
if self.convert_string_date_ptbr(d) is not None:
|
|
162
|
-
return True
|
|
163
151
|
return False
|
|
164
152
|
|
|
165
153
|
def is_timestamp(self, d:object) -> bool:
|
|
@@ -177,9 +165,7 @@ class ConvertDate(object):
|
|
|
177
165
|
return False
|
|
178
166
|
|
|
179
167
|
def _long_date_ptbr_to_eng(self, data_string:str, fmt:str='%A, %d %B %Y') -> str:
|
|
180
|
-
|
|
181
|
-
# Exemplo de data em string com o dia da semana em português
|
|
182
|
-
data_string = 'Sábado, 11 Janeiro 2025'
|
|
168
|
+
# Exemplo de data em string com o dia da semana em português => 'Sábado, 11 Janeiro 2025'
|
|
183
169
|
|
|
184
170
|
# Remover o dia da semana da string
|
|
185
171
|
new_string_date = data_string.split(", ")[1]
|
|
@@ -188,7 +174,7 @@ class ConvertDate(object):
|
|
|
188
174
|
current_data_fmt = '%d %B %Y'
|
|
189
175
|
|
|
190
176
|
# Substituir o nome do mês em português pelo nome em inglês
|
|
191
|
-
for pt_mes, en_mes in self.
|
|
177
|
+
for pt_mes, en_mes in self.meses_ptbr_para_ingles.items():
|
|
192
178
|
new_string_date = new_string_date.replace(pt_mes, en_mes)
|
|
193
179
|
|
|
194
180
|
# Converter a string para um objeto datetime
|
|
@@ -197,7 +183,7 @@ class ConvertDate(object):
|
|
|
197
183
|
# Formatando o objeto datetime para o formato desejado "dia/mês/ANO"
|
|
198
184
|
return to_datetime.strftime(fmt)
|
|
199
185
|
|
|
200
|
-
def
|
|
186
|
+
def _long_date_ptbr_format(self, data_str_ptbr:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
|
|
201
187
|
# Divide a string e substitui o mês pelo número correspondente
|
|
202
188
|
try:
|
|
203
189
|
dia, mes, ano = data_str_ptbr.split("-")
|
|
@@ -209,23 +195,39 @@ class ConvertDate(object):
|
|
|
209
195
|
print(e)
|
|
210
196
|
return None
|
|
211
197
|
|
|
212
|
-
def convert_date(self,
|
|
198
|
+
def convert_date(self, date_str:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
|
|
213
199
|
"""
|
|
214
200
|
Converter uma data em string para um formato qualquer.
|
|
215
201
|
"""
|
|
216
|
-
if not self.is_valid_date(
|
|
202
|
+
if not self.is_valid_date(date_str):
|
|
217
203
|
return None
|
|
218
|
-
|
|
219
|
-
|
|
204
|
+
|
|
205
|
+
if ('de' in date_str) and (',' in date_str):
|
|
206
|
+
# Sexta-feira, 25 de abril de 2025
|
|
207
|
+
date_str = date_str.split(',')[1].strip()
|
|
208
|
+
date_str = date_str.replace(' ', '-').replace('de', '').replace('--', '-').strip()
|
|
209
|
+
new = self._long_date_ptbr_format(date_str, fmt=fmt)
|
|
210
|
+
if new is not None:
|
|
211
|
+
return new
|
|
212
|
+
|
|
213
|
+
if '-' in date_str:
|
|
214
|
+
for _key in self.meses_ptbr_para_numeros.keys():
|
|
215
|
+
if _key in date_str:
|
|
216
|
+
new = self._long_date_ptbr_format(date_str)
|
|
217
|
+
if new is not None:
|
|
218
|
+
return new
|
|
219
|
+
|
|
220
|
+
if ',' in date_str:
|
|
221
|
+
date_str = self._long_date_ptbr_to_eng(date_str)
|
|
220
222
|
|
|
221
223
|
for current_format in self.valid_formats:
|
|
222
224
|
try:
|
|
223
|
-
date_obj = datetime.strptime(
|
|
225
|
+
date_obj = datetime.strptime(date_str, current_format)
|
|
224
226
|
except:
|
|
225
227
|
pass
|
|
226
228
|
else:
|
|
227
229
|
return date_obj.strftime('{}'.format(fmt.value))
|
|
228
|
-
return
|
|
230
|
+
return None
|
|
229
231
|
|
|
230
232
|
def convert_timestamp(self, ts:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
|
|
231
233
|
"""
|
|
@@ -244,6 +246,52 @@ class ConvertDate(object):
|
|
|
244
246
|
return None
|
|
245
247
|
|
|
246
248
|
|
|
249
|
+
|
|
250
|
+
class ConvertDate(object):
|
|
251
|
+
def __init__(self):
|
|
252
|
+
"""
|
|
253
|
+
Converter vários formatos de datas.
|
|
254
|
+
"""
|
|
255
|
+
print(
|
|
256
|
+
f'''
|
|
257
|
+
[!] INFO: Em versões futuras a classe {__class__.__name__} será excluída, para formatar data Use
|
|
258
|
+
a classe ConvertStringDate()
|
|
259
|
+
'''
|
|
260
|
+
)
|
|
261
|
+
self.convert: ConvertStringDate = ConvertStringDate()
|
|
262
|
+
self.valid_formats = self.convert.valid_formats
|
|
263
|
+
self.valid_timestamp = self.convert.valid_timestamp
|
|
264
|
+
self.meses_para_ingles = self.convert.meses_ptbr_para_ingles
|
|
265
|
+
self.meses_ptbr_para_numeros = self.convert.meses_ptbr_para_numeros
|
|
266
|
+
|
|
267
|
+
def is_valid_date(self, d:str) -> bool:
|
|
268
|
+
return self.convert.is_valid_date(d)
|
|
269
|
+
|
|
270
|
+
def is_timestamp(self, d:object) -> bool:
|
|
271
|
+
"""
|
|
272
|
+
Verifica se o objeto atual é timestamp
|
|
273
|
+
"""
|
|
274
|
+
return self.convert.is_timestamp(d)
|
|
275
|
+
|
|
276
|
+
def _long_date_ptbr_to_eng(self, data_string:str, fmt:str='%A, %d %B %Y') -> str:
|
|
277
|
+
return self.convert._long_date_ptbr_to_eng(data_string, fmt)
|
|
278
|
+
|
|
279
|
+
def convert_string_date_ptbr(self, data_str_ptbr:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
|
|
280
|
+
return self.convert.convert_date(data_str_ptbr, fmt=fmt)
|
|
281
|
+
|
|
282
|
+
def convert_date(self, date:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
|
|
283
|
+
"""
|
|
284
|
+
Converter uma data em string para um formato qualquer.
|
|
285
|
+
"""
|
|
286
|
+
return self.convert.convert_date(date, fmt=fmt)
|
|
287
|
+
|
|
288
|
+
def convert_timestamp(self, ts:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
|
|
289
|
+
"""
|
|
290
|
+
Converter uma data em string para um formato qualquer.
|
|
291
|
+
"""
|
|
292
|
+
return self.convert.convert_timestamp(ts, fmt=fmt)
|
|
293
|
+
|
|
294
|
+
|
|
247
295
|
|
|
248
296
|
class DataString(object):
|
|
249
297
|
def __init__(self, value:str):
|
|
@@ -421,60 +469,4 @@ class ArrayString(object):
|
|
|
421
469
|
except:
|
|
422
470
|
return None
|
|
423
471
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
# Tabela de arquivo/texto
|
|
427
|
-
class TableText(object):
|
|
428
|
-
def __init__(self, values:str, *, separator:str='\n', column_text:str='TEXT', file:File=None):
|
|
429
|
-
self.values:str = values
|
|
430
|
-
self.separator:str = separator
|
|
431
|
-
self.column_text:str = column_text
|
|
432
|
-
self.file:File = file
|
|
433
|
-
|
|
434
|
-
def get_len(self) -> int:
|
|
435
|
-
return len(self.to_list())
|
|
436
|
-
|
|
437
|
-
def is_null(self) -> bool:
|
|
438
|
-
if (self.values == None) or (self.values == ''):
|
|
439
|
-
return True
|
|
440
|
-
return False
|
|
441
|
-
|
|
442
|
-
def to_upper(self) -> None:
|
|
443
|
-
self.values = self.values.upper()
|
|
444
|
-
|
|
445
|
-
def to_list(self) -> List[str]:
|
|
446
|
-
try:
|
|
447
|
-
return self.values.split(self.separator)
|
|
448
|
-
except Exception as e:
|
|
449
|
-
print(e)
|
|
450
|
-
return []
|
|
451
|
-
|
|
452
|
-
def to_dict(self) -> Dict[str, List[str]]:
|
|
453
|
-
lines = self.to_list()
|
|
454
|
-
if len(lines) < 1:
|
|
455
|
-
return {}
|
|
456
|
-
tb:Dict[str, List[str]] = {}
|
|
457
|
-
tb[self.column_text] = []
|
|
458
|
-
tb['NUM_LINHA'] = []
|
|
459
|
-
for num, item in enumerate(lines):
|
|
460
|
-
tb['NUM_LINHA'].append(num+1)
|
|
461
|
-
tb[self.column_text].append(item)
|
|
462
|
-
|
|
463
|
-
max_num:int = len(lines)
|
|
464
|
-
if self.file is not None:
|
|
465
|
-
tb['NOME_ARQUIVO'] = [self.file.basename()] * max_num
|
|
466
|
-
tb['MD5'] = [self.file.md5()] * max_num
|
|
467
|
-
tb['EXTENSÃO'] = [self.file.extension()] * max_num
|
|
468
|
-
tb['ARQUIVO'] = [self.file.absolute()] * max_num
|
|
469
|
-
tb['PASTA'] = [self.file.dirname()] * max_num
|
|
470
|
-
return tb
|
|
471
|
-
|
|
472
|
-
def to_data(self) -> DataFrame:
|
|
473
|
-
if self.is_null():
|
|
474
|
-
return DataFrame()
|
|
475
|
-
return DataFrame(self.to_dict())
|
|
476
|
-
|
|
477
|
-
def to_excel(self, file:File):
|
|
478
|
-
if file.extension() != '.xlsx':
|
|
479
|
-
raise ValueError(f'{__class__.__name__} o arquivo precisa de do tipo .xlsx')
|
|
480
|
-
self.to_data().to_excel(file.absolute(), index=False)
|
|
472
|
+
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
#
|
|
3
|
-
|
|
4
3
|
from __future__ import annotations
|
|
5
4
|
from abc import ABC, abstractmethod
|
|
6
5
|
from enum import Enum
|
|
7
|
-
from typing import List, Tuple
|
|
8
6
|
from PIL import Image
|
|
9
7
|
from cv2.typing import MatLike
|
|
10
8
|
import cv2
|
|
11
9
|
from soup_files import File
|
|
12
10
|
|
|
11
|
+
|
|
13
12
|
class LibraryImage(Enum):
|
|
14
13
|
PIL = 1
|
|
15
14
|
OPENCV = 2
|