convert-stream 2.4.1__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.
- {convert_stream-2.4.1 → convert_stream-2.4.2}/PKG-INFO +2 -1
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/__init__.py +7 -9
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/doc_stream.py +43 -23
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/image/img_object.py +14 -7
- convert_stream-2.4.2/convert_stream/mod_types/__init__.py +13 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/mod_types/enums.py +0 -9
- convert_stream-2.4.2/convert_stream/mod_types/table_types.py +19 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/pdf/image_to_pdf.py +1 -1
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/pdf/pdf_document.py +20 -17
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/pdf/pdf_page.py +2 -2
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/pdf/pdf_to_image.py +12 -5
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/table_files.py +16 -16
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/text/__init__.py +2 -2
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/text/find_text.py +16 -1
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream.egg-info/PKG-INFO +2 -1
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream.egg-info/SOURCES.txt +0 -5
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream.egg-info/requires.txt +1 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/pyproject.toml +2 -2
- convert_stream-2.4.1/convert_stream/mod_types/__init__.py +0 -98
- convert_stream-2.4.1/convert_stream/mod_types/table_types.py +0 -422
- convert_stream-2.4.1/convert_stream/sheets/__init__.py +0 -8
- convert_stream-2.4.1/convert_stream/sheets/load.py +0 -344
- convert_stream-2.4.1/convert_stream/sheets/parse.py +0 -71
- convert_stream-2.4.1/convert_stream/sheets/save.py +0 -29
- convert_stream-2.4.1/convert_stream/text/date.py +0 -253
- {convert_stream-2.4.1 → convert_stream-2.4.2}/README.md +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/__main__.py +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/_version.py +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/image/__init__.py +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/mod_types/modules.py +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/pdf/__init__.py +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream/text/terminal.py +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream.egg-info/dependency_links.txt +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/convert_stream.egg-info/top_level.txt +0 -0
- {convert_stream-2.4.1 → convert_stream-2.4.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: convert_stream
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.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
|
|
@@ -15,6 +15,7 @@ Requires-Dist: pandas
|
|
|
15
15
|
Requires-Dist: Pillow>=11.3.0
|
|
16
16
|
Requires-Dist: opencv-python
|
|
17
17
|
Requires-Dist: requests>=2.32.4
|
|
18
|
+
Requires-Dist: sheet_stream
|
|
18
19
|
|
|
19
20
|
# Configuração instalação:
|
|
20
21
|
pip3 install -r requirements.txt
|
|
@@ -8,20 +8,19 @@ from ._version import (
|
|
|
8
8
|
__module_name__, __author__, __license__, __modify_date__, __version__
|
|
9
9
|
)
|
|
10
10
|
from .mod_types import (
|
|
11
|
-
|
|
12
|
-
HeadCell, HeadValues, ColumnBody, TextTable, LibDate, LibPDF, LibImage, LibPdfToImage,
|
|
13
|
-
LibImageToPdf, DictTextTable, RotationAngle,
|
|
11
|
+
LibPDF, LibImage, LibPdfToImage, LibImageToPdf, DictTextTable, RotationAngle,
|
|
14
12
|
)
|
|
15
13
|
from .image import ImageObject, CollectionImages
|
|
16
14
|
from .pdf import DocumentPdf, PageDocumentPdf, CollectionPagePdf, ConvertPdfToImages, ConvertImageToPdf
|
|
17
15
|
from .pdf.pdf_document import SearchableTextPdf
|
|
18
16
|
from .doc_stream import PdfStream, SplitPdf
|
|
19
17
|
from .table_files import PdfFinder
|
|
20
|
-
from .text import
|
|
18
|
+
from .text import print_title, print_line, FindStrings
|
|
19
|
+
from sheet_stream import VoidAdapter
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
def __create_stream() -> PdfStream:
|
|
24
|
-
st = PdfStream()
|
|
23
|
+
st = PdfStream(pbar=VoidAdapter())
|
|
25
24
|
st.clear()
|
|
26
25
|
return st
|
|
27
26
|
|
|
@@ -77,10 +76,9 @@ __all__ = [
|
|
|
77
76
|
'__modify_date__', '__author__', '__license__', '__module_name__', '__version__',
|
|
78
77
|
'PdfStream', 'DocumentPdf', 'PageDocumentPdf', 'CollectionPagePdf', 'CollectionImages',
|
|
79
78
|
'ImageObject', 'File', 'Directory', 'LibraryDocs', 'InputFiles', 'SearchableTextPdf',
|
|
80
|
-
'PdfFinder', 'SplitPdf', 'LibImageToPdf', 'RotationAngle', 'ConvertImageToPdf',
|
|
81
|
-
'
|
|
82
|
-
'HeadCell', 'HeadValues', 'ColumnBody', 'TextTable', 'LibDate', 'LibPDF', 'LibImage', 'LibPdfToImage',
|
|
79
|
+
'PdfFinder', 'SplitPdf', 'LibImageToPdf', 'RotationAngle', 'ConvertImageToPdf',
|
|
80
|
+
'ConvertPdfToImages', 'LibPDF', 'LibImage', 'LibPdfToImage',
|
|
83
81
|
'read_pdf', 'read_files_pdf', 'read_image', 'DictTextTable',
|
|
84
|
-
'
|
|
82
|
+
'print_title', 'print_line', 'FindStrings',
|
|
85
83
|
]
|
|
86
84
|
|
|
@@ -31,22 +31,38 @@ class PdfStream(object):
|
|
|
31
31
|
def __init__(
|
|
32
32
|
self, *,
|
|
33
33
|
pbar: ProgressBarAdapter = ProgressBarAdapter(),
|
|
34
|
-
lib_pdf: LibPDF =
|
|
35
|
-
lib_img: LibImage =
|
|
36
|
-
lib_img_to_pdf: LibImageToPdf =
|
|
37
|
-
lib_pdf_to_img: LibPdfToImage =
|
|
34
|
+
lib_pdf: LibPDF = LibPDF.FITZ,
|
|
35
|
+
lib_img: LibImage = LibImage.OPENCV,
|
|
36
|
+
lib_img_to_pdf: LibImageToPdf = LibImageToPdf.IMAGE_TO_PDF_FITZ,
|
|
37
|
+
lib_pdf_to_img: LibPdfToImage = LibPdfToImage.PDF_TO_IMG_FITZ,
|
|
38
|
+
dpi: int = 200,
|
|
38
39
|
) -> None:
|
|
40
|
+
self.dpi = dpi
|
|
39
41
|
self.progress: ProgressBarAdapter = pbar
|
|
40
42
|
self.collection_pages: CollectionPagePdf = CollectionPagePdf([])
|
|
41
|
-
self.collection_images: CollectionImages = CollectionImages([])
|
|
42
|
-
self.collection_images.set_pbar(
|
|
43
|
-
self.collection_pages.set_pbar(
|
|
43
|
+
self.collection_images: CollectionImages = CollectionImages([], lib_img=lib_img)
|
|
44
|
+
self.collection_images.set_pbar(self.progress)
|
|
45
|
+
self.collection_pages.set_pbar(self.progress)
|
|
44
46
|
self.lib_pdf: LibPDF = lib_pdf
|
|
45
47
|
self.lib_img: LibImage = lib_img
|
|
46
48
|
self.lib_img_to_pdf: LibImageToPdf = lib_img_to_pdf
|
|
47
49
|
self.lib_pdf_to_img: LibPdfToImage = lib_pdf_to_img
|
|
48
50
|
self.clear()
|
|
49
51
|
|
|
52
|
+
@property
|
|
53
|
+
def convert_pdf_to_images(self) -> ConvertPdfToImages:
|
|
54
|
+
conv = ConvertPdfToImages.create(
|
|
55
|
+
DocumentPdf.create_from_pages(self.collection_pages, lib_pdf=self.lib_pdf),
|
|
56
|
+
)
|
|
57
|
+
conv.set_pbar(self.progress)
|
|
58
|
+
return conv
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def convert_images_to_pdf(self) -> ConvertImageToPdf:
|
|
62
|
+
_con = ConvertImageToPdf(self.collection_images, lib_img_to_pdf=self.lib_img_to_pdf)
|
|
63
|
+
_con.set_pbar(self.progress)
|
|
64
|
+
return _con
|
|
65
|
+
|
|
50
66
|
@property
|
|
51
67
|
def is_empty(self) -> bool:
|
|
52
68
|
return self.collection_pages.is_empty
|
|
@@ -81,10 +97,10 @@ class PdfStream(object):
|
|
|
81
97
|
self.collection_images.add_images(images)
|
|
82
98
|
|
|
83
99
|
def add_file_pdf(self, f: File) -> None:
|
|
84
|
-
self.collection_pages.add_file_pdf(f)
|
|
100
|
+
self.collection_pages.add_file_pdf(f, lib_pdf=self.lib_pdf)
|
|
85
101
|
|
|
86
102
|
def add_files_pdf(self, files: list[File]) -> None:
|
|
87
|
-
self.collection_pages.add_files_pdf(files)
|
|
103
|
+
self.collection_pages.add_files_pdf(files, lib_pdf=self.lib_pdf)
|
|
88
104
|
|
|
89
105
|
def add_document(self, doc: DocumentPdf) -> None:
|
|
90
106
|
self.collection_pages.add_document(doc)
|
|
@@ -105,23 +121,28 @@ class PdfStream(object):
|
|
|
105
121
|
|
|
106
122
|
_doc: DocumentPdf = None
|
|
107
123
|
if not self.collection_images.is_empty:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
_doc: DocumentPdf = _convert.to_document(land_scape, a4=a4)
|
|
124
|
+
# Converter as imagens em documento PDF.
|
|
125
|
+
_doc = self.convert_images_to_pdf.to_document(land_scape, a4=a4)
|
|
111
126
|
if not self.collection_pages.is_empty:
|
|
127
|
+
# Converter/Adicionar as páginas PDF ao documento final.
|
|
112
128
|
if _doc is None:
|
|
113
129
|
_doc: DocumentPdf = self.collection_pages.to_document(self.lib_pdf)
|
|
114
130
|
else:
|
|
115
131
|
_doc.add_pages(self.collection_pages)
|
|
116
132
|
return _doc
|
|
117
133
|
|
|
118
|
-
def thresold(self, *, land_scape: bool = False, a4: bool = False
|
|
119
|
-
|
|
134
|
+
def thresold(self, *, land_scape: bool = False, a4: bool = False) -> DocumentPdf:
|
|
135
|
+
if self.collection_images.length == 0:
|
|
136
|
+
images: list[ImageObject] = []
|
|
137
|
+
else:
|
|
138
|
+
images: list[ImageObject] = self.collection_images.copy()
|
|
139
|
+
|
|
120
140
|
if not self.collection_pages.is_empty:
|
|
121
|
-
|
|
122
|
-
conv_pdf_to_img =
|
|
123
|
-
images.extend(
|
|
124
|
-
|
|
141
|
+
# Converter as páginas PDF em imagens.
|
|
142
|
+
conv_pdf_to_img: ConvertPdfToImages = self.convert_pdf_to_images
|
|
143
|
+
images.extend(
|
|
144
|
+
conv_pdf_to_img.to_images(dpi=self.dpi, lib_image=self.lib_img),
|
|
145
|
+
)
|
|
125
146
|
if len(images) == 0:
|
|
126
147
|
raise ValueError('Adicione imagens para prosseguir!')
|
|
127
148
|
if land_scape:
|
|
@@ -137,22 +158,21 @@ class PdfStream(object):
|
|
|
137
158
|
output_dir: Directory, *,
|
|
138
159
|
replace: bool = False,
|
|
139
160
|
land_scape: bool = False,
|
|
140
|
-
dpi: int = 300,
|
|
141
161
|
) -> None:
|
|
142
162
|
if self.collection_pages.is_empty and self.collection_images.is_empty:
|
|
143
163
|
raise ValueError('Adicione imagens e/ou documentos para prosseguir!')
|
|
144
164
|
self.progress.start()
|
|
145
165
|
|
|
146
166
|
image_stream = ImageStream([])
|
|
167
|
+
image_stream.set_pbar(self.progress)
|
|
147
168
|
if not self.collection_images.is_empty:
|
|
148
169
|
image_stream.add_images(self.collection_images)
|
|
149
170
|
if not self.collection_pages.is_empty:
|
|
150
171
|
self.progress.update_text('Processando Imagens')
|
|
151
172
|
# Criar um documento a partir das páginas
|
|
152
|
-
|
|
153
|
-
convert_pdf_to_img = ConvertPdfToImages.create(doc_pdf)
|
|
173
|
+
convert_pdf_to_img = self.convert_pdf_to_images
|
|
154
174
|
# Converter as páginas PDF em imagens e adicionar a coleção já existe de imagens.
|
|
155
|
-
_pdf_to_images: list[ImageObject] = convert_pdf_to_img.to_images(dpi=dpi)
|
|
175
|
+
_pdf_to_images: list[ImageObject] = convert_pdf_to_img.to_images(dpi=self.dpi, lib_image=self.lib_img)
|
|
156
176
|
image_stream.add_images(_pdf_to_images)
|
|
157
177
|
# Exportar para arquivos.
|
|
158
178
|
image_stream.to_files_image(output_dir, replace=replace, land_scape=land_scape)
|
|
@@ -172,7 +192,7 @@ class PdfStream(object):
|
|
|
172
192
|
if not self.collection_pages.is_empty:
|
|
173
193
|
pages_document.extend(self.collection_pages)
|
|
174
194
|
if not self.collection_images.is_empty:
|
|
175
|
-
img_to_pdf
|
|
195
|
+
img_to_pdf: ConvertImageToPdf = self.convert_images_to_pdf
|
|
176
196
|
tmp_document = img_to_pdf.to_document(land_scape, a4=a4)
|
|
177
197
|
pages_document.extend(tmp_document.to_pages())
|
|
178
198
|
final_collection = CollectionPagePdf(pages_document)
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
Módulo para trabalhar com imagens
|
|
5
5
|
"""
|
|
6
6
|
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import os.path
|
|
7
9
|
from typing import Union
|
|
8
10
|
from abc import ABC, abstractmethod
|
|
9
11
|
from soup_files import File, Directory, InputFiles, LibraryDocs, ProgressBarAdapter
|
|
10
12
|
from io import BytesIO
|
|
11
13
|
import numpy as np
|
|
12
14
|
from scipy.ndimage import uniform_filter
|
|
13
|
-
from
|
|
15
|
+
from sheet_stream.type_utils import get_hash_from_bytes, MetaDataFile, MetaDataItem
|
|
14
16
|
from convert_stream.mod_types.enums import LibImage, RotationAngle
|
|
15
17
|
from convert_stream.mod_types.table_types import ListItems
|
|
16
18
|
from convert_stream.mod_types.modules import (
|
|
@@ -205,7 +207,7 @@ class ImplementOpenCv(ABCImageObject):
|
|
|
205
207
|
if img is None:
|
|
206
208
|
raise ValueError(f"Não foi possível abrir a imagem: {f.absolute()}")
|
|
207
209
|
im_obj = cls(img)
|
|
208
|
-
im_obj.metadata = create_metadata(f)
|
|
210
|
+
im_obj.metadata = MetaDataFile.create_metadata(f)
|
|
209
211
|
return im_obj
|
|
210
212
|
|
|
211
213
|
@classmethod
|
|
@@ -350,7 +352,7 @@ class ImplementPIL(ABCImageObject):
|
|
|
350
352
|
def create_from_file(cls, f: File) -> ABCImageObject:
|
|
351
353
|
img = Image.open(f.absolute())
|
|
352
354
|
im_obj = cls(img)
|
|
353
|
-
im_obj.metadata = create_metadata(f)
|
|
355
|
+
im_obj.metadata = MetaDataFile.create_metadata(f)
|
|
354
356
|
return im_obj
|
|
355
357
|
|
|
356
358
|
@classmethod
|
|
@@ -498,12 +500,13 @@ class ImageObject(object):
|
|
|
498
500
|
|
|
499
501
|
class CollectionImages(ListItems):
|
|
500
502
|
|
|
501
|
-
def __init__(self, images: list[ImageObject]) -> None:
|
|
503
|
+
def __init__(self, images: list[ImageObject], *, lib_img: LibImage = LibImage.OPENCV) -> None:
|
|
502
504
|
"""
|
|
503
505
|
Gerir uma lista de Imagens
|
|
504
506
|
:type images: list[ImageObject]
|
|
505
507
|
"""
|
|
506
508
|
super().__init__(images)
|
|
509
|
+
self.lib_img: LibImage = lib_img
|
|
507
510
|
self.pbar: ProgressBarAdapter = ProgressBarAdapter()
|
|
508
511
|
self.__count: int = 0
|
|
509
512
|
|
|
@@ -520,7 +523,7 @@ class CollectionImages(ListItems):
|
|
|
520
523
|
self.pbar.start()
|
|
521
524
|
self.__count += 1
|
|
522
525
|
self.pbar.update_text(f'Adicionando imagem {self.__count} {file.basename()}')
|
|
523
|
-
im = ImageObject.create_from_file(file)
|
|
526
|
+
im = ImageObject.create_from_file(file, lib_image=self.lib_img)
|
|
524
527
|
self.append(im)
|
|
525
528
|
self.pbar.stop()
|
|
526
529
|
|
|
@@ -536,7 +539,7 @@ class CollectionImages(ListItems):
|
|
|
536
539
|
((num+1) / max_num) * 100,
|
|
537
540
|
f'Adicionando imagem: [{num+1} de {max_num}]'
|
|
538
541
|
)
|
|
539
|
-
self.append(ImageObject.create_from_file(f))
|
|
542
|
+
self.append(ImageObject.create_from_file(f, lib_image=self.lib_img))
|
|
540
543
|
self.pbar.stop()
|
|
541
544
|
|
|
542
545
|
def add_directory_images(self, d: Directory, max_files: int = 4000) -> None:
|
|
@@ -554,8 +557,12 @@ class CollectionImages(ListItems):
|
|
|
554
557
|
print()
|
|
555
558
|
output_dir.mkdir()
|
|
556
559
|
max_num = self.length
|
|
560
|
+
img: ImageObject
|
|
557
561
|
for n, img in enumerate(self):
|
|
558
|
-
|
|
562
|
+
if img.metadata.file_path is not None:
|
|
563
|
+
filename = f'{os.path.basename(img.metadata.file_path)}-{n}.png'
|
|
564
|
+
else:
|
|
565
|
+
filename = f'{img.metadata.name}-{n}.png'
|
|
559
566
|
file_path = output_dir.join_file(filename)
|
|
560
567
|
if (not replace) and (file_path.exists()):
|
|
561
568
|
self.pbar.update_text(f'[PULANDO]: {file_path.basename()}')
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from .enums import (
|
|
5
|
+
RotationAngle, ColumnsTable, LibImage, LibPdfToImage, LibPDF, LibImageToPdf
|
|
6
|
+
)
|
|
7
|
+
from .table_types import DictTextTable
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
'DictTextTable', 'RotationAngle', 'LibPDF',
|
|
12
|
+
'LibImageToPdf', 'LibPdfToImage', 'LibImage',
|
|
13
|
+
]
|
|
@@ -58,15 +58,6 @@ class LibImage(Enum):
|
|
|
58
58
|
NOT_IMPLEMENTED = 'null'
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
class LibDate(Enum):
|
|
62
|
-
D_M_Y = '%d-%m-%Y'
|
|
63
|
-
DMY = '%d/%m/%Y'
|
|
64
|
-
dmy = '%d/%m/%y'
|
|
65
|
-
d_m_y = '%d-%m-%y'
|
|
66
|
-
YMD = '%Y/%m/%d'
|
|
67
|
-
Y_M_D = '%Y-%m-%d'
|
|
68
|
-
|
|
69
|
-
|
|
70
61
|
class RotationAngle(Enum):
|
|
71
62
|
|
|
72
63
|
ROTATION_90 = 90
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from sheet_stream import (
|
|
5
|
+
ColumnsTable, ListString, ListItems, ListColumnBody, ArrayString, TableDocuments, TableRow, TableTextKeyWord
|
|
6
|
+
)
|
|
7
|
+
from sheet_stream.type_utils import HeadCell
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ColumnBody(ListColumnBody):
|
|
11
|
+
|
|
12
|
+
def __init__(self, col_name: HeadCell | str, col_body: list[str]):
|
|
13
|
+
super().__init__(col_name, col_body)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DictTextTable(TableDocuments):
|
|
17
|
+
|
|
18
|
+
def __init__(self, body_list: list[ListColumnBody]):
|
|
19
|
+
super().__init__(body_list)
|
|
@@ -297,7 +297,7 @@ class ConvertImageToPdf(object):
|
|
|
297
297
|
def __init__(
|
|
298
298
|
self,
|
|
299
299
|
collection_images: CollectionImages, *,
|
|
300
|
-
lib_img_to_pdf: LibImageToPdf =
|
|
300
|
+
lib_img_to_pdf: LibImageToPdf = LibImageToPdf.IMAGE_TO_PDF_FITZ
|
|
301
301
|
):
|
|
302
302
|
if lib_img_to_pdf == LibImageToPdf.IMAGE_TO_PDF_CANVAS:
|
|
303
303
|
self.convert: ABCConvertImageToPdf = ImplementImageToPdfCanvas(collection_images)
|
|
@@ -9,13 +9,14 @@ from io import BytesIO
|
|
|
9
9
|
from typing import Union
|
|
10
10
|
import pandas as pd
|
|
11
11
|
from soup_files import File, Directory, LibraryDocs, InputFiles, ProgressBarAdapter, JsonConvert
|
|
12
|
-
from
|
|
13
|
-
get_hash_from_bytes,
|
|
12
|
+
from sheet_stream.type_utils import (
|
|
13
|
+
get_hash_from_bytes, MetaDataFile, MetaDataItem
|
|
14
14
|
)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
HeadCell, HeadValues, ColumnsTable
|
|
15
|
+
|
|
16
|
+
from sheet_stream.type_utils import (
|
|
17
|
+
ListItems, HeadCell, HeadValues, ColumnsTable, concat_table_documents, TableDocuments
|
|
18
18
|
)
|
|
19
|
+
from convert_stream.mod_types.table_types import DictTextTable, ColumnBody
|
|
19
20
|
from convert_stream.mod_types.enums import LibPDF
|
|
20
21
|
from convert_stream.mod_types.modules import (
|
|
21
22
|
DEFAULT_LIB_PDF, ModDocPdf, PdfWriter, PdfReader, fitz, MOD_FITZ, MOD_PYPDF
|
|
@@ -33,7 +34,7 @@ class SearchableTextPdf(object):
|
|
|
33
34
|
ColumnsTable.KEY.value: ColumnBody(ColumnsTable.KEY.value, ListString([])),
|
|
34
35
|
ColumnsTable.NUM_PAGE.value: ColumnBody(ColumnsTable.NUM_PAGE.value, ListString([])),
|
|
35
36
|
ColumnsTable.NUM_LINE.value: ColumnBody(ColumnsTable.NUM_LINE.value, ListString([])),
|
|
36
|
-
ColumnsTable.TEXT
|
|
37
|
+
ColumnsTable.TEXT: ColumnBody(ColumnsTable.TEXT, ListString([])),
|
|
37
38
|
ColumnsTable.FILE_NAME.value: ColumnBody(ColumnsTable.FILE_NAME.value, ListString([])),
|
|
38
39
|
ColumnsTable.FILETYPE.value: ColumnBody(ColumnsTable.FILETYPE.value, ListString([])),
|
|
39
40
|
ColumnsTable.FILE_PATH.value: ColumnBody(ColumnsTable.FILE_PATH.value, ListString([])),
|
|
@@ -49,10 +50,10 @@ class SearchableTextPdf(object):
|
|
|
49
50
|
|
|
50
51
|
@property
|
|
51
52
|
def length(self) -> int:
|
|
52
|
-
return len(self.elements[ColumnsTable.TEXT
|
|
53
|
+
return len(self.elements[ColumnsTable.TEXT])
|
|
53
54
|
|
|
54
55
|
def is_empty(self) -> bool:
|
|
55
|
-
return len(self.elements[ColumnsTable.TEXT
|
|
56
|
+
return len(self.elements[ColumnsTable.TEXT]) == 0
|
|
56
57
|
|
|
57
58
|
@property
|
|
58
59
|
def columns(self) -> HeadValues:
|
|
@@ -110,7 +111,7 @@ class SearchableTextPdf(object):
|
|
|
110
111
|
ou 'nas' em caso de erro nas = Not a String
|
|
111
112
|
"""
|
|
112
113
|
try:
|
|
113
|
-
return ' '.join(self.elements[ColumnsTable.TEXT
|
|
114
|
+
return ' '.join(self.elements[ColumnsTable.TEXT])
|
|
114
115
|
except Exception as e:
|
|
115
116
|
print(e)
|
|
116
117
|
return 'nas'
|
|
@@ -270,7 +271,7 @@ class ImplementDocumentFitz(ABCDocument):
|
|
|
270
271
|
raise ImportError("Módulo fitz|pymupdf não instalado!\nUse pip install fitz.")
|
|
271
272
|
doc = fitz.open(file.path)
|
|
272
273
|
_obj_doc = cls(doc)
|
|
273
|
-
_obj_doc.metadata = create_metadata(file)
|
|
274
|
+
_obj_doc.metadata = MetaDataFile.create_metadata(file)
|
|
274
275
|
return _obj_doc
|
|
275
276
|
|
|
276
277
|
@classmethod
|
|
@@ -391,7 +392,7 @@ class ImplementDocumentPyPdf(ABCDocument):
|
|
|
391
392
|
pdf_writer.add_page(p)
|
|
392
393
|
del reader
|
|
393
394
|
_obj_doc = cls(pdf_writer)
|
|
394
|
-
_obj_doc.metadata = create_metadata(file)
|
|
395
|
+
_obj_doc.metadata = MetaDataFile.create_metadata(file)
|
|
395
396
|
return _obj_doc
|
|
396
397
|
|
|
397
398
|
@classmethod
|
|
@@ -469,6 +470,7 @@ class DocumentPdf(object):
|
|
|
469
470
|
raise ValueError(
|
|
470
471
|
f'Use: str, File, PdfWriter, fitz.Document ou BytesIO não => {type(document)}'
|
|
471
472
|
)
|
|
473
|
+
print(self.metadata)
|
|
472
474
|
|
|
473
475
|
@property
|
|
474
476
|
def name(self) -> str | None:
|
|
@@ -560,7 +562,7 @@ class DocumentPdf(object):
|
|
|
560
562
|
dir_path=self.metadata.dir_path,
|
|
561
563
|
)
|
|
562
564
|
|
|
563
|
-
def to_dict(self, separator: str = '\n') ->
|
|
565
|
+
def to_dict(self, separator: str = '\n') -> TableDocuments:
|
|
564
566
|
list_data: list[DictTextTable] = []
|
|
565
567
|
pages: list[PageDocumentPdf] = self.to_pages()
|
|
566
568
|
|
|
@@ -569,7 +571,7 @@ class DocumentPdf(object):
|
|
|
569
571
|
list_data.append(_mp)
|
|
570
572
|
if len(list_data) == 0:
|
|
571
573
|
return DictTextTable.create_void_dict()
|
|
572
|
-
return
|
|
574
|
+
return concat_table_documents(list_data)
|
|
573
575
|
|
|
574
576
|
def to_data(self, separator: str = '\n') -> pd.DataFrame:
|
|
575
577
|
return pd.DataFrame.from_dict(self.to_dict(separator=separator))
|
|
@@ -604,7 +606,7 @@ class DocumentPdf(object):
|
|
|
604
606
|
ColumnsTable.KEY.value: f'{idx}',
|
|
605
607
|
ColumnsTable.NUM_PAGE.value: f'{_page.number_page}',
|
|
606
608
|
ColumnsTable.NUM_LINE.value: f'{idx+1}',
|
|
607
|
-
ColumnsTable.TEXT
|
|
609
|
+
ColumnsTable.TEXT: math_text,
|
|
608
610
|
ColumnsTable.FILE_NAME.value: self.metadata.name,
|
|
609
611
|
ColumnsTable.FILETYPE.value: self.metadata.extension,
|
|
610
612
|
ColumnsTable.FILE_PATH.value: self.metadata.file_path,
|
|
@@ -646,7 +648,7 @@ class DocumentPdf(object):
|
|
|
646
648
|
ColumnsTable.KEY.value: f'{idx}',
|
|
647
649
|
ColumnsTable.NUM_PAGE.value: f'{_page.number_page}',
|
|
648
650
|
ColumnsTable.NUM_LINE.value: f'{idx + 1}',
|
|
649
|
-
ColumnsTable.TEXT
|
|
651
|
+
ColumnsTable.TEXT: math_text,
|
|
650
652
|
ColumnsTable.FILE_NAME.value: self.metadata.name,
|
|
651
653
|
ColumnsTable.FILETYPE.value: self.metadata.extension,
|
|
652
654
|
ColumnsTable.FILE_PATH.value: self.metadata.file_path,
|
|
@@ -671,6 +673,7 @@ class DocumentPdf(object):
|
|
|
671
673
|
) -> DocumentPdf:
|
|
672
674
|
if lib_pdf == LibPDF.FITZ:
|
|
673
675
|
mod_pdf = ImplementDocumentFitz.create_from_pages(pages)
|
|
676
|
+
mod_pdf.metadata.file_path = pages[0].metadata.file_path
|
|
674
677
|
return cls(mod_pdf, lib_pdf=lib_pdf)
|
|
675
678
|
elif lib_pdf == LibPDF.PYPDF:
|
|
676
679
|
mod_pdf = ImplementDocumentPyPdf.create_from_pages(pages)
|
|
@@ -716,12 +719,12 @@ class CollectionPagePdf(ListItems):
|
|
|
716
719
|
pg.number_page = _counter
|
|
717
720
|
self.append(pg)
|
|
718
721
|
|
|
719
|
-
def add_file_pdf(self, file: File, *, lib_pdf: LibPDF =
|
|
722
|
+
def add_file_pdf(self, file: File, *, lib_pdf: LibPDF = LibPDF.FITZ) -> None:
|
|
720
723
|
self.pbar.update_text(f'Adicionando arquivo PDF {file.basename()}')
|
|
721
724
|
doc_pdf = DocumentPdf(file, lib_pdf=lib_pdf)
|
|
722
725
|
self.add_pages(doc_pdf.to_pages())
|
|
723
726
|
|
|
724
|
-
def add_files_pdf(self, files: list[File], lib_pdf: LibPDF =
|
|
727
|
+
def add_files_pdf(self, files: list[File], lib_pdf: LibPDF = LibPDF.FITZ) -> None:
|
|
725
728
|
max_num: int = len(files)
|
|
726
729
|
for num, f in enumerate(files):
|
|
727
730
|
self.pbar.update(
|
|
@@ -9,12 +9,12 @@ import pandas as pd
|
|
|
9
9
|
|
|
10
10
|
from convert_stream.mod_types.enums import LibPDF
|
|
11
11
|
from convert_stream.mod_types.table_types import (
|
|
12
|
-
DictTextTable, ListString
|
|
12
|
+
DictTextTable, ListString
|
|
13
13
|
)
|
|
14
14
|
from convert_stream.mod_types.modules import (
|
|
15
15
|
ModPagePdf, PageObject, fitz
|
|
16
16
|
)
|
|
17
|
-
from
|
|
17
|
+
from sheet_stream.type_utils import MetaDataFile
|
|
18
18
|
from convert_stream.text.find_text import FindText, ArrayString
|
|
19
19
|
|
|
20
20
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
from abc import ABC, abstractmethod
|
|
8
8
|
|
|
9
|
+
from sheet_stream.type_utils import MetaDataFile
|
|
10
|
+
|
|
9
11
|
from convert_stream import CollectionImages
|
|
10
12
|
from soup_files import Directory, ProgressBarAdapter, CreatePbar
|
|
11
13
|
from convert_stream.mod_types.enums import LibPdfToImage
|
|
@@ -74,6 +76,7 @@ class ImplementConvertPdfFitz(ABCConvertPdf):
|
|
|
74
76
|
|
|
75
77
|
def __init__(self, document: DocumentPdf):
|
|
76
78
|
super().__init__(document)
|
|
79
|
+
self.lib_pdf_to_image: LibPdfToImage = LibPdfToImage.PDF_TO_IMG_FITZ
|
|
77
80
|
|
|
78
81
|
def __get_pages(self) -> list[Page]:
|
|
79
82
|
pages = self.document.to_pages()
|
|
@@ -85,12 +88,14 @@ class ImplementConvertPdfFitz(ABCConvertPdf):
|
|
|
85
88
|
def to_images(
|
|
86
89
|
self, *,
|
|
87
90
|
dpi: int = 200,
|
|
88
|
-
lib_image: LibImage =
|
|
91
|
+
lib_image: LibImage = LibImage.PIL
|
|
89
92
|
) -> list[ImageObject]:
|
|
90
93
|
"""
|
|
91
94
|
Converte um Documento em lista de objetos ImageObject.
|
|
92
95
|
"""
|
|
93
96
|
images: list[ImageObject] = []
|
|
97
|
+
_metadata: MetaDataFile = self.document.metadata
|
|
98
|
+
|
|
94
99
|
pages_fitz: list[Page] = self.__get_pages()
|
|
95
100
|
_count = len(pages_fitz)
|
|
96
101
|
for n, pg in enumerate(pages_fitz):
|
|
@@ -103,6 +108,8 @@ class ImplementConvertPdfFitz(ABCConvertPdf):
|
|
|
103
108
|
pix.tobytes('png', jpg_quality=100),
|
|
104
109
|
lib_image=LibImage.PIL,
|
|
105
110
|
)
|
|
111
|
+
img.metadata.name = _metadata.name
|
|
112
|
+
img.metadata.file_path = _metadata.file_path
|
|
106
113
|
images.append(img)
|
|
107
114
|
return images
|
|
108
115
|
|
|
@@ -112,14 +119,14 @@ class ImplementConvertPdfFitz(ABCConvertPdf):
|
|
|
112
119
|
replace: bool = False,
|
|
113
120
|
gaussian_filter: bool = False,
|
|
114
121
|
dpi: int = 300,
|
|
115
|
-
lib_image: LibImage =
|
|
122
|
+
lib_image: LibImage = LibImage.PIL
|
|
116
123
|
) -> None:
|
|
117
124
|
pages_fitz: list[Page] = self.__get_pages()
|
|
118
125
|
_count = len(pages_fitz)
|
|
119
126
|
for n, pg in enumerate(pages_fitz):
|
|
120
127
|
self.pbar.update(
|
|
121
128
|
((n + 1) / _count) * 100,
|
|
122
|
-
f'[Documento para arquivos de
|
|
129
|
+
f'[Documento para arquivos de imagens]: {n + 1}/{_count}'
|
|
123
130
|
)
|
|
124
131
|
out_file = output_dir.join_file(f'pag-{n+1}.png')
|
|
125
132
|
if not replace:
|
|
@@ -153,7 +160,7 @@ class ConvertPdfToImages(object):
|
|
|
153
160
|
def to_images(
|
|
154
161
|
self, *,
|
|
155
162
|
dpi: int = 300,
|
|
156
|
-
lib_image: LibImage =
|
|
163
|
+
lib_image: LibImage = LibImage.PIL,
|
|
157
164
|
) -> list[ImageObject]:
|
|
158
165
|
return self.mod_convert_to_image.to_images(dpi=dpi, lib_image=lib_image)
|
|
159
166
|
|
|
@@ -163,7 +170,7 @@ class ConvertPdfToImages(object):
|
|
|
163
170
|
replace: bool = False,
|
|
164
171
|
gaussian_filter: bool = False,
|
|
165
172
|
dpi: int = 300,
|
|
166
|
-
lib_image: LibImage =
|
|
173
|
+
lib_image: LibImage = LibImage.PIL,
|
|
167
174
|
) -> None:
|
|
168
175
|
self.mod_convert_to_image.to_files_image(
|
|
169
176
|
dpi=dpi,
|
|
@@ -88,14 +88,14 @@ class PdfFinder(object):
|
|
|
88
88
|
file_type = temp_doc.metadata.extension
|
|
89
89
|
|
|
90
90
|
new_line: dict[str, str] = {
|
|
91
|
-
ColumnsTable.KEY
|
|
92
|
-
ColumnsTable.NUM_PAGE
|
|
93
|
-
ColumnsTable.NUM_LINE
|
|
94
|
-
ColumnsTable.TEXT
|
|
95
|
-
ColumnsTable.FILE_NAME
|
|
96
|
-
ColumnsTable.FILETYPE
|
|
97
|
-
ColumnsTable.FILE_PATH
|
|
98
|
-
ColumnsTable.DIR
|
|
91
|
+
ColumnsTable.KEY: f'{idx}',
|
|
92
|
+
ColumnsTable.NUM_PAGE: 'nan',
|
|
93
|
+
ColumnsTable.NUM_LINE: f'{idx + 1}',
|
|
94
|
+
ColumnsTable.TEXT: math_text,
|
|
95
|
+
ColumnsTable.FILE_NAME: file_name,
|
|
96
|
+
ColumnsTable.FILETYPE: file_type,
|
|
97
|
+
ColumnsTable.FILE_PATH: file_path,
|
|
98
|
+
ColumnsTable.DIR: dir_path,
|
|
99
99
|
}
|
|
100
100
|
_searchable.add_line(new_line)
|
|
101
101
|
return _searchable
|
|
@@ -140,14 +140,14 @@ class PdfFinder(object):
|
|
|
140
140
|
file_type = temp_doc.metadata.extension
|
|
141
141
|
|
|
142
142
|
new_line: dict[str, str] = {
|
|
143
|
-
ColumnsTable.KEY
|
|
144
|
-
ColumnsTable.NUM_PAGE
|
|
145
|
-
ColumnsTable.NUM_LINE
|
|
146
|
-
ColumnsTable.TEXT
|
|
147
|
-
ColumnsTable.FILE_NAME
|
|
148
|
-
ColumnsTable.FILETYPE
|
|
149
|
-
ColumnsTable.FILE_PATH
|
|
150
|
-
ColumnsTable.DIR
|
|
143
|
+
ColumnsTable.KEY: f'{idx}',
|
|
144
|
+
ColumnsTable.NUM_PAGE: 'nan',
|
|
145
|
+
ColumnsTable.NUM_LINE: f'{idx + 1}',
|
|
146
|
+
ColumnsTable.TEXT: math_text,
|
|
147
|
+
ColumnsTable.FILE_NAME: file_name,
|
|
148
|
+
ColumnsTable.FILETYPE: file_type,
|
|
149
|
+
ColumnsTable.FILE_PATH: file_path,
|
|
150
|
+
ColumnsTable.DIR: dir_path,
|
|
151
151
|
}
|
|
152
152
|
_searchable.add_line(new_line)
|
|
153
153
|
return _searchable
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
from .
|
|
3
|
-
from .find_text import FindText
|
|
2
|
+
from .find_text import FindText, FindStrings
|
|
4
3
|
from .terminal import (
|
|
5
4
|
print_line, print_title, show_error, show_warning, show_info, Colors, msg
|
|
6
5
|
)
|
|
6
|
+
from sheet_stream import ConvertStringDate, fmt_col_to_date
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
9
9
|
'ConvertStringDate', 'print_title', 'print_line', 'fmt_col_to_date',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
from __future__ import annotations
|
|
3
|
-
from
|
|
3
|
+
from sheet_stream import ArrayString, contains, find_index, find_all_index
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class FindText(object):
|
|
@@ -46,5 +46,20 @@ class FindText(object):
|
|
|
46
46
|
return self.array.find_all(text, iqual=iqual, case=case)
|
|
47
47
|
|
|
48
48
|
|
|
49
|
+
class FindStrings(object):
|
|
49
50
|
|
|
51
|
+
def __init__(self, key_words: list[str]):
|
|
52
|
+
self.key_words: list[str] = key_words
|
|
50
53
|
|
|
54
|
+
def find_all(self, values: list[str], *, iqual: bool = False, case: bool = True) -> ArrayString:
|
|
55
|
+
final_values = ArrayString([])
|
|
56
|
+
ignore_idx: list[int] = []
|
|
57
|
+
|
|
58
|
+
for txt in self.key_words:
|
|
59
|
+
all_idx: list[int] = find_all_index(txt, values, iqual=iqual, case=case)
|
|
60
|
+
if len(all_idx) > 0:
|
|
61
|
+
for i in all_idx:
|
|
62
|
+
if not i in ignore_idx:
|
|
63
|
+
final_values.append(values[i])
|
|
64
|
+
ignore_idx.append(i)
|
|
65
|
+
return final_values
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: convert_stream
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.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
|
|
@@ -15,6 +15,7 @@ Requires-Dist: pandas
|
|
|
15
15
|
Requires-Dist: Pillow>=11.3.0
|
|
16
16
|
Requires-Dist: opencv-python
|
|
17
17
|
Requires-Dist: requests>=2.32.4
|
|
18
|
+
Requires-Dist: sheet_stream
|
|
18
19
|
|
|
19
20
|
# Configuração instalação:
|
|
20
21
|
pip3 install -r requirements.txt
|