Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- from tkinter import scrolledtext, messagebox, simpledialog
- import threading
- from reportlab.lib.pagesizes import A4
- from reportlab.pdfgen import canvas
- from reportlab.lib.units import mm
- import textwrap
- # Função para quebrar as linhas, respeitando as quebras de linha originais
- def quebrar_linhas(texto, max_chars):
- linhas = []
- for linha in texto.splitlines():
- # Se a linha estiver vazia, respeite a quebra de linha
- if linha.strip() == "":
- linhas.append("")
- else:
- # Quebra as linhas com base no número máximo de caracteres permitidos
- 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):
- 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 # Define o número máximo de caracteres por linha (aproximado)
- # 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: # Se estiver muito baixo, cria nova página
- c.showPage()
- y_position = height - 50
- c.drawString(30, y_position, linha)
- y_position -= 15 # Move para a próxima linha
- 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
- 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)).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 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)
- # Á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()
Add Comment
Please, Sign In to add comment