Advertisement
MizunoBrasil

gera pdf com imagem

Sep 7th, 2024
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.24 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import scrolledtext, messagebox, simpledialog, filedialog
  3. import threading
  4. from reportlab.lib.pagesizes import A4
  5. from reportlab.pdfgen import canvas
  6. from reportlab.lib.units import mm
  7. import textwrap
  8. from datetime import datetime
  9. from PIL import Image
  10. import locale
  11.  
  12. # Definir a localidade para português do Brasil
  13. locale.setlocale(locale.LC_TIME, 'pt_BR.utf8')
  14.  
  15. # Função para quebrar as linhas, respeitando as quebras de linha originais
  16. def quebrar_linhas(texto, max_chars):
  17.     linhas = []
  18.     for linha in texto.splitlines():
  19.         if linha.strip() == "":
  20.             linhas.append("")
  21.         else:
  22.             wrapped_lines = textwrap.wrap(linha, width=max_chars)
  23.             linhas.extend(wrapped_lines)
  24.     return linhas
  25.  
  26. # Função para gerar o PDF
  27. def gerar_pdf(texto, nome_arquivo, img_path):
  28.     try:
  29.         if not nome_arquivo.endswith(".pdf"):
  30.             nome_arquivo += ".pdf"
  31.         c = canvas.Canvas(nome_arquivo, pagesize=A4)
  32.         width, height = A4
  33.         y_position = height - 50
  34.         max_chars = 85
  35.  
  36.         # Quebra as linhas sem cortar palavras e preserva as quebras de linha
  37.         linhas_quebradas = quebrar_linhas(texto, max_chars)
  38.  
  39.         # Desenha cada linha no PDF
  40.         for linha in linhas_quebradas:
  41.             if y_position < 50:
  42.                 c.showPage()
  43.                 y_position = height - 50
  44.             c.drawString(30, y_position, linha)
  45.             y_position -= 15
  46.  
  47.         # Adicionar nova página para a imagem
  48.         if img_path:
  49.             c.showPage()
  50.             image = Image.open(img_path)
  51.             image_width, image_height = image.size
  52.             page_width, page_height = A4
  53.             ratio = min(page_width / image_width, page_height / image_height)
  54.             new_width = image_width * ratio
  55.             new_height = image_height * ratio
  56.             x_position = (page_width - new_width) / 2
  57.             y_position_image = (page_height - new_height) / 2
  58.             c.drawImage(img_path, x_position, y_position_image, new_width, new_height)
  59.  
  60.         c.save()
  61.         messagebox.showinfo("Sucesso", f"PDF '{nome_arquivo}' gerado com sucesso!")
  62.     except Exception as e:
  63.         messagebox.showerror("Erro", f"Erro ao gerar PDF: {e}")
  64.  
  65. # Função para executar em uma thread separada
  66. def thread_gerar_pdf():
  67.     texto = text_area.get("1.0", tk.END).strip()
  68.     if not texto:
  69.         messagebox.showwarning("Atenção", "A área de texto está vazia!")
  70.         return
  71.    
  72.     img_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
  73.     if not img_path:
  74.         messagebox.showwarning("Atenção", "Nenhuma imagem foi selecionada!")
  75.         return
  76.  
  77.     nome_arquivo = simpledialog.askstring("Nome do arquivo", "Informe o nome do arquivo PDF:")
  78.     if nome_arquivo:
  79.         threading.Thread(target=gerar_pdf, args=(texto, nome_arquivo, img_path)).start()
  80.  
  81. # Função para centralizar a janela na tela
  82. def centralizar_janela(root, largura, altura):
  83.     largura_tela = root.winfo_screenwidth()
  84.     altura_tela = root.winfo_screenheight()
  85.     x = (largura_tela // 2) - (largura // 2)
  86.     y = (altura_tela // 2) - (altura // 2)
  87.     root.geometry(f"{largura}x{altura}+{x}+{y}")
  88.  
  89. # Função para preencher o texto com o comprovante de pagamento de Jacaraípe
  90. def preencher_comprovante_jacaraipe():
  91.     mes_ano = datetime.now().strftime('%B de %Y')  # Mês em português agora
  92.     comprovante_texto = f"""Pagamento de condomínio Edifício San Antônio, Jacaraípe, ES
  93.  
  94. Apartamento 304
  95.  
  96. Valor: R$150,34
  97.  
  98. Mês e Ano: {mes_ano}
  99.  
  100. Transferência realizada através de Pix na chave xxxxxxxx
  101.  
  102. Foi informado ao síndico Valdemir através de WhatsApp que transferência foi feita."""
  103.     text_area.delete("1.0", tk.END)  # Limpa o texto existente
  104.     text_area.insert(tk.END, comprovante_texto)  # Insere o novo texto
  105.  
  106. # Função para o menu de contexto (copiar/colar)
  107. def criar_menu_contexto(widget):
  108.     menu_contexto = tk.Menu(widget, tearoff=0)
  109.     menu_contexto.add_command(label="Copiar", command=lambda: widget.event_generate("<<Copy>>"))
  110.     menu_contexto.add_command(label="Colar", command=lambda: widget.event_generate("<<Paste>>"))
  111.  
  112.     def mostrar_menu(event):
  113.         menu_contexto.tk_popup(event.x_root, event.y_root)
  114.  
  115.     widget.bind("<Button-3>", mostrar_menu)
  116.  
  117. # Configuração da janela principal
  118. root = tk.Tk()
  119. root.title("Gerador de PDF")
  120.  
  121. # Dimensões maiores para a janela
  122. largura_janela = 600
  123. altura_janela = 400
  124. centralizar_janela(root, largura_janela, altura_janela)
  125.  
  126. # Menu superior
  127. menu_bar = tk.Menu(root)
  128. arquivo_menu = tk.Menu(menu_bar, tearoff=0)
  129. arquivo_menu.add_command(label="Comprovante Pagto Jacaraipe", command=preencher_comprovante_jacaraipe)
  130. menu_bar.add_cascade(label="Arquivo", menu=arquivo_menu)
  131. root.config(menu=menu_bar)
  132.  
  133. # Área de texto maior para o usuário inserir conteúdo
  134. text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=70, height=15)
  135. text_area.pack(pady=20)
  136.  
  137. # Adicionando menu de contexto (Copiar/Colar)
  138. criar_menu_contexto(text_area)
  139.  
  140. # Botão para gerar o PDF
  141. btn_gerar_pdf = tk.Button(root, text="Gerar PDF", command=thread_gerar_pdf)
  142. btn_gerar_pdf.pack(pady=10)
  143.  
  144. # Iniciando o loop da interface
  145. root.mainloop()
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement