En este ejemplo veremos el uso de la clase Flowable, en la que heredaremos sus atributos y crear nosotros nuestros propios dibujos con canvas:
#-*- coding:utf-8 -*-
import os
#Librerias reportlab a usar:
from reportlab.platypus import (BaseDocTemplate, PageTemplate,
NextPageTemplate, PageBreak, Frame, FrameBreak, Flowable, Paragraph,
Image, Spacer)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.units import inch
#CREAMOS EL DOCTEMPLATE
#======================
doc = BaseDocTemplate('test.pdf', pagesize=A4) #landscape(A4) para Horizontal
#CREAMOS LOS CANVAS
#==================
def encabezado(canvas,doc):
canvas.saveState()
canvas.setFont('Times-Roman', 9)
canvas.drawString(inch, A4[1] - 50, "Ejemplo de DocTemplate y PageTemplate")
canvas.line(inch, A4[1] - 60, A4[0] - 65, A4[1] - 60)
canvas.restoreState()
def piePagina(canvas,doc):
canvas.saveState()
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "Página %d" % doc.page)
canvas.restoreState()
#Creamos nuestro flowable. Se tiene que tener al menos un método wrap y draw
class Rectangulo(Flowable):
def __init__(self, ancho=206, alto=100):
self.ancho = ancho
self.alto = alto
def wrap(self, *args):
"""Provee el tamaño del área de dibujo"""
return (self.ancho, self.alto)
def draw(self):
canvas = self.canv # El atributo que permite dibujar en canvas
canvas.saveState()
canvas.setLineWidth(1)
canvas.rect(0, 0, self.ancho, self.alto, fill=0)
canvas.restoreState()
#Modifiquemos un flowable existente
class RotarImagen(Image):
def wrap(self, availWidth, availHeight):
self.w, self.h = Image.wrap(self, availWidth, availHeight)
return self.w, self.h
def draw(self):
self.canv.translate(0,self.h)
self.canv.rotate(-90)
Image.draw(self)
#CREAMOS LOS FRAMES
#==================
#Frame (x1, y1, ancho, alto, leftPadding=6, bottomPadding=6, rightPadding=6,
#topPadding=6, id=None, showBoundary=0)
frame0 = Frame(doc.leftMargin, doc.bottomMargin,
doc.width, doc.height, showBoundary=1, id='normalBorde')
frame1 = Frame(doc.leftMargin, doc.bottomMargin,
doc.width, doc.height / 2, id='capitulo')
frame2 = Frame(doc.leftMargin, doc.bottomMargin,
doc.width /2 - 6, doc.height, id='col1')
frame3 = Frame(doc.leftMargin + doc.width / 2 + 6, doc.bottomMargin,
doc.width / 2 - 6, doc.height, id='col2')
#CREAMOS LOS PAGETEMPLATE
#========================
#PageTemplate(id=None,frames=[],onPage=_doNothing,onPageEnd=_doNothing)
doc.addPageTemplates([
PageTemplate(id='caratula', frames=frame0),
PageTemplate(id='capitulos', frames=frame1),
PageTemplate(id='contenido', frames=[frame2, frame3],
onPage = encabezado, onPageEnd=piePagina),
])
#CREAMOS LOS FLOWABLES
#=====================
#Creamos la hoja de Estilo
estilo=getSampleStyleSheet()
estilo.add(ParagraphStyle(name = "Titulo", alignment=TA_CENTER, fontSize=20,
fontName="Helvetica-BoldOblique"))
#Iniciamos el platypus story
story=[]
#Creamos la carátula:
story.append(Spacer(0,200))
story.append(Image("Tux2.png", width=150, height=200))
story.append(Spacer(0,20))
titulo = Paragraph("Ejemplo PageTemplate-DocTemplate", estilo['Titulo'])
story.append(titulo)
#Creamos el contenido en general
story.append(NextPageTemplate('capitulos'))
story.append(PageBreak())
story.append(Paragraph("Capítulo I: Conociendo ReportLab", estilo['Heading1']))
story.append(NextPageTemplate('contenido'))
story.append(PageBreak())
story.append(Paragraph("Contenido del Capítulo I. " * 300, estilo['Normal']))
story.append(NextPageTemplate('capitulos'))
story.append(PageBreak())
story.append(Paragraph("Capítulo II: Sobre Platypus", estilo['Heading1']))
story.append(NextPageTemplate('contenido'))
story.append(PageBreak())
story.append(Paragraph("Contenido de la columna I ", estilo['Title']))
story.append(Paragraph("Lorem ipsum "*140, estilo['BodyText']))
story.append(FrameBreak()) #Se mueve al siguiente frame del pagetemplate
story.append(Paragraph("Contenido de la columna II", estilo['Title']))
story.append(Paragraph("Domine Sanctus "*50, estilo['BodyText']))
story.append(Paragraph("Veamos un rectángulo:", estilo['BodyText']))
story.append(Rectangulo())
story.append(Paragraph("Veamos un cuadrado:", estilo['BodyText']))
story.append(Rectangulo(50, 50))
I = RotarImagen("tuxito.png")
I.hAlign = "CENTER"
story.append(I)
#CONSTRUIMOS EL PDF
#==================
doc.build(story)
os.system("test.pdf")

cual es el formato para que la hoja del pdf sea horizontal??
ResponderEliminar# -*- coding:utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4,B4, cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
from reportlab.lib import colors
#creando tabla
width, height = B4
styles = getSampleStyleSheet()
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER
def coord(x, y, unit=1):
x, y = x * unit, height - y * unit
return x, y
# Headers
hdescrpcion = Paragraph('''descrpcion''', styleBH)
hpartida = Paragraph('''partida''', styleBH)
hcandidad = Paragraph('''candidad''', styleBH)
hprecio_unitario = Paragraph('''precio_unitario''', styleBH)
hprecio_total = Paragraph('''precio_total''', styleBH)
# Texts
descrpcion = Paragraph('long paragraph', styleN)
partida = Paragraph('1', styleN)
candidad = Paragraph('120', styleN)
precio_unitario = Paragraph('$52.00', styleN)
precio_total = Paragraph('$6240.00', styleN)
data= [[hdescrpcion, hcandidad,hcandidad, hprecio_unitario, hprecio_total],
[partida, candidad, descrpcion, precio_unitario, precio_total]]
table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 5 * cm,
3* cm, 3 * cm])
table.setStyle(TableStyle([
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
]))
table.wrapOn(c, width, height)
table.drawOn(c, *coord(1.8, 9.6, cm))
c.save()
como puedo colocar la pagina de mi pdf en horizontal??
ResponderEliminar# -*- coding:utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4,B4, cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
from reportlab.lib import colors
#creando tabla
width, height = B4
styles = getSampleStyleSheet()
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER
def coord(x, y, unit=1):
x, y = x * unit, height - y * unit
return x, y
# Headers
hdescrpcion = Paragraph('''descrpcion''', styleBH)
hpartida = Paragraph('''partida''', styleBH)
hcandidad = Paragraph('''candidad''', styleBH)
hprecio_unitario = Paragraph('''precio_unitario''', styleBH)
hprecio_total = Paragraph('''precio_total''', styleBH)
# Texts
descrpcion = Paragraph('long paragraph', styleN)
partida = Paragraph('1', styleN)
candidad = Paragraph('120', styleN)
precio_unitario = Paragraph('$52.00', styleN)
precio_total = Paragraph('$6240.00', styleN)
data= [[hdescrpcion, hcandidad,hcandidad, hprecio_unitario, hprecio_total],
[partida, candidad, descrpcion, precio_unitario, precio_total]]
table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 5 * cm,
3* cm, 3 * cm])
table.setStyle(TableStyle([
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
]))
table.wrapOn(c, width, height)
table.drawOn(c, *coord(1.8, 9.6, cm))
c.save()
Exte ejemplo es claro y efectivo, de como mezclar canvas con doc... recomendado
ResponderEliminar