ocr-stream 2.4__tar.gz → 2.4.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ocr_stream
3
- Version: 2.4
3
+ Version: 2.4.2
4
4
  Summary: Extrair textos de documentos digitalizados e imagens.
5
5
  Author: Bruno Chaves
6
6
  Requires-Python: >=3.11
@@ -12,7 +12,7 @@ Requires-Dist: pandas
12
12
  Requires-Dist: requests>=2.32.4
13
13
  Requires-Dist: opencv-python
14
14
  Requires-Dist: pytesseract
15
- Requires-Dist: convert_stream>=2.4
15
+ Requires-Dist: convert_stream>=2.4.3
16
16
  Requires-Dist: soup_files>=1.4
17
17
 
18
18
  # ocrlib
@@ -1,53 +1,23 @@
1
1
  #!/usr/bin/env python3
2
2
  from __future__ import annotations
3
3
  from io import BytesIO
4
- import threading
5
4
  from ocr_stream.modules import *
6
5
  from ocr_stream.bin_tess import BinTesseract, get_path_tesseract_sys
7
6
  from ocr_stream.ocr import TesseractOcr, TextRecognized
8
7
  from ocr_stream.recognize import RecognizeImage, RecognizePdf
9
- from convert_stream import DocumentPdf, PageDocumentPdf
10
- from convert_stream.image import ImageObject, CollectionImages
11
- from convert_stream.mod_types import (
12
- ColumnsTable, ColumnBody, HeadCell, HeadValues, DictTextTable
13
- )
14
-
15
- from convert_stream.text import FindText
16
- from convert_stream.pdf import ConvertPdfToImages, CollectionPagePdf
8
+ from convert_stream import DocumentPdf
9
+ from convert_stream.image import ImageObject
10
+ from sheet_stream.type_utils import HeadValues, HeadCell
11
+ from sheet_stream import TableRow, TableDocuments, TableTextKeyWord, VoidAdapter, ColumnsTable
12
+ from convert_stream.mod_types import DictTextTable
13
+ from convert_stream.text import FindText, FindStrings
17
14
  import pandas as pd
18
15
  from soup_files import (
19
- JsonConvert, ProgressBarAdapter, ABCProgressBar, CreatePbar, Directory, File, InputFiles, LibraryDocs,
20
- ProgressBarSimple
16
+ JsonConvert, ProgressBarAdapter, ABCProgressBar, CreatePbar,
17
+ Directory, File, InputFiles, LibraryDocs
21
18
  )
22
19
 
23
20
 
24
- class VoidPbar(ABCProgressBar):
25
-
26
- def __init__(self):
27
- super().__init__()
28
-
29
- def set_percent(self, percent: float):
30
- pass
31
-
32
- def set_text(self, text: str):
33
- pass
34
-
35
-
36
- class ProgressVoid(ProgressBarAdapter):
37
-
38
- def __init__(self, progress_bar: ABCProgressBar = VoidPbar()):
39
- super().__init__(progress_bar)
40
-
41
- def update(self, percent: float, status: str = "-"):
42
- pass
43
-
44
- def update_percent(self, percent: float = 0):
45
- pass
46
-
47
- def update_text(self, text: str = "-"):
48
- pass
49
-
50
-
51
21
  def read_image(img: ImageObject, rec: RecognizeImage = RecognizeImage()) -> TextRecognized:
52
22
  _txt = rec.image_recognize(img)
53
23
  _txt.metadata = img.metadata
@@ -67,43 +37,22 @@ def read_images(
67
37
  for idx, image in enumerate(images):
68
38
  pbar.update(
69
39
  ((idx + 1) / max_num) * 100,
70
- f'[OCR] {idx + 1} / {max_num}',
40
+ f'[OCR Imagem] {idx + 1} / {max_num}',
71
41
  )
72
42
  out = read_image(image, rec=rec).to_page_pdf()
73
43
  pages.append(out)
74
44
  tmp_doc = DocumentPdf.create_from_pages(pages)
75
- print()
76
45
  pbar.stop()
77
46
  return tmp_doc
78
47
 
79
48
 
80
49
  def read_document(
81
50
  document: DocumentPdf, *,
82
- dpi: int = 300,
83
- pbar: ProgressBarAdapter = CreatePbar().get()
51
+ dpi: int = 200,
52
+ rec: RecognizePdf = RecognizePdf(),
84
53
  ) -> DocumentPdf:
85
- pbar.start()
86
- print()
87
- _metadata = document.metadata
88
- recognized_items: list[TextRecognized] = []
89
- pages_pdf: list[PageDocumentPdf] = document.to_pages()
90
- total = len(pages_pdf)
91
- void_pbar = ProgressVoid()
92
- for num, page in enumerate(pages_pdf):
93
- pbar.update(
94
- ((num + 1) / total) * 100,
95
- f'[OCR PDF] {num + 1}/{total} {page.metadata.name}',
96
- )
97
- convert: ConvertPdfToImages = ConvertPdfToImages(DocumentPdf.create_from_pages([page]))
98
- convert.set_pbar(void_pbar)
99
- images: list[ImageObject] = convert.to_images(dpi=dpi)
100
- for im in images:
101
- recognized_items.append(read_image(im))
102
- print()
103
- final_pages: list[PageDocumentPdf] = [x.to_page_pdf() for x in recognized_items]
104
- final_doc: DocumentPdf = DocumentPdf.create_from_pages(final_pages)
105
- final_doc.metadata = _metadata
106
- return final_doc
54
+ rec.pbar.start()
55
+ return rec.recognize_document(document, dpi=dpi)
107
56
 
108
57
 
109
58
  class SearchableTextImage(object):
@@ -286,14 +235,14 @@ class ImageFinder(object):
286
235
  print(f'{__class__.__name__} {err}')
287
236
  else:
288
237
  new_line: dict[str, str] = {
289
- ColumnsTable.KEY.value: f'{idx}',
290
- ColumnsTable.NUM_PAGE.value: 'nan',
291
- ColumnsTable.NUM_LINE.value: f'{idx + 1}',
292
- ColumnsTable.TEXT.value: math_text,
293
- ColumnsTable.FILE_NAME.value: current_img.metadata.file_path,
294
- ColumnsTable.FILETYPE.value: current_img.metadata.extension,
295
- ColumnsTable.FILE_PATH.value: current_img.metadata.dir_path,
296
- ColumnsTable.DIR.value: current_img.metadata.dir_path,
238
+ ColumnsTable.KEY: f'{idx}',
239
+ ColumnsTable.NUM_PAGE: 'nan',
240
+ ColumnsTable.NUM_LINE: f'{idx + 1}',
241
+ ColumnsTable.TEXT: math_text,
242
+ ColumnsTable.FILE_NAME: current_img.metadata.file_path,
243
+ ColumnsTable.FILETYPE: current_img.metadata.extension,
244
+ ColumnsTable.FILE_PATH: current_img.metadata.dir_path,
245
+ ColumnsTable.DIR: current_img.metadata.dir_path,
297
246
  }
298
247
  _searchable.add_line(new_line)
299
248
  return _searchable
@@ -337,14 +286,14 @@ class ImageFinder(object):
337
286
  print(f'{__class__.__name__} {err}')
338
287
  else:
339
288
  new_line: dict[str, str] = {
340
- ColumnsTable.KEY.value: f'{idx}',
341
- ColumnsTable.NUM_PAGE.value: 'nan',
342
- ColumnsTable.NUM_LINE.value: f'{idx + 1}',
343
- ColumnsTable.TEXT.value: math_text,
344
- ColumnsTable.FILE_NAME.value: current_img.metadata.file_path,
345
- ColumnsTable.FILETYPE.value: current_img.metadata.extension,
346
- ColumnsTable.FILE_PATH.value: current_img.metadata.dir_path,
347
- ColumnsTable.DIR.value: current_img.metadata.dir_path,
289
+ ColumnsTable.KEY: f'{idx}',
290
+ ColumnsTable.NUM_PAGE: 'nan',
291
+ ColumnsTable.NUM_LINE: f'{idx + 1}',
292
+ ColumnsTable.TEXT: math_text,
293
+ ColumnsTable.FILE_NAME: current_img.metadata.file_path,
294
+ ColumnsTable.FILETYPE: current_img.metadata.extension,
295
+ ColumnsTable.FILE_PATH: current_img.metadata.dir_path,
296
+ ColumnsTable.DIR: current_img.metadata.dir_path,
348
297
  }
349
298
  _searchable.add_line(new_line)
350
299
  return _searchable
@@ -352,5 +301,5 @@ class ImageFinder(object):
352
301
 
353
302
  __all__ = [
354
303
  'ImageFinder', 'SearchableTextImage', 'read_images',
355
- 'read_document', 'RecognizeImage', 'RecognizePdf'
304
+ 'read_document', 'RecognizeImage', 'RecognizePdf', 'LibOcr',
356
305
  ]
@@ -4,19 +4,24 @@ from __future__ import annotations
4
4
  import os.path
5
5
  from abc import abstractmethod, ABC
6
6
  from typing import Union
7
- from io import BytesIO
8
7
  from pandas import DataFrame
9
8
  from soup_files import File
10
- from convert_stream import DocumentPdf, PageDocumentPdf
9
+ from convert_stream import DocumentPdf, PageDocumentPdf, DictTextTable
11
10
  from convert_stream.mod_types.modules import DEFAULT_LIB_IMAGE, LibImage
12
11
  from convert_stream.image import ImageObject
13
- from convert_stream.mod_types import MetaDataItem, MetaDataFile
14
- from convert_stream.mod_types.table_types import ColumnBody
12
+ from sheet_stream.type_utils import MetaDataFile
15
13
  from ocr_stream.modules import (
16
- LibOcr, DEFAULT_LIB_OCR, pytesseract, Output, pyocr, easyocr
14
+ LibOcr, DEFAULT_LIB_OCR, pytesseract, pyocr, easyocr
17
15
  )
18
16
  from ocr_stream.bin_tess import BinTesseract
19
17
 
18
+ import cv2
19
+ from PIL import Image
20
+ from io import BytesIO
21
+ from reportlab.pdfgen import canvas
22
+ #from reportlab.lib.pagesizes import A4
23
+ from reportlab.lib.utils import ImageReader
24
+
20
25
 
21
26
  class TextRecognized(object):
22
27
  """
@@ -27,6 +32,7 @@ class TextRecognized(object):
27
32
  def __init__(self, bytes_recognized: bytes):
28
33
  self.metadata: MetaDataFile = MetaDataFile()
29
34
  self.bytes_recognized: bytes = bytes_recognized
35
+ self.__text_document: str | None = None
30
36
 
31
37
  self.list_bad_char: list[str] = [
32
38
  ':', ',', ';', '$', '=',
@@ -38,8 +44,28 @@ class TextRecognized(object):
38
44
  '%', '~', '¥', '♀',
39
45
  ]
40
46
 
47
+ @property
48
+ def is_empty(self) -> bool:
49
+ txt = self.to_string()
50
+ if (txt is None) or (txt == '') or (txt == 'nas'):
51
+ return True
52
+ return False
53
+
41
54
  def to_string(self) -> str | None:
42
- return self.to_page_pdf().to_string()
55
+ if self.__text_document is None:
56
+ _pages: list[PageDocumentPdf] = self.to_document().to_pages()
57
+ content: str = ''
58
+ txt_page: str
59
+ for page in _pages:
60
+ txt_page = page.to_string()
61
+ if (txt_page is None) or (txt_page == '') or (txt_page == 'nas'):
62
+ continue
63
+ if content == '':
64
+ content = txt_page
65
+ continue
66
+ content = f'{content}\n{txt_page}'
67
+ self.__text_document = content
68
+ return self.__text_document
43
69
 
44
70
  def to_page_pdf(self) -> PageDocumentPdf:
45
71
  doc = self.to_document()
@@ -51,7 +77,7 @@ class TextRecognized(object):
51
77
  tmp_doc.metadata.dir_path = self.metadata.dir_path
52
78
  return tmp_doc
53
79
 
54
- def to_dict(self, separator: str = '\n') -> dict[str, ColumnBody]:
80
+ def to_dict(self, separator: str = '\n') -> DictTextTable:
55
81
  return self.to_page_pdf().to_dict(separator=separator)
56
82
 
57
83
  def to_dataframe(self, separator='\n') -> DataFrame:
@@ -153,13 +179,6 @@ class IEasyOcr(ABCOcrTesseract):
153
179
  return text
154
180
 
155
181
  def to_reconize(self, img: Union[File, ImageObject]) -> TextRecognized:
156
- import cv2
157
- import numpy as np
158
- from PIL import Image
159
- from io import BytesIO
160
- from reportlab.pdfgen import canvas
161
- from reportlab.lib.pagesizes import A4
162
- from reportlab.lib.utils import ImageReader
163
182
 
164
183
  # 1️⃣ Converter o objeto de entrada para imagem OpenCV
165
184
  if isinstance(img, File):
@@ -168,7 +187,7 @@ class IEasyOcr(ABCOcrTesseract):
168
187
  img_h, img_w = img_cv.shape[:2]
169
188
 
170
189
  # 2️⃣ Reconhecer o texto com EasyOCR
171
- results = self.reader.readtext(img_cv)
190
+ results: list = self.reader.readtext(img_cv)
172
191
 
173
192
  # 3️⃣ Converter a imagem para PDF (imagem de fundo)
174
193
  buffer = BytesIO()
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  from __future__ import annotations
3
- from convert_stream import DocumentPdf, PageDocumentPdf
4
- from convert_stream.pdf import ConvertPdfToImages
5
- from convert_stream.image import ImageObject
3
+ import convert_stream as cs
6
4
  from ocr_stream.bin_tess import BinTesseract
7
5
  from ocr_stream.modules import LibOcr, DEFAULT_LIB_OCR
8
6
  from ocr_stream.ocr import TesseractOcr, TextRecognized
@@ -32,7 +30,7 @@ class RecognizeImage(object):
32
30
  def bin_tesseract(self) -> BinTesseract:
33
31
  return self.module_ocr.mod_ocr.bin_tess
34
32
 
35
- def image_content_data(self, img: ImageObject | File) -> DataFrame:
33
+ def image_content_data(self, img: cs.ImageObject | File) -> DataFrame:
36
34
  """
37
35
  Retorna uma tabela estruturada com os dados reconhecidos da imagem.
38
36
 
@@ -41,35 +39,35 @@ class RecognizeImage(object):
41
39
  nível do OCR e confiabilidade, entre outras.
42
40
 
43
41
  Parâmetros:
44
- img (ImageObject | File): A imagem a ser processada, podendo ser um objeto
45
- `ImageObject` ou um arquivo `File`.
42
+ img (cs.ImageObject | File): A imagem a ser processada, podendo ser um objeto
43
+ `cs.ImageObject` ou um arquivo `File`.
46
44
 
47
45
  Retorna:
48
46
  DataFrame: Uma tabela contendo os dados reconhecidos na imagem.
49
47
 
50
48
  Lança:
51
- ValueError: Se o tipo do parâmetro `img` não for `ImageObject` ou `File`.
49
+ ValueError: Se o tipo do parâmetro `img` não for `cs.ImageObject` ou `File`.
52
50
 
53
- @param img: Imagem a ser processada, podendo ser uma instância de `ImageObject`
51
+ @param img: Imagem a ser processada, podendo ser uma instância de `cs.ImageObject`
54
52
  ou um arquivo `File`.
55
- @type img: ImageObject | File
53
+ @type img: cs.ImageObject | File
56
54
 
57
55
  @rtype: pandas.DataFrame
58
56
  @return: Um DataFrame com os dados reconhecidos na imagem.
59
57
 
60
- @raise ValueError: Caso o tipo de `img` não seja `ImageObject` nem `File`.
58
+ @raise ValueError: Caso o tipo de `img` não seja `cs.ImageObject` nem `File`.
61
59
  """
62
60
  return self.image_recognize(img).to_dataframe()
63
61
 
64
- def image_recognize(self, img: ImageObject | File, *, land_scape: bool = False) -> TextRecognized:
62
+ def image_recognize(self, img: cs.ImageObject | File, *, land_scape: bool = False) -> TextRecognized:
65
63
  if isinstance(img, File):
66
- img = ImageObject(img)
64
+ img = cs.ImageObject(img)
67
65
  if land_scape:
68
66
  img.set_landscape()
69
67
  rec: TextRecognized = self.module_ocr.to_reconize(img)
70
68
  return rec
71
69
 
72
- def image_to_string(self, img: ImageObject | File) -> str:
70
+ def image_to_string(self, img: cs.ImageObject | File) -> str:
73
71
  return self.module_ocr.to_string(img)
74
72
 
75
73
 
@@ -86,40 +84,40 @@ class RecognizePdf(object):
86
84
  def set_pbar(self, p: ProgressBarAdapter):
87
85
  self.pbar = p
88
86
 
89
- def recognize_page_pdf(self, page: PageDocumentPdf, *, dpi: int = 300) -> DocumentPdf:
87
+ def recognize_page_pdf(self, page: cs.PageDocumentPdf, *, dpi: int = 200) -> cs.DocumentPdf:
90
88
  """
91
89
  Converte a página em Imagem, reconhece o texto com OCR e
92
90
  retorna uma nova página com o texto reconhecido.
93
91
  """
94
- _doc = DocumentPdf.create_from_pages([page])
95
- _conv = ConvertPdfToImages.create(_doc)
96
- img: ImageObject = _conv.to_images(dpi=dpi)[0]
92
+ _stream = cs.PdfStream(pbar=self.pbar, dpi=dpi)
93
+ _stream.add_page(page)
94
+ img: cs.ImageObject = _stream.convert_pdf_to_images.to_images(dpi=dpi)[0]
97
95
  text_recognized: TextRecognized = self.recognize_image.image_recognize(img)
98
- del _doc
99
- del _conv
100
96
  del img
101
97
  return text_recognized.to_document()
102
98
 
103
- def recognize_document(self, doc: DocumentPdf, *, dpi: int = 300) -> DocumentPdf:
104
- _pages: list[PageDocumentPdf] = []
105
- _pages.clear()
106
- _conv = ConvertPdfToImages.create(doc)
107
- images: list[ImageObject] = _conv.to_images(dpi=dpi)
99
+ def recognize_document(self, doc: cs.DocumentPdf, *, dpi: int = 200) -> cs.DocumentPdf:
100
+ _pages: list[cs.PageDocumentPdf] = []
101
+ _stream = cs.PdfStream(pbar=self.pbar, dpi=dpi)
102
+ _stream.add_document(doc)
103
+ _conv = _stream.convert_pdf_to_images
104
+ images: list[cs.ImageObject] = _conv.to_images(dpi=dpi)
108
105
  max_num: int = len(images)
109
106
  for num, img in enumerate(images):
110
107
  self.pbar.update(
111
108
  ((num + 1) / max_num) * 100,
112
- f'Aplicando OCR [{num+1} de {max_num}]'
109
+ f'OCR Documento: [{num+1} de {max_num}]'
113
110
  )
114
111
  text_recognized = self.recognize_image.image_recognize(img)
115
112
  _pages.append(text_recognized.to_page_pdf())
116
113
  print()
117
114
  self.pbar.stop()
118
- new_doc = DocumentPdf.create_from_pages(_pages)
115
+ new_doc = cs.DocumentPdf.create_from_pages(_pages)
116
+ new_doc.metadata = doc.metadata
119
117
  return new_doc
120
118
 
121
- def recognize_file_pdf(self, file: File, *, dpi: int = 300) -> DocumentPdf:
122
- file_doc = DocumentPdf.create_from_file(file)
119
+ def recognize_file_pdf(self, file: File, *, dpi: int = 300) -> cs.DocumentPdf:
120
+ file_doc = cs.DocumentPdf.create_from_file(file)
123
121
  recognized_doc = self.recognize_document(file_doc, dpi=dpi)
124
122
  del file_doc
125
123
  return recognized_doc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ocr_stream
3
- Version: 2.4
3
+ Version: 2.4.2
4
4
  Summary: Extrair textos de documentos digitalizados e imagens.
5
5
  Author: Bruno Chaves
6
6
  Requires-Python: >=3.11
@@ -12,7 +12,7 @@ Requires-Dist: pandas
12
12
  Requires-Dist: requests>=2.32.4
13
13
  Requires-Dist: opencv-python
14
14
  Requires-Dist: pytesseract
15
- Requires-Dist: convert_stream>=2.4
15
+ Requires-Dist: convert_stream>=2.4.3
16
16
  Requires-Dist: soup_files>=1.4
17
17
 
18
18
  # ocrlib
@@ -5,5 +5,5 @@ pandas
5
5
  requests>=2.32.4
6
6
  opencv-python
7
7
  pytesseract
8
- convert_stream>=2.4
8
+ convert_stream>=2.4.3
9
9
  soup_files>=1.4
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ocr_stream"
7
- version = "2.4"
7
+ version = "2.4.2"
8
8
  authors = [
9
9
  { name="Bruno Chaves"},
10
10
  ]
@@ -21,7 +21,7 @@ dependencies = [
21
21
  "requests>=2.32.4",
22
22
  "opencv-python",
23
23
  "pytesseract",
24
- "convert_stream>=2.4",
24
+ "convert_stream>=2.4.3",
25
25
  "soup_files>=1.4",
26
26
  ]
27
27
 
File without changes
File without changes