Cómo hacer etiquetas en PDF con Zope
Esta receta es un ejemplo básico de cómo sacar etiquetas en formato PDF con Zope. El texto que mostramos en la etiqueta es parametrizable, por supuesto.
Antes de nada, debemos instalarnos ReportLab (http://www.reportlab.com/).
Necesitamos dos 'DTML Methods' y un 'External Method'.
1. Nuestro primer 'DTML Method' es un formulario con un campito de texto:
<html>
<body>
<form action="<dtml-var expr="BASE2 + '/hacerPdf'">">
<br>Escribe tu nombre:
<input type="text" name="nombre"> <br>
<input type="submit" name="enviar" value="Prueba">
</form>
</body>
</html>
Yo lo he llamado index_html para que sea lo primero que veamos.
2. Tenemos otro 'DTML Method' llamado 'hacerPdf', que hace de formulario respuesta e invoca al 'External Method':
<dtml-if expr="not REQUEST.has_key('enviar') or not REQUEST.has_key('nombre')">
<dtml-var index_html>
<dtml-else>
<dtml-if expr="REQUEST.nombre == ''">
<dtml-var index_html>
<dtml-else>
<dtml-call "RESPONSE.setHeader('content-type','application/pdf')">
<dtml-call "RESPONSE.setHeader('Content-Disposition','inline;filename=somefile.pdf')">
<dtml-var expr="test_reportlab(REQUEST.nombre)">
</dtml-if>
</dtml-if>
3. Finalmente, tenemos el 'External Method' que es el que hace todo el trabajo. El código que sigue es un borrador. Sólo sirve de ejemplo:
# External Method 'test_reporlab'
import os
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import *
def generate_pdf_stream(canv, file):
"""
canv: un objeto canvas
file: un nombre de archivo"""
canv.showPage()
canv.save()
fp = open(file, 'rb')
y = fp.read()
fp.close()
os.remove(file)
return y
def write_label(canv, coor, user_string):
"""
canv: un objeto canvas
coor: una tupla con coordenadas (x, y)
"""
canv.drawString(coor[0]+10, coor[1]+5, user_string)
def main(user_string):
pdf_file_name = 'test.pdf'
my_canvas = canvas.Canvas(pdf_file_name, pagesize=A4)
my_canvas.setFont("Helvetica", 10)
paper_size = A4[0], A4[1]
rows = 10
cols = 3
label_size = paper_size[0]/cols, paper_size[1]/rows
for x in range(0, cols):
for y in range(0, rows):
coordinates = x*label_size[0], y*label_size[1]
write_label(my_canvas, coordinates, user_string)
return generate_pdf_stream(my_canvas, pdf_file_name)
if __name__ == '__main__':
main("Probando ...")