es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La clase FPDF heredada (en python) solo obtiene la primera página de dos correctamente, la segunda queda completamente en blanco.

Estoy construyendo una clase para producir informes automáticos en PDF. (Usando FPDF) En mi clase he definido hasta ahora dos funciones. Una que renderiza la primera página (front) y otra que renderiza una segunda página (page_two). Estas dos funciones producen cada una lo que quiero. Pero cuando intento combinarlas en la función join la segunda página se vuelve completamente blanca.

No entiendo por qué. Cualquier ayuda sería muy apreciada.

“` from fpdf import FPDF

class MY_PDF(FPDF):
def <strong>init</strong>(self, <strong>kwargs):
super(MY_PDF, self).<strong>init</strong>(</strong>kwargs)

<pre><code> pdf.add_font('Arial', '', r"c:\WINDOWS\Fonts\ARIAL.ttf", uni=True)
pdf.add_font('Arial_Bold', '', r"c:\WINDOWS\Fonts\ARIALBD.ttf", uni=True)
pdf.add_font('Georgia', '', r"c:\WINDOWS\Fonts\GEORGIA.ttf", uni=True)
pdf.add_font('Calibri', '', r"c:\WINDOWS\Fonts\CALIBRI.ttf", uni=True)

WIDTH = 210
HEIGHT = 297

def front(self, title, second_title):
self.set_fill_color(0, 0, 90)
self.rect(0.5, 50, WIDTH-1, 75, 'F')
self.set_fill_color(149, 194, 61)
pdf.rect(14, 12, 5, 280, 'F')

self.set_font('Arial', 'B', 38)
self.set_text_color(255, 255, 255)
self.cell(15)
self.cell(150, 135, txt=f'{title}')

self.ln(10)
self.set_font('Arial', '', 28)
self.set_text_color(255, 255, 255)
self.cell(15)
self.cell(150, 150, txt=f'{second_title}')

#self.image('logga.png', 25, 12, 50)
self.ln()

def page_two(self, name, date, nr):
self.set_font('Arial', '', 9)
self.ln(250)
self.cell(20)
self.cell(0, 0, txt='©', align='L', ln=0)
self.cell(-160)
self.cell(0, 0, txt='Nombre de la compañía', align='L', ln=2)
self.ln(4)
self.cell(30)
self.cell(0, 0, txt=f'Autor: {name}', align='L', ln=2)
self.ln(4)
self.cell(30)
self.cell(0, 0, txt=f'Fecha: {date}', align='L', ln=2)
self.ln(4)
self.cell(30)
self.cell(0, 0, txt=f'Número: {nr}', align='L', ln=2)
self.ln()

def join(self, title, second_title, name, date, nr):
self.add_page()
self.front(title, second_title)
self.add_page()
self.page_two(name, date, nr)
</code></pre>

pdf = MY_PDF()

pdf.join('¡TÍTULO!', 'algún otro título', 'Nombre Nombre', '2021-11-30', '21262') pdf.output('output.pdf')

“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un error tipográfico en el constructor de la clase MY_PDF. Los dos guiones bajos antes y después de la palabra “init” en la línea super(MY_PDF, self)-__init__(**kwargs) deberían ser reemplazados por un solo guión bajo antes y después de la palabra “init”, como esto: super(MY_PDF, self).__init__(**kwargs).

    En cuanto al problema con la segunda página que está toda en blanco, podría deberse al hecho de que el origen del sistema de coordenadas en FPDF se encuentra en la esquina inferior izquierda de la página, por lo que cuando se agrega la segunda página con self.add_page(), se agrega justo encima de la primera página, cubriéndola efectivamente. Para solucionar esto, debe mover el contenido de la segunda página hacia abajo aumentando el coordenada y del punto de inicio para dibujarlo. Por ejemplo, podría cambiar la línea self.ln(250) en la función page_two a self.ln(200) para mover el contenido hacia abajo en 50 unidades.

    Además, debes usar el atributo inicializado self.WIDTH en la función front en lugar de la variable no definida WIDTH.

    Aquí está el código corregido:

    from fpdf import FPDF
    
    class MY_PDF(FPDF):
    
        def __init__(self, **kwargs):
            super(MY_PDF, self).__init__(**kwargs)
    
            self.add_font('Arial', '', r"c:\WINDOWS\Fonts\ARIAL.ttf", uni=True)
            self.add_font('Arial_Bold', '', r"c:\WINDOWS\Fonts\ARIALBD.ttf", uni=True)
            self.add_font('Georgia', '', r"c:\WINDOWS\Fonts\GEORGIA.ttf", uni=True)
            self.add_font('Calibri', '', r"c:\WINDOWS\Fonts\CALIBRI.ttf", uni=True)
    
            # A4.
            self.WIDTH = 210
            self.HEIGHT = 297
    
        def front(self, title, second_title):
    
            self.set_fill_color(0,0,90) 
            self.rect(0.5, 50, self.WIDTH-1, 75, 'F')
            self.set_fill_color(149,194,61) 
            self.rect(14, 12, 5, 280, 'F')
    
            self.set_font('Arial', 'B', 38)
            self.set_text_color(255, 255, 255)
            self.cell(15)
            self.cell(150, 135, txt=f'{title}')
    
            self.ln(10)
            self.set_font('Arial', '', 28)
            self.set_text_color(255, 255, 255)
            self.cell(15)
            self.cell(150, 150, txt=f'{second_title}')
    
            #self.image('logga.png', 25, 12, 50)
            self.ln()   
    
        def page_two(self, name, date, nr):
    
            self.set_font('Arial', '', 9)
            self.ln(200)  # Mover hacia abajo la página para evitar cubrir la primera página
            self.cell(20)
            self.cell(0, 0, txt="©", align='L', ln=0)
            self.cell(-160)
            self.cell(0, 0, txt='Nombre de la empresa', align='L', ln=2)
            self.ln(4)
            self.cell(30)
            self.cell(0, 0, txt=f'Autor: {name}', align='L',  ln=2)
            self.ln(4)
            self.cell(30)
            self.cell(0, 0, txt=f'Fecha: {date}', align='L', ln=2)
            self.ln(4)
            self.cell(30)
            self.cell(0, 0, txt=f'Número: {nr}', align='L',  ln=2)
            self.ln()   
    
        def join(self, title, second_title, name, date, nr):
            self.add_page()
            self.front(title, second_title)
            self.add_page()
            self.page_two(name, date, nr)
    
    pdf = MY_PDF()
    
    pdf.join('¡TÍTULO!', 'otro título', 'Nombre Apellido', '2021-11-30', '21262')
    pdf.output('output.pdf')  
    

    ¡Espero que esto ayude!

Comments are closed.