Ir ao conteúdo

Python PDF saindo em branco


Ir à solução Resolvido por Kamuri,

Posts recomendados

Postado

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(".\\")

 

Postado

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
Postado

@Kamuri tentei como o sr disse, mas ainda está saindo branco, vou dar uma lida na PyPDF2. obrigado ♥

edit: A pypdf2 não veem com uma função de criar pdf, apenas algumas funções como ler, mesclar, editar.

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

@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
  • 2 semanas depois...
Postado

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

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!