-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.py
211 lines (171 loc) · 9.91 KB
/
script.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
from bibliotecas import *
class PDFCreatorApp(App):
def build(self):
self.title = "Criador de PDF Personalizado"
self.logo_path = ""
self.watermark_path = ""
self.char_count = Label(text="Caracteres digitados: 0", size_hint_y=None, height=30)
layout = BoxLayout(orientation='vertical')
self.logo_label = Label(text="", size_hint_y=None, height=30)
layout.add_widget(self.logo_label)
self.watermark_label = Label(text="", size_hint_y=None, height=30)
layout.add_widget(self.watermark_label)
layout.add_widget(Label(text="Título:", size_hint_y=None, height=30))
self.title_input = TextInput(size_hint_y=None, height=30)
layout.add_widget(self.title_input)
layout.add_widget(Label(text="Texto:", size_hint_y=None, height=30))
self.text_input = TextInput()
self.text_input.bind(text=self.update_char_count)
layout.add_widget(self.text_input)
layout.add_widget(self.char_count)
self.confirmation_label = Label(text="", size_hint_y=None, height=30)
layout.add_widget(self.confirmation_label)
button_layout = BoxLayout(orientation='horizontal', size_hint_y=None, height=30)
layout.add_widget(button_layout)
logo_button = Button(text="Selecionar Logotipo", size_hint_x=0.5, size_hint_y=None, height=30)
logo_button.bind(on_release=self.select_logo)
button_layout.add_widget(logo_button)
watermark_button = Button(text="Selecionar Marca d'água", size_hint_x=0.5, size_hint_y=None, height=30)
watermark_button.bind(on_release=self.select_watermark)
button_layout.add_widget(watermark_button)
create_button = Button(text="Criar PDF", size_hint_x=0.5, size_hint_y=None, height=30)
create_button.bind(on_release=self.create_pdf)
button_layout.add_widget(create_button)
return layout
def update_char_count(self, instance, value):
self.char_count.text = f"Caracteres digitados: {len(value)}"
def create_pdf(self, instance):
# Verificar se o logotipo foi selecionado e se o texto foi escrito
if not self.logo_path or not self.text_input.text:
self.confirmation_label.text = "Por favor, selecione um logotipo e escreva algum texto antes de criar o PDF."
self.confirmation_label.color = (1, 0, 0, 1) # Cor do texto alterada para vermelho
return
# Obter o título e o texto do input
title = self.title_input.text
text_lines = self.text_input.text.split('\n')
# Limitar cada linha a caracteres
text_lines = [textwrap.fill(line, 64) for line in text_lines]
text_lines = '\n'.join(text_lines).split('\n')
# Criar um objeto canvas para desenhar no PDF
c = canvas.Canvas("seu_pdf_personalizado.pdf", pagesize=letter)
# Definir as dimensões da página
page_width, page_height = c._pagesize
# Variável para controlar a numeração das páginas
page_num = 1
# Variável para limitar a quantidade de linhas por página
lines_per_page = 34 # Altere este valor conforme necessário
lines_count = 0
# Função para converter número da página para hexadecimal
def to_hex(num):
return hex(num)[2:].upper()
# Função para adicionar cabeçalho, rodapé e numeração de página
def add_header_footer(canvas, page_num, frame_width, page_width, page_height):
# Adicionar data e hora no rodapé do quadro
now = datetime.now()
date_time_string = now.strftime("%d/%m/%Y %H:%M:%S")
canvas.setFont("Helvetica", 10) # Definir o tamanho da fonte para 10
canvas.setFillColor('black') # Definir a cor do texto para preto
canvas.drawString(frame_width + 10, 20, f"{date_time_string}")
# Numeração de páginas em hexadecimal
canvas.drawString(page_width - frame_width + 10, 20, f"Página {to_hex(page_num)}")
# Adicionar o logotipo no canto esquerdo com fundo cinza
logo_area_width = page_width * 0.2
c.setFillColor('grey')
c.rect(0, 0, logo_area_width, page_height, fill=1)
c.drawImage(self.logo_path, 10, page_height - 100 - 10, width=100, height=100)
# Desenhar um quadro estilizado que ocupa 80% da largura da página
frame_width = page_width * 0.8
frame_height = page_height
c.setStrokeColor('black') # Definir a cor da linha para preto
c.setFillColor('white') # Definir a cor de preenchimento para branco
c.rect(logo_area_width, 0, frame_width, frame_height, fill=1)
# Adicionar a marca d'água no centro da página
if self.watermark_path:
try:
# Abra a imagem da marca d'água com a biblioteca PIL
watermark = PilImage.open(self.watermark_path)
# Converta a imagem para o modo RGBA para suportar transparência
watermark = watermark.convert("RGBA")
# Crie uma nova imagem preenchida com branco
white_layer = PilImage.new('RGBA', watermark.size, (255,255,255,255))
# Preencha o canal alfa da imagem da marca d'água com branco
alpha = watermark.split()[3]
watermark.putalpha(alpha)
# Misture a imagem da marca d'água e a camada branca
watermark = PilImage.blend(white_layer, watermark, alpha=0.5)
# Salve a nova imagem da marca d'água
watermark.save("watermark_transparent.png", "PNG")
# Adicione a nova imagem da marca d'água ao PDF
c.drawImage("watermark_transparent.png", page_width / 2, page_height / 2, width=100, height=100)
except Exception as e:
print(f"Erro ao criar a marca d'água: {str(e)}")
# Adicionar o título em negrito e alinhado com o texto dentro do quadro
c.setFont("Helvetica-Bold", 12)
c.setFillColor('black') # Definir a cor do texto para preto
c.drawString(logo_area_width + 10, 720, title)
# Iniciar a posição y para o texto abaixo do título
y_position = 700
# Adicionar o texto linha por linha dentro do quadro
c.setFont("Helvetica", 10)
c.setFillColor('black') # Definir a cor do texto para preto
for line in text_lines:
if lines_count >= lines_per_page: # Verificar se é necessário criar uma nova página
add_header_footer(c, page_num, frame_width, page_width, page_height)
c.showPage()
c.setStrokeColor('black')
c.setFillColor('white')
c.rect(logo_area_width, 0, frame_width, frame_height, fill=1)
c.setFillColor('grey')
c.rect(0, 0, logo_area_width, page_height, fill=1)
c.drawImage(self.logo_path, 10, page_height - 100 - 10, width=100, height=100)
y_position = 720
page_num += 1
lines_count = 0
add_header_footer(c, page_num, frame_width, page_width, page_height) # Adicionar cabeçalho e rodapé na nova página
c.drawString(logo_area_width + 10, y_position, line)
y_position -= 20
lines_count += 1
# Salvar o PDF
c.save()
# Verificar se o PDF foi criado com sucesso
if os.path.exists("seu_pdf_personalizado.pdf"):
self.confirmation_label.text = "PDF criado com sucesso!"
self.confirmation_label.color = (0, 1, 0, 1) # Cor do texto alterada para verde
else:
self.confirmation_label.text = "Erro ao criar o PDF. Por favor, tente novamente."
self.confirmation_label.color = (1, 0, 0, 1) # Cor do texto alterada para vermelho
# Eliminar a imagem da marca d'água após sua conversão e inserção no PDF
if os.path.exists("watermark_transparent.png"):
os.remove("watermark_transparent.png")
def select_logo(self, instance):
filechooser = FileChooserIconView()
select_button = Button(text="Selecionar", size_hint_y=None, height=30)
select_button.bind(on_release=lambda x: self.update_logo_path(filechooser.selection, x))
popup_content = BoxLayout(orientation='vertical')
popup_content.add_widget(filechooser)
popup_content.add_widget(select_button)
self.popup = Popup(title="Selecione um arquivo", content=popup_content, size_hint=(0.9, 0.9))
self.popup.open()
def select_watermark(self, instance):
filechooser = FileChooserIconView()
select_button = Button(text="Selecionar", size_hint_y=None, height=30)
select_button.bind(on_release=lambda x: self.update_watermark_path(filechooser.selection, x))
popup_content = BoxLayout(orientation='vertical')
popup_content.add_widget(filechooser)
popup_content.add_widget(select_button)
self.popup = Popup(title="Selecione um arquivo", content=popup_content, size_hint=(0.9, 0.9))
self.popup.open()
def update_logo_path(self, selection, instance):
if selection:
self.logo_path = selection[0]
self.logo_label.text = f"Logotipo selecionado: {self.logo_path}"
else:
self.logo_label.text = "Nenhum logotipo selecionado"
self.popup.dismiss() # Fechar o popup
def update_watermark_path(self, selection, instance):
if selection:
self.watermark_path = selection[0]
self.watermark_label.text = f"Marca d'água selecionada: {self.watermark_path}"
else:
self.watermark_label.text = "Nenhuma marca d'água selecionada"
self.popup.dismiss() # Fechar o popup