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

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