convert-stream 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.

Files changed (29) hide show
  1. {convert_stream-1.1 → convert_stream-1.2}/PKG-INFO +1 -1
  2. convert_stream-1.2/convert_stream/__init__.py +23 -0
  3. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/__main__.py +8 -3
  4. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/_version.py +2 -2
  5. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/convert.py +40 -26
  6. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/imagelib.py +1 -1
  7. convert_stream-1.2/convert_stream/models/__init__.py +13 -0
  8. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/models/m_text.py +103 -111
  9. convert_stream-1.1/convert_stream/models/m_imgelib.py → convert_stream-1.2/convert_stream/models/models_image.py +1 -2
  10. convert_stream-1.2/convert_stream/models/models_pdf.py +366 -0
  11. convert_stream-1.2/convert_stream/models/progress_bar.py +156 -0
  12. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/pdf_convert.py +41 -29
  13. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/pdf_document.py +122 -71
  14. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/pdf_page.py +96 -55
  15. {convert_stream-1.1 → convert_stream-1.2}/convert_stream/text.py +2 -2
  16. {convert_stream-1.1 → convert_stream-1.2}/convert_stream.egg-info/PKG-INFO +1 -1
  17. {convert_stream-1.1 → convert_stream-1.2}/convert_stream.egg-info/SOURCES.txt +4 -6
  18. {convert_stream-1.1 → convert_stream-1.2}/pyproject.toml +1 -1
  19. convert_stream-1.1/convert_stream/__init__.py +0 -19
  20. convert_stream-1.1/convert_stream/library.py +0 -5
  21. convert_stream-1.1/convert_stream/models/__init__.py +0 -10
  22. convert_stream-1.1/convert_stream/models/m_pdf_convert.py +0 -171
  23. convert_stream-1.1/convert_stream/models/m_pdf_document.py +0 -139
  24. convert_stream-1.1/convert_stream/models/m_pdf_page.py +0 -88
  25. {convert_stream-1.1 → convert_stream-1.2}/README.md +0 -0
  26. {convert_stream-1.1 → convert_stream-1.2}/convert_stream.egg-info/dependency_links.txt +0 -0
  27. {convert_stream-1.1 → convert_stream-1.2}/convert_stream.egg-info/requires.txt +0 -0
  28. {convert_stream-1.1 → convert_stream-1.2}/convert_stream.egg-info/top_level.txt +0 -0
  29. {convert_stream-1.1 → convert_stream-1.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: convert_stream
3
- Version: 1.1
3
+ Version: 1.2
4
4
  Summary: Manipulação de documentos PDF e Imagens. Converter, Ler, rotacionar exportar etc.
5
5
  Author: Bruno Chaves
6
6
  Requires-Python: >=3.11
@@ -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 convertlib import version, __module_name__, __modify_date__, print_title
19
+ from convert_stream import (
20
+ version, __module_name__, __modify_date__, print_title
21
+ )
22
+
20
23
 
21
24
  def test():
22
- pass
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()
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
- __version__ = '1.1'
3
+ __version__ = '1.2'
4
4
  __author__ = 'Bruno Chaves'
5
5
  __license__ = 'MIT'
6
6
  __module_name__ = 'pdflib'
7
- __modify_date__ = '2025-04-22'
7
+ __modify_date__ = '2025-05-28'
@@ -4,27 +4,35 @@ from __future__ import annotations
4
4
  from typing import List
5
5
  import pandas
6
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
7
+ from convert_stream.models import ABCDocumentStream, LibraryImage, LibraryPDF
8
+ from convert_stream.imagelib import ImageObject
9
+ from convert_stream.models.progress_bar import ProgressBarAdapter, ProgressBarSimple
10
+ from convert_stream.pdf_page import PageDocumentPdf
11
+ from convert_stream.pdf_document import DocumentPdf
12
+ from convert_stream.pdf_convert import ConvertPdfToImage, ImageConvertPdf
12
13
  from soup_files import File, Directory
13
14
 
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
- 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)
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
- for p in pages:
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.converPdfToImages.from_page_pdf(page)
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.converPdfToImages.from_page_pdf(page))
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.converPdfToImages.inner_images(p.to_bytes())
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.converPdfToImages.inner_images(page.to_bytes())
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 convertlib.models.m_imgelib import LibraryImage, ABCImageObject, ABCInvertColor
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
- class ConvertDate(object):
54
+
55
+ class ConvertStringDate(object):
86
56
  def __init__(self):
87
57
  """
88
- Converter vários formatos de datas.
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.meses_para_ingles = {
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, d:str) -> bool:
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(d, fmt)
122
+ datetime.strptime(date_str, fmt)
148
123
  return True
149
124
  except:
150
125
  pass
151
126
 
152
- if ',' in d:
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
- d = self._long_date_ptbr_to_eng(d)
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.meses_para_ingles.items():
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 convert_string_date_ptbr(self, data_str_ptbr:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
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, date:str, *, fmt:LibraryDates=LibraryDates.DMY) -> str | None:
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(date):
202
+ if not self.is_valid_date(date_str):
217
203
  return None
218
- if ',' in date:
219
- date = self._long_date_ptbr_to_eng(date)
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(date, current_format)
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 self.convert_string_date_ptbr(date, fmt=fmt)
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