reporte con reportlab diseño

619 views
Skip to first unread message

Cesar Gonzalo Chayle

unread,
Apr 4, 2017, 10:33:08 AM4/4/17
to web2py-usuarios
Consulta: necesito un ejemplo para realizar un reporte, que contenta el diseño de la tabla y que este se llene con los datos de una consulta
a una tabla de la base de datos. si se le puede agregar un titutlo y la condicion de la consulta mucho mejor, pero me conformo con la tabla. 
Si puede imprimirse en horizontal mucho mejor.. desde ya muchas Gracias por sus tiempos.

Carlos Cesar Caballero Díaz

unread,
Apr 4, 2017, 11:01:39 AM4/4/17
to web2py-...@googlegroups.com

Hola, nunca he usado reportlab directamente, he usado weasyprint o xhtml2pdf los cuales permiten crear los pdf usando html y css, pudiendo usar así el mismo sistema de plantillas de web2py para generar los pdf. Es una alternativa que me ha dado muy buenos resultados.

Saludos.


El 04/04/17 a las 10:09, Cesar Gonzalo Chayle escribió:
Consulta: necesito un ejemplo para realizar un reporte, que contenta el diseño de la tabla y que este se llene con los datos de una consulta
a una tabla de la base de datos. si se le puede agregar un titutlo y la condicion de la consulta mucho mejor, pero me conformo con la tabla. 
Si puede imprimirse en horizontal mucho mejor.. desde ya muchas Gracias por sus tiempos.
--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Para acceder a más opciones, visita MailScanner ha detectado un intento de fraude en la siguiente página web "groups.google.com". No confíe en esta página web: MailScanner ha detectado un intento de fraude en la siguiente p�gina web "groups.google.com". No conf�e en esta p�gina web: https://groups.google.com/d/optout.

samuel bonill

unread,
Apr 4, 2017, 12:38:53 PM4/4/17
to web2py-...@googlegroups.com
Hice una aplicacion para una clinica que imprimia pdf con reporlab esto te puede servir, te paso ejemplo de como lo hice ya que el codigo no es comprometedor, en este caso no guardamos el pdf en el servidor si no que lo generamos  :

@auth.requires_login()
def pdf():
    parametro = request.args(0)
    inventario = db.inventario(parametro) or redirect(URL("default", "index"))
    hoja = db.hoja_de_vida(db.hoja_de_vida.inventario_id == inventario.id)
    
    from io import BytesIO
    from reportlab.pdfgen import canvas
    from reportlab.lib import colors
    from reportlab.lib.pagesizes import letter
    from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
    from gluon.contrib.pyfpdf import FPDF, HTMLMixin

    
    # Usando repolab
    response.headers['Content-Type'] = 'application/pdf'
    buffer = BytesIO()
    pdf = canvas.Canvas(buffer)
    #adjuntamos imagen al pdf
    archivo_imagen = "http://midominio.com"+URL('default', 'download', args=hoja.inventario_id.cliente.imagen)
    pdf.drawImage(archivo_imagen, 70, 700, 420, 100,preserveAspectRatio=True)
    pdf.setFont("Helvetica", 16)
    #Dibujamos una cadena en la ubicación X,Y especificada
    #pdf.setFont("Helvetica", 17)
    pdf.drawString(130, 670, u"Titulo Del Pdf")
    #Creamos una tupla de encabezados para neustra tabla
    encabezados = ('EQUIPO', 'DESCRIPCION')
    #Creamos una lista de tuplas que van a contener a las personas
    linea = unicode("Ñantña tío".decode('utf-8'))
    detalles = [
        # Equipo             Descripción
        ('NOMBRE', hoja.inventario_id.equipo_nombre),
        ('MARCA', hoja.inventario_id.marca),
        ('MODELO', hoja.inventario_id.modelo),
        ('SERIE', hoja.inventario_id.serie),
        ('N° INVENTARIO', hoja.inventario_id.numero_inventario),
        ('AREA', hoja.inventario_id.area),
        ('FABRICANTE', hoja.fabricante),
        ('MANUAL DE USUARIO', hoja.manual_usuario),
        ('MANUAL DE SERVICIO', hoja.manual_servicio),
        ('FORMA ADQUISICION', hoja.forma),
        ('FECHA DE ADQUISICION', hoja.fecha_adquisicion)
    ]
    y = 420
    #Establecemos el tamaño de cada una de las columnas de la tabla
    detalle_orden = Table([encabezados] + detalles, colWidths=[150, 200])
    #Aplicamos estilos a las celdas de la tabla
    detalle_orden.setStyle(TableStyle(
        [
            #La primera fila(encabezados) va a estar centrada
            ('ALIGN',(0,0),(1,0),'CENTER'),
            ('BACKGROUND',(0,0),(1,0),colors.green),
            #Los bordes de todas las celdas serán de color negro y con un grosor de 1
            ('GRID', (0, 0), (-1, -1), 1, colors.black), 
            #El tamaño de las letras de cada una de las celdas será de 10
            ('FONTSIZE', (0, 0), (-1, -1), 10),
        ]
    ))
    #Establecemos el tamaño de la hoja que ocupará la tabla 
    detalle_orden.wrapOn(pdf, 800, 600)
    #Definimos la coordenada donde se dibujará la tabla
    detalle_orden.drawOn(pdf, 40,y)
    pdf.showPage()
    pdf.save()
    pdf = buffer.getvalue()
    buffer.close()
    return pdf

--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuarios+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

samuel bonill

unread,
Apr 4, 2017, 12:45:49 PM4/4/17
to web2py-...@googlegroups.com

El 4 de abril de 2017, 10:01, Carlos Cesar Caballero Díaz <carlos.c...@cfg.jovenclub.cu> escribió:

Hola, nunca he usado reportlab directamente, he usado weasyprint o xhtml2pdf los cuales permiten crear los pdf usando html y css, pudiendo usar así el mismo sistema de plantillas de web2py para generar los pdf. Es una alternativa que me ha dado muy buenos resultados.

Saludos.


El 04/04/17 a las 10:09, Cesar Gonzalo Chayle escribió:
Consulta: necesito un ejemplo para realizar un reporte, que contenta el diseño de la tabla y que este se llene con los datos de una consulta
a una tabla de la base de datos. si se le puede agregar un titutlo y la condicion de la consulta mucho mejor, pero me conformo con la tabla. 
Si puede imprimirse en horizontal mucho mejor.. desde ya muchas Gracias por sus tiempos.
--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuarios+unsubscribe@googlegroups.com.

--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuarios+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

nicolás rosbaco

unread,
Apr 4, 2017, 1:24:04 PM4/4/17
to web2py-...@googlegroups.com
(me colé)
excelente contribución!!!
GRACIAS



Reply all
Reply to author
Forward
0 new messages