Skip to content

Instantly share code, notes, and snippets.

@soncco
Created March 14, 2015 00:04
Show Gist options
  • Save soncco/f0907a4b1fdc4f5a7635 to your computer and use it in GitHub Desktop.
Save soncco/f0907a4b1fdc4f5a7635 to your computer and use it in GitHub Desktop.
Printable double page
# -*- coding: utf-8 -*-
from functools import partial
import datetime
from reportlab.lib.pagesizes import letter, A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, TableStyle, Image, Spacer
from reportlab.platypus import PageTemplate, BaseDocTemplate, NextPageTemplate, PageBreak, Frame
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_RIGHT, TA_LEFT
from reportlab.lib.units import inch, mm, cm
from reportlab.lib import colors
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from django.contrib.auth.models import User
from django.conf import settings
from ..numword.numword_es import cardinal
from ..estilos import *
from base.utils import nombre_municipalidad, traer_opcion
from cotizaciones.utils import tipo_orden
class ImpresionTest:
def __init__(self, buffer, pagesize):
self.buffer = buffer
if pagesize == 'A4':
self.pagesize = A4
elif pagesize == 'Letter':
self.pagesize = letter
self.width, self.height = self.pagesize44
@staticmethod
def emptyLayout(canvas, doc):
canvas.saveState()
header = Paragraph(traer_opcion('tipo_entidad'), h2_simple())
w, h = header.wrap(doc.width, doc.topMargin)
header.drawOn(canvas, doc.leftMargin + 1 * cm, doc.height + 1 * cm)
canvas.restoreState()
@staticmethod
def _header_footer_solicitud(canvas, doc, solicitud):
canvas.saveState()
logo = settings.MEDIA_ROOT + '/img/peru.jpg'
canvas.drawImage(logo, doc.leftMargin + 1 * cm, doc.height + 1 * cm, width = (2.3 * cm), height = (2.3 * cm))
# Cabecera
header = Paragraph(traer_opcion('tipo_entidad'), h2_simple())
w, h = header.wrap(doc.width, doc.topMargin)
header.drawOn(canvas, doc.leftMargin + 2.5 * cm, doc.height + doc.topMargin + 125 + h * 3)
header = Paragraph(traer_opcion('entidad').upper(), h1_simple())
w, h = header.wrap(doc.width, doc.topMargin)
header.drawOn(canvas, doc.leftMargin + 2.5 * cm, doc.height + doc.topMargin + 125 + h * 2)
# Footer
footer = Paragraph(cadenas('_', 120), normal_pequeno_centrado())
w, h = footer.wrap(doc.width, doc.bottomMargin)
footer.drawOn(canvas, doc.leftMargin, h + 180)
footer = Paragraph(u'INDICAR LAS SIGUIENTES CARACTERISTICAS: MEDIDA, COLOR, MARCA, INCLUIR I.G.V EN EL PRECIO Y CUALQUIER DETALLE ADICIONAL', normal_pequeno())
w, h = footer.wrap(doc.width, doc.bottomMargin)
footer.drawOn(canvas, doc.leftMargin, h + 158)
cherri = Paragraph('abastecimiento.pe', abastecimiento())
w, h = cherri.wrap(doc.width, doc.bottomMargin)
cherri.drawOn(canvas, doc.leftMargin, h - 1)
def print_solicitud(self, solicitud):
buffer = self.buffer
#doc = SimpleDocTemplate(buffer, pagesize = self.pagesize, topMargin = 155, leftMargin = 20, rightMargin = 20, bottomMargin = 200)
pHeight, pWidth = self.pagesize
myFrame = Frame(0, 0, pHeight, pWidth, id='myFrame')
headerFooterTemplate = PageTemplate(id='headerFooterTemplate',
frames=[myFrame],
onPage=partial(self._header_footer_solicitud, solicitud = solicitud))
emptyTemplate = PageTemplate(id='emptyTemplate',
frames=[myFrame],
onPage=self.emptyLayout)
elements = []
if tipo_orden(solicitud) == 'compra':
detalles_data = [
[u'ARTÍCULOS', '', '', '', 'PRECIO', ''],
['Cant.', 'Und', u'Descripción', 'Marca', 'Unitario', 'Total'],
]
else:
detalles_data = [
[u'SERVICIOS', '', '', 'PRECIO', ''],
['Cant.', 'Und', u'Descripción', 'Unitario', 'Total'],
]
for detalle in solicitud.solicitudcotizaciondetalle_set.all():
cantidad = "%.2f" % detalle.cantidad
producto = Paragraph(detalle.producto.descripcion, normal_pequeno())
unidad_medida = Paragraph(detalle.unidad_medida.abreviatura, normal_pequeno_centrado())
if tipo_orden(solicitud) == 'compra':
detalles_data.append([
cantidad, unidad_medida, producto, '', '', ''
])
else:
detalles_data.append([
cantidad, unidad_medida, producto, '', ''
])
if tipo_orden(solicitud) == 'compra':
detalles_data.append(
['', '', Paragraph(solicitud.glosa_solicitud, normal()), '', 'Total S/.', '']
)
estilo = tabla_solicitud_estilo_compra()
widths = [2 * cm, 2 * cm, 8 * cm, 3 * cm, 2 * cm, None]
else:
detalles_data.append(
['', '', Paragraph(solicitud.glosa_solicitud, normal()), 'Total S/.', '']
)
estilo = tabla_solicitud_estilo_servicio()
widths = [2 * cm, 2 * cm, 11 * cm, 2 * cm]
detalles_tabla = Table(detalles_data, colWidths = widths, style = estilo,
repeatRows = 1)
elements.append(detalles_tabla)
elements.append(NextPageTemplate('emptyTemplate'))
elements.append(PageBreak())
p = Paragraph(u'Hola estoy en la otra página', normal())
elements.append(p)
#doc.build(elements, onFirstPage = partial(self._header_footer_solicitud, solicitud = solicitud),
# onLaterPages = partial(self._header_footer_solicitud, solicitud = solicitud), canvasmaker = NumberedCanvas)
doc = BaseDocTemplate(buffer, rightMargin=72, leftMargin=72, topMargin=100, bottomMargin=72)
doc.addPageTemplates([headerFooterTemplate, emptyTemplate])
doc.build(elements)
pdf = buffer.getvalue()
buffer.close()
return pdf
class NumberedCanvas(canvas.Canvas):
def __init__(self, *args, **kwargs):
canvas.Canvas.__init__(self, *args, **kwargs)
self._saved_page_states = []
def showPage(self):
self._saved_page_states.append(dict(self.__dict__))
self._startPage()
def save(self):
"""add page info to each page (page x of y)"""
num_pages = len(self._saved_page_states)
for state in self._saved_page_states:
self.__dict__.update(state)
self.draw_page_number(num_pages)
canvas.Canvas.showPage(self)
canvas.Canvas.save(self)
def draw_page_number(self, page_count):
# Change the position of this to wherever you want the page number to be
self.setFont('Helvetica', 9)
self.drawRightString(200 * mm, 288 * mm,
u"Página %d de %d" % (self._pageNumber, page_count))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment