-
-
Save soncco/f0907a4b1fdc4f5a7635 to your computer and use it in GitHub Desktop.
Printable double page
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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