Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- from tkinter import scrolledtext, messagebox, simpledialog, filedialog
- import threading
- from reportlab.lib.pagesizes import A4
- from reportlab.pdfgen import canvas
- from reportlab.lib.units import mm
- import textwrap
- from datetime import datetime
- from PIL import Image
- import locale
- # Definir a localidade para português do Brasil
- locale.setlocale(locale.LC_TIME, 'pt_BR.utf8')
- # Função para quebrar as linhas, respeitando as quebras de linha originais
- def quebrar_linhas(texto, max_chars):
- linhas = []
- for linha in texto.splitlines():
- if linha.strip() == "":
- linhas.append("")
- else:
- wrapped_lines = textwrap.wrap(linha, width=max_chars)
- linhas.extend(wrapped_lines)
- return linhas
- # Função para gerar o PDF
- def gerar_pdf(texto, nome_arquivo, img_path):
- try:
- if not nome_arquivo.endswith(".pdf"):
- nome_arquivo += ".pdf"
- c = canvas.Canvas(nome_arquivo, pagesize=A4)
- width, height = A4
- y_position = height - 50
- max_chars = 85
- # Quebra as linhas sem cortar palavras e preserva as quebras de linha
- linhas_quebradas = quebrar_linhas(texto, max_chars)
- # Desenha cada linha no PDF
- for linha in linhas_quebradas:
- if y_position < 50:
- c.showPage()
- y_position = height - 50
- c.drawString(30, y_position, linha)
- y_position -= 15
- # Adicionar nova página para a imagem
- if img_path:
- c.showPage()
- image = Image.open(img_path)
- image_width, image_height = image.size
- page_width, page_height = A4
- ratio = min(page_width / image_width, page_height / image_height)
- new_width = image_width * ratio
- new_height = image_height * ratio
- x_position = (page_width - new_width) / 2
- y_position_image = (page_height - new_height) / 2
- c.drawImage(img_path, x_position, y_position_image, new_width, new_height)
- c.save()
- messagebox.showinfo("Sucesso", f"PDF '{nome_arquivo}' gerado com sucesso!")
- except Exception as e:
- messagebox.showerror("Erro", f"Erro ao gerar PDF: {e}")
- # Função para executar em uma thread separada
- def thread_gerar_pdf():
- texto = text_area.get("1.0", tk.END).strip()
- if not texto:
- messagebox.showwarning("Atenção", "A área de texto está vazia!")
- return
- img_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
- if not img_path:
- messagebox.showwarning("Atenção", "Nenhuma imagem foi selecionada!")
- return
- nome_arquivo = simpledialog.askstring("Nome do arquivo", "Informe o nome do arquivo PDF:")
- if nome_arquivo:
- threading.Thread(target=gerar_pdf, args=(texto, nome_arquivo, img_path)).start()
- # Função para centralizar a janela na tela
- def centralizar_janela(root, largura, altura):
- largura_tela = root.winfo_screenwidth()
- altura_tela = root.winfo_screenheight()
- x = (largura_tela // 2) - (largura // 2)
- y = (altura_tela // 2) - (altura // 2)
- root.geometry(f"{largura}x{altura}+{x}+{y}")
- # Função para preencher o texto com o comprovante de pagamento de Jacaraípe
- def preencher_comprovante_jacaraipe():
- mes_ano = datetime.now().strftime('%B de %Y') # Mês em português agora
- comprovante_texto = f"""Pagamento de condomínio Edifício San Antônio, Jacaraípe, ES
- Apartamento 304
- Valor: R$150,34
- Mês e Ano: {mes_ano}
- Transferência realizada através de Pix na chave xxxxxxxx
- Foi informado ao síndico Valdemir através de WhatsApp que transferência foi feita."""
- text_area.delete("1.0", tk.END) # Limpa o texto existente
- text_area.insert(tk.END, comprovante_texto) # Insere o novo texto
- # Função para o menu de contexto (copiar/colar)
- def criar_menu_contexto(widget):
- menu_contexto = tk.Menu(widget, tearoff=0)
- menu_contexto.add_command(label="Copiar", command=lambda: widget.event_generate("<<Copy>>"))
- menu_contexto.add_command(label="Colar", command=lambda: widget.event_generate("<<Paste>>"))
- def mostrar_menu(event):
- menu_contexto.tk_popup(event.x_root, event.y_root)
- widget.bind("<Button-3>", mostrar_menu)
- # Configuração da janela principal
- root = tk.Tk()
- root.title("Gerador de PDF")
- # Dimensões maiores para a janela
- largura_janela = 600
- altura_janela = 400
- centralizar_janela(root, largura_janela, altura_janela)
- # Menu superior
- menu_bar = tk.Menu(root)
- arquivo_menu = tk.Menu(menu_bar, tearoff=0)
- arquivo_menu.add_command(label="Comprovante Pagto Jacaraipe", command=preencher_comprovante_jacaraipe)
- menu_bar.add_cascade(label="Arquivo", menu=arquivo_menu)
- root.config(menu=menu_bar)
- # Área de texto maior para o usuário inserir conteúdo
- text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=70, height=15)
- text_area.pack(pady=20)
- # Adicionando menu de contexto (Copiar/Colar)
- criar_menu_contexto(text_area)
- # Botão para gerar o PDF
- btn_gerar_pdf = tk.Button(root, text="Gerar PDF", command=thread_gerar_pdf)
- btn_gerar_pdf.pack(pady=10)
- # Iniciando o loop da interface
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement