Advertisement
MizunoBrasil

Gerador de PDF

Sep 4th, 2024
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.61 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import scrolledtext, messagebox, simpledialog
  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.  
  9. # Função para quebrar as linhas, respeitando as quebras de linha originais
  10. def quebrar_linhas(texto, max_chars):
  11.     linhas = []
  12.     for linha in texto.splitlines():
  13.         # Se a linha estiver vazia, respeite a quebra de linha
  14.         if linha.strip() == "":
  15.             linhas.append("")
  16.         else:
  17.             # Quebra as linhas com base no número máximo de caracteres permitidos
  18.             wrapped_lines = textwrap.wrap(linha, width=max_chars)
  19.             linhas.extend(wrapped_lines)
  20.     return linhas
  21.  
  22. # Função para gerar o PDF
  23. def gerar_pdf(texto, nome_arquivo):
  24.     try:
  25.         if not nome_arquivo.endswith(".pdf"):
  26.             nome_arquivo += ".pdf"
  27.         c = canvas.Canvas(nome_arquivo, pagesize=A4)
  28.         width, height = A4
  29.         y_position = height - 50
  30.         max_chars = 85  # Define o número máximo de caracteres por linha (aproximado)
  31.  
  32.         # Quebra as linhas sem cortar palavras e preserva as quebras de linha
  33.         linhas_quebradas = quebrar_linhas(texto, max_chars)
  34.  
  35.         # Desenha cada linha no PDF
  36.         for linha in linhas_quebradas:
  37.             if y_position < 50:  # Se estiver muito baixo, cria nova página
  38.                 c.showPage()
  39.                 y_position = height - 50
  40.  
  41.             c.drawString(30, y_position, linha)
  42.             y_position -= 15  # Move para a próxima linha
  43.  
  44.         c.save()
  45.         messagebox.showinfo("Sucesso", f"PDF '{nome_arquivo}' gerado com sucesso!")
  46.     except Exception as e:
  47.         messagebox.showerror("Erro", f"Erro ao gerar PDF: {e}")
  48.  
  49. # Função para executar em uma thread separada
  50. def thread_gerar_pdf():
  51.     texto = text_area.get("1.0", tk.END).strip()
  52.     if not texto:
  53.         messagebox.showwarning("Atenção", "A área de texto está vazia!")
  54.         return
  55.     nome_arquivo = simpledialog.askstring("Nome do arquivo", "Informe o nome do arquivo PDF:")
  56.     if nome_arquivo:
  57.         threading.Thread(target=gerar_pdf, args=(texto, nome_arquivo)).start()
  58.  
  59. # Função para centralizar a janela na tela
  60. def centralizar_janela(root, largura, altura):
  61.     largura_tela = root.winfo_screenwidth()
  62.     altura_tela = root.winfo_screenheight()
  63.     x = (largura_tela // 2) - (largura // 2)
  64.     y = (altura_tela // 2) - (altura // 2)
  65.     root.geometry(f"{largura}x{altura}+{x}+{y}")
  66.  
  67. # Função para o menu de contexto (copiar/colar)
  68. def criar_menu_contexto(widget):
  69.     menu_contexto = tk.Menu(widget, tearoff=0)
  70.     menu_contexto.add_command(label="Copiar", command=lambda: widget.event_generate("<<Copy>>"))
  71.     menu_contexto.add_command(label="Colar", command=lambda: widget.event_generate("<<Paste>>"))
  72.  
  73.     def mostrar_menu(event):
  74.         menu_contexto.tk_popup(event.x_root, event.y_root)
  75.  
  76.     widget.bind("<Button-3>", mostrar_menu)
  77.  
  78. # Configuração da janela principal
  79. root = tk.Tk()
  80. root.title("Gerador de PDF")
  81.  
  82. # Dimensões maiores para a janela
  83. largura_janela = 600
  84. altura_janela = 400
  85. centralizar_janela(root, largura_janela, altura_janela)
  86.  
  87. # Área de texto maior para o usuário inserir conteúdo
  88. text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=70, height=15)
  89. text_area.pack(pady=20)
  90.  
  91. # Adicionando menu de contexto (Copiar/Colar)
  92. criar_menu_contexto(text_area)
  93.  
  94. # Botão para gerar o PDF
  95. btn_gerar_pdf = tk.Button(root, text="Gerar PDF", command=thread_gerar_pdf)
  96. btn_gerar_pdf.pack(pady=10)
  97.  
  98. # Iniciando o loop da interface
  99. root.mainloop()
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement