Ir ao conteúdo
  • Cadastre-se

Python PDF saindo em branco


Ir à solução Resolvido por Kamuri,

Posts recomendados

Alguém pode me dizer onde eu errei nisso? tenho zero experiência com criação de pdf.

Contexto: Preciso passar uma centena de logs para PDF, eles estão tratados, são no formato landscape e devem ser no tamanho A2 (não achei nenhuma biblioteca com A2)

from fpdf import FPDF
import os

def create_pdf_from_txt(folder_path):
    arquivos = [os.path.join(folder_path, nome) for nome in os.listdir(folder_path)]
    arquivos = sorted([x for x in arquivos if "para_pdf" in x])
    pdf = FPDF(orientation="landscape",unit="in",format="A3")
    for arquivo in arquivos:
        with open(arquivo, "r") as f:
            texto = "".join(f.readlines())
        pdf.add_page()
        pdf.set_font(family="Arial",style="B",size=10)
        pdf.multi_cell(10,10,texto,border=True)
        pdf.output(arquivo[:-4] + ".pdf", "F")

create_pdf_from_txt(".\\")

 

Link para o comentário
Compartilhar em outros sites

Não consegui identificar o erro, sem uma amostra dos arquivos fica difícil simular o erro. Todavia, você pode testar o seguinte:

  • Use o PyPDF2 ao invés do FPDF. Tem 6 anos desde a ultima commit no FPDF, enquanto a ultima commit no PyPDF2 foi semana passada, o que mostra que o projeto está ativo e sendo constantemente melhorado.

Se não conseguir, tenta criar alguns arquivos de teste pra facilitar.
Ps: texto = "".join(f.readlines()) pode ser substituido por f.read()

Edit:

Usando uns arquivos aqui, o que consegui foi uma linha por página. O problema está na linha 14 (pdf.multi_cell(10,10,texto,border=True)). A distancia de linha para linha é muito grande. Se o arquivo tiver varias linhas em branco você vai ter muitas paginas em branco.

Tenta:

pdf.multi_cell(15, 0.2, texto, border=True)

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
  • Solução

@SwallsRealmente, o PyPDF2 é melhor pra editar PDF, pra criar você precisa de conhecimento prévio de como PDFs funcionam. Você pode tentar usar o reportlab, outro modulo pra criação de PDF, tipo:

 

import os
from reportlab.lib.pagesizes import A2
from reportlab.pdfgen import canvas

def convert_to_pdf(folder_path):
    arquivos = [os.path.join(folder_path, nome) for nome in os.listdir(folder_path)]
    arquivos = sorted([x for x in arquivos if "para_pdf" in x])
    for arquivo in arquivos:
        output_name = arquivo[:-4] + ".pdf"
        pdf_path = os.path.join(folder_path, output_name)
        c = canvas.Canvas(pdf_path, pagesize=A2)

        with open(os.path.join(folder_path, arquivo), 'r', encoding='utf-8') as file:
            content = file.read()

        c.setFont("Helvetica", 12)
        lines = content.splitlines()
        y = 750
        for line in lines:
            c.drawString(30, y, line)
            y -= 20
        c.showPage()
        c.save()
        print(f"PDF file saved at {pdf_path}")


convert_to_pdf(".")

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

opa, voltei para fechar o tópico, terminei o código, usei como base o do mestre kamuri.
tinha alguns erros que concertei:

  • escrevendo na metade da página.
  • sem quebra de página.
  • linha pela metade.
  • fonte impropria para impressão
  • etc..
from os import listdir as listar
from os.path import join as juntar

from reportlab.pdfgen import canvas


def convert_to_pdf(folder_path):
    arquivos = [juntar(folder_path, nome) for nome in listar(folder_path)]
    arquivos = sorted([x for x in arquivos if "para_pdf" in x])
    for arquivo in arquivos:
        output_name = arquivo[:-4] + ".pdf"
        pdf_path = juntar(folder_path, output_name)
        with open(juntar(folder_path, arquivo), 'r', encoding='utf-8') as file:
            content = file.read()
        lines = content.splitlines()
        y_size = 1190
        c = canvas.Canvas(pdf_path, pagesize=(1800, y_size))  # landscape
        c.setFont("Courier", 12)
        for line in lines:
            y_size -= 20
            c.drawString(30, y_size, line)
            if "padrão para sua quebra de página" in line:
                c.showPage()    
                y_size = 1190
                c.setFont("Courier", 12)
        c.save()
        print(f"O PDF foi salvo em {pdf_path}")


convert_to_pdf(".")

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!