def dibujar_datos_empresa(canvas, datos_de_la_empresa): """ Dibuja los datos de la empresa en la parte superior. """ logo, empresa = build_logo_y_empresa_por_separado(datos_de_la_empresa) logo.drawOn(canvas, 1*cm, PAGE_HEIGHT - 2.8 * cm) fuente = "Helvetica" tamanno = 16 for i in range(len(empresa)): if i == 1: tamanno -= 4 # Primera línea (nombre empresa) un poco más grande. linea = PAGE_HEIGHT - 1.5 * cm el_encogedor_de_fuentes_de_doraemon(canvas, fuente, tamanno, 3.25*cm, PAGE_WIDTH - 5*cm, linea - (i*0.55*cm), escribe(empresa[i]))
def crear_etiquetas_bigbags(bigbags, mostrar_marcado=True, lang="es"): """ Construye una etiqueta por cada objeto bigbag recibido y las devuelve en un solo PDF. Si lang = "en", etiqueta en inglés. Si "es", en castellano. """ # Voy a tratar de reescribir esto regla en mano a ver si consigo # cuadrarlo bien en la etiquetadora GEMINI. alto = 12.55 * cm ancho = 8.4 * cm # Creo la hoja nomarchivo = os.path.join( gettempdir(), "etiq_bigbag13_%s_%s.pdf" % (lang, give_me_the_name_baby())) canvas = reportlabcanvas.Canvas(nomarchivo, pagesize=(ancho, alto)) # Medidas: logo = (3.8 * cm * 0.75, 2.8 * cm * 0.75) margen = 0.1 * cm marcado = (((ancho - logo[0]) / 2) - margen, (alto - margen - logo[1] - 2)) # Imágenes: logo_marcado = os.path.abspath( os.path.join(os.path.dirname(__file__), "..", "imagenes", "CE.png")) # Datos fijos: # pylint: disable=bad-continuation _data = {# "00 logo_marcado": None, "01 texto_marcado": "1035", # Fijo "02 fabricado_por": "Fabricado por: %s", "03 direccion1": None, "04 direccion2": None, "05 telefono": "Tfno: %s, %s", "06 año_certif": None, "07 blanco1": "", # Separador "08 dni": None, "09 iso1": "EN 14889-2:2008", # Fijo "11 blanco2": "", # Separador "12 producto": None, "13 descripcion": "", "14 uso": None, "15 blanco3": "", # Separador # "16 1 separador": "", # Fijo "16 codigo": "Lote {} · Bigbag {}", # Código bigbag y código lote. "17 caracteristicas": "Corte: {} mm · Peso: {} kg/br" # Corte y peso. } if lang == "en": for k in _data: _data[k] = helene_laanest(_data[k]) estilos = defaultdict(lambda: ("Helvetica-Bold", 11)) # Helvética a 11 por defecto estilos["01 texto_marcado"] = ("Times-Bold", 9) estilos["02 fabricado_por"] = ("Helvetica-Bold", 13) estilos["12 producto"] = ("Courier-Bold", 17) estilos["14 uso"] = ("Helvetica-Bold", 10) estilos["15 blanco3"] = ("Helvetica-Bold", 10) estilos["16 codigo"] = ("Courier-Bold", 13) estilos["17 caracteristicas"] = ("Helvetica-Bold", 14) data = {} # Datos de la BD dependientes del bigbag for bigbag in bigbags: # 0.- ¿En qué formato viene? Si es el antiguo (datos en diccionario) # me quedo con el objeto de pclases en sí. producto_venta = bigbag.articulo.productoVenta numpartida = bigbag.articulo.loteCem.codigo numbigbag = bigbag.codigo # 1.- Empresa try: # Si hay distribuidor, este texto cambia. distribuidor = bigbag.articulo.productoVenta.camposEspecificosBala.cliente if distribuidor: if lang == "en": data["02 fabricado_por"] = helene_laanest( "%s") % (distribuidor.nombre) else: data["02 fabricado_por"] = "%s" % ( distribuidor.nombre) dird = distribuidor.get_direccion_completa() dircompleta = textwrap.wrap(dird, (len(dird) + max([len(w) for w in dird.split()])) / 2) data["03 direccion1"] = dircompleta[0] data["04 direccion2"] = dircompleta[1] data["05 telefono"] = _data["05 telefono"] % ( distribuidor.telefono, distribuidor.email) else: # Sigo con los datos de "propia empresa". Distribuyo yo. empresa = pclases.DatosDeLaEmpresa.select()[0] data["02 fabricado_por"] = _data["02 fabricado_por"] % ( empresa.nombre) data["03 direccion1"] = empresa.direccion + ", " + empresa.cp data["04 direccion2"] = ", ".join((empresa.ciudad, empresa.provincia, empresa.pais)) data["05 telefono"] = _data["05 telefono"] % (empresa.telefono, empresa.email) # Para los clientes sin teléfono o sin email: data["05 telefono"] = data["05 telefono"].strip() if data["05 telefono"].startswith(","): data["05 telefono"] = data["05 telefono"][1:] if data["05 telefono"].endswith(","): data["05 telefono"] = data["05 telefono"][:-1] if len(data["05 telefono"]) <= 7: data["05 telefono"] = "" except IndexError: data["02 fabricado_por"] = "" data["03 direccion1"] = "" data["04 direccion2"] = "" data["05 telefono"] = "" # 2.- Producto producto = producto_venta if producto.annoCertificacion != None: data["06 año_certif"] = "%02d" % producto.annoCertificacion else: data["06 año_certif"] = "" data["08 dni"] = producto.dni data["12 producto"] = producto.nombre if producto.uso: if lang == "en": produso = helene_laanest(producto.uso) else: produso = producto.uso if len(produso) > 30: # Wrap si el texto es largo. produso = textwrap.wrap(produso, (len(produso) + max([len(w) for w in produso.split()])) / 2) data["14 uso"] = produso[0] data["15 blanco3"] = produso[1] # Era un separador, pero # necesito el espacio. else: data["14 uso"] = produso else: data["14 uso"] = "" # 3.- Bigbag data["16 codigo"] = _data["16 codigo"].format(numpartida, numbigbag) corte = producto.camposEspecificosBala.corte peso = float2str(bigbag.articulo.peso_bruto) corte_peso = _data["17 caracteristicas"].format(corte, peso) data["17 caracteristicas"] = corte_peso rectangulo(canvas, (margen, margen), (ancho - margen, alto - margen)) if mostrar_marcado: canvas.drawImage(logo_marcado, marcado[0], marcado[1], width=logo[0], height=logo[1]) else: data["01 texto_marcado"] = "" lineas = _data.keys() lineas.sort() # Posición y estilo de la primera línea. tamfuente = estilos[lineas[0]][1] crd_y = alto - logo[1] - 0.1 * cm - tamfuente # ¿Cuánto me desplazaré de línea a línea? offset_y = (crd_y - margen) / len(lineas) for linea in lineas: try: dato = data[linea] except KeyError: # Si no está en los valores asignados, busco # en los originales. Deben ser datos fijos. dato = _data[linea] if dato is None: dato = "" canvas.setFont(*estilos[linea]) #canvas.drawCentredString((ancho / 2), # crd_y, # escribe(dato)) el_encogedor_de_fuentes_de_doraemon(canvas, fuente=estilos[linea][0], tamannoini=estilos[linea][1], xini=margen, xfin=ancho - margen, y=crd_y, texto=dato, alineacion=0) crd_y -= offset_y canvas.showPage() canvas.save() return nomarchivo
def etiqueta_rollos_norma13(rollos, mostrar_marcado=True, lang="es"): """ Construye una etiqueta por cada objeto rollo recibido y las devuelve en un solo PDF. Si lang = "en", etiqueta en inglés. Si "es", en castellano. """ # Voy a tratar de reescribir esto regla en mano a ver si consigo # cuadrarlo bien en la etiquetadora GEMINI. alto = 12.55 * cm ancho = 8.4 * cm # Creo la hoja nomarchivo = os.path.join(gettempdir(), "etiq_norma13_{}_{}.pdf".format( lang, give_me_the_name_baby())) canvas = reportlabcanvas.Canvas(nomarchivo, pagesize=(ancho, alto)) # Medidas: logo = (3.8 * cm * 0.75, 2.8 * cm * 0.75) margen = 0.1 * cm marcado = (((ancho - logo[0]) / 2) - margen, (alto - margen - logo[1] - 2)) # Imágenes: logo_marcado = os.path.abspath( os.path.join(os.path.dirname(__file__), "..", "imagenes", "CE.png")) # Datos fijos: # pylint: disable=bad-continuation _data = {# "00 logo_marcado": None, "01 texto_marcado": "1035", # Fijo "02 fabricado_por": "Fabricado por: %s", "03 direccion1": None, "04 direccion2": None, "05 telefono": "Tfno: %s, %s", "06 año_certif": None, "07 blanco1": "", # Separador "08 dni": None, # "09 iso1": "De EN13249:2001 a EN13257:2001", # Fijo # "10 iso2": "EN13265:2001", # Fijo # La norma ha cambiado. Ahora nos regimos por la del 2014 "09 iso1": "De EN13249:2014 a EN13257:2014", # Fijo "10 iso2": "EN13265:2014", # Fijo "11 blanco2": "", # Separador "12 producto": None, "13 descripcion": "Geotextil no tejido de polipropileno 100% virgen", "14 uso": "Uso: %s", "15 blanco3": "", # Separador "16 codigo": "Partida: %d Rollo: %s", "17 caracteristicas": "Gramaje: %d g/m² Ancho: %s m Largo: %d m" } if lang == "en": for k in _data: _data[k] = helene_laanest(_data[k]) estilos = defaultdict(lambda: ("Helvetica", 9)) # Helvética a 9 por defecto estilos["02 fabricado_por"] = ("Helvetica-Bold", 11) estilos["12 producto"] = ("Helvetica-Bold", 17) estilos["16 codigo"] = ("Helvetica-Bold", 17) estilos["17 caracteristicas"] = ("Helvetica-Bold", 13) data = {} # Datos de la BD dependientes del rollo for rollo in rollos: # 0.- ¿En qué formato viene? Si es el antiguo (datos en diccionario) # me quedo con el objeto de pclases en sí. if isinstance(rollo, dict): try: producto_venta = rollo['productoVenta'] except KeyError: # Si no me lo mandan en el diccionario, tiene que traer # el objeto rollo. Los partes mandan producto en dicccionario # porque a veces se genera etiqueta antes de crear el objeto # en la BD. Si viene de la consulta del listado de rollos, # como el rollo ya existe, me viene en el objeto toda la info. producto_venta = rollo['objeto'].productoVenta numpartida = utils.parse_numero(rollo['partida']) numrollo = rollo['nrollo'] barcode39 = rollo['codigo39'] else: producto_venta = rollo.productoVenta numpartida = rollo.partida.numpartida numrollo = rollo.numrollo barcode39 = rollo.codigo # 1.- Empresa try: # Si hay distribuidor, este texto cambia. distribuidor = producto_venta.camposEspecificosRollo.cliente if distribuidor: if lang == "en": data["02 fabricado_por"] = helene_laanest( "%s") % (distribuidor.nombre) else: data["02 fabricado_por"] = "%s" % ( distribuidor.nombre) dird = distribuidor.get_direccion_completa() dircompleta = textwrap.wrap(dird, (len(dird) + max([len(w) for w in dird.split()])) / 2) data["03 direccion1"] = dircompleta[0] data["04 direccion2"] = dircompleta[1] data["05 telefono"] = _data["05 telefono"] % ( distribuidor.telefono, distribuidor.email) else: # Sigo con los datos de "propia empresa". Distribuyo yo. empresa = pclases.DatosDeLaEmpresa.select()[0] data["02 fabricado_por"] = _data["02 fabricado_por"] % ( empresa.nombre) data["03 direccion1"] = empresa.direccion + ", " + empresa.cp data["04 direccion2"] = ", ".join((empresa.ciudad, empresa.provincia, empresa.pais)) data["05 telefono"] = _data["05 telefono"] % (empresa.telefono, empresa.email) # Para los clientes sin teléfono o sin email: data["05 telefono"] = data["05 telefono"].strip() if data["05 telefono"].startswith(","): data["05 telefono"] = data["05 telefono"][1:] if data["05 telefono"].endswith(","): data["05 telefono"] = data["05 telefono"][:-1] if len(data["05 telefono"]) <= 7: data["05 telefono"] = "" except IndexError: data["02 fabricado_por"] = "" data["03 direccion1"] = "" data["04 direccion2"] = "" data["05 telefono"] = "" # 2.- Producto producto = producto_venta if producto.annoCertificacion != None: data["06 año_certif"] = "%02d" % producto.annoCertificacion else: data["06 año_certif"] = "" data["08 dni"] = producto.dni if len(producto.nombre) <= 50: data["12 producto"] = producto.nombre else: #if "//" in producto.nombre: # Productos Intermas # data["11 blanco2"], data["12 producto"] = producto.nombre.split("//") #else: data["11 blanco2"], data["12 producto"] = utils.dividir_cadena( producto.nombre) data["11 blanco2"] = data["11 blanco2"].strip() data["12 producto"] = data["12 producto"].strip() estilos["11 blanco2"] = estilos["12 producto"] if producto.uso: if lang == "en": data["14 uso"] = _data["14 uso"] % helene_laanest(producto.uso) else: data["14 uso"] = _data["14 uso"] % producto.uso else: data["14 uso"] = "" # 3.- Rollo data["16 codigo"] = _data["16 codigo"] % (numpartida, numrollo) data["17 caracteristicas"] = _data["17 caracteristicas"] % ( producto.camposEspecificosRollo.gramos, float2str(producto.camposEspecificosRollo.ancho, autodec=True, separador_decimales="."), producto.camposEspecificosRollo.metrosLineales) rectangulo(canvas, (margen, margen), (ancho - margen, alto - margen)) if mostrar_marcado: canvas.drawImage(logo_marcado, marcado[0], marcado[1], width=logo[0], height=logo[1]) else: data["01 texto_marcado"] = "" lineas = _data.keys() lineas.sort() # Posición y estilo de la primera línea. tamfuente = estilos[lineas[0]][1] crd_y = alto - logo[1] - 0.1 * cm - tamfuente # ¿Cuánto me desplazaré de línea a línea? offset_y = (crd_y - margen) / (len(lineas) + 3) # 3 líneas para barcode for linea in lineas: try: dato = data[linea] except KeyError: # Si no está en los valores asignados, busco # en los originales. Deben ser datos fijos. dato = _data[linea] if dato is None: dato = "" canvas.setFont(*estilos[linea]) #canvas.drawCentredString((ancho / 2), # crd_y, # escribe(dato)) el_encogedor_de_fuentes_de_doraemon(canvas, fuente=estilos[linea][0], tamannoini=estilos[linea][1], xini=margen, xfin=ancho - margen, y=crd_y, texto=dato, alineacion=0) crd_y -= offset_y # Lo último: el código de barras: ####################################################################### canvas.saveState() crd_y -= 2*offset_y crd_y -= 0.2*cm codigo_rollo = barcode39 codigobarras = Extended39(codigo_rollo, xdim=.065*cm) codigobarras.drawOn(canvas, margen-0.5*cm, crd_y) xcode = ancho / 2.0 ycode = 0.15*cm canvas.setFont("Courier-Bold", 9) try: canvas.drawCentredString(xcode, ycode, codigo_rollo, charSpace=0.25*cm) except TypeError: # Versión antigua de ReportLab. canvas.drawCentredString(xcode, ycode, codigo_rollo) canvas.restoreState() # Y el QR de regalo # # De momento lo desactivo porque nuestras pistolas no lo reconocen. #try: # from lib.pyqrcode import pyqrcode # bidicode = pyqrcode.create(codigo_rollo) # nomfichbidi = os.path.join(gettempdir(), # "bidi_%s.svg" % give_me_the_name_baby()) # bidicode.svg(nomfichbidi, scale=3) # from lib.svglib.svglib import svglib # drawing = svglib.svg2rlg(nomfichbidi) # drawing.drawOn(canvas, margen - 0.25*cm, alto - margen - 3.0*cm + 0.25*cm) #except ImportError: # pass # No hay bidi porque no hay lxml instalado. Probablemente. # print("No se generará código QR. Puede intentar lo siguiente:") # print("C:\Python27\Scripts\easy_install.exe pip") # print('pip install "D:\Informatica\Software\softwin python 2.7' # '\lxml-3.7.2-cp27-cp27m-win32.whl"') ####################################################################### canvas.showPage() # Y ahora la etiqueta adicional por si se pierde la otra y para cargar. create_etiqueta_backup(canvas, rollo) canvas.showPage() canvas.save() return nomarchivo
def cabecera_y_cliente(canvas, doc, datos_cliente, datos_de_la_empresa, datos_albaran): """ Escribe el texto "ALBARÁN" y los datos del cliente. Los datos del cliente vienen en un diccionario con: código (de cliente), cif, razón social, dirección, población, provincia. """ fuente = "Helvetica" tamanno = 24 canvas.saveState() canvas.setFont(fuente, tamanno) canvas.drawString(PAGE_WIDTH - canvas.stringWidth(escribe("ALBARÁN"),fuente,tamanno) - 1.0*cm, PAGE_HEIGHT - 1.5*cm, escribe("ALBARÁN")) canvas.restoreState() tamanno = 12 altura_linea = 16 xCliente = (PAGE_WIDTH - 1*cm) / 2.5 linea = (PAGE_HEIGHT-1.5*cm) - 0.10*cm - 2*cm rectangulo(canvas, (xCliente - 0.2*cm, PAGE_HEIGHT - 1.5*cm + altura_linea - 2*cm), (PAGE_WIDTH - 1*cm, (PAGE_HEIGHT- 1.5*cm + altura_linea) -(altura_linea*5 + 0.5*cm) - 2*cm) ) canvas.drawString(xCliente, linea, escribe( "Cód. cliente: %s C.I.F.: %s" % ( datos_cliente['código'], datos_cliente['cif']))) linea -= altura_linea el_encogedor_de_fuentes_de_doraemon(canvas, fuente, tamanno, xCliente, PAGE_WIDTH - 1*cm, linea, escribe(datos_cliente['razón social'])) linea -= altura_linea el_encogedor_de_fuentes_de_doraemon(canvas, fuente, tamanno, xCliente, PAGE_WIDTH - 1*cm, linea, escribe(datos_cliente['dirección'])) linea -= altura_linea canvas.drawString(xCliente, linea, escribe(datos_cliente['población'])) linea -= altura_linea canvas.drawString(xCliente, linea, escribe(datos_cliente['provincia'])) # Datos de la empresa dibujar_datos_empresa(canvas, datos_de_la_empresa) # Cabecera de factura build_tabla_cabecera(canvas, datos_albaran, 22.5*cm)
def etiqueta_rollos_norma13(rollos, mostrar_marcado = True, lang = "es"): """ Construye una etiqueta por cada objeto rollo recibido y las devuelve en un solo PDF. Si lang = "en", etiqueta en inglés. Si "es", en castellano. """ # Voy a tratar de reescribir esto regla en mano a ver si consigo # cuadrarlo bien en la etiquetadora GEMINI. alto = 12.55 * cm ancho = 8.4 * cm # Creo la hoja nomarchivo = os.path.join(gettempdir(), "etiq_norma13_%s_%s.pdf" % (lang, give_me_the_name_baby())) c = canvas.Canvas(nomarchivo, pagesize = (ancho, alto)) # Medidas: logo = (3.8 * cm * 0.75, 2.8 * cm * 0.75) margen = 0.1 * cm marcado = (((ancho - logo[0]) / 2) - margen, (alto - margen - logo[1] - 2)) # Imágenes: logo_marcado = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "imagenes", "CE.png")) # Datos fijos: _data = {# "00 logo_marcado": None, "01 texto_marcado": "1035", # Fijo "02 fabricado_por": "Fabricado por: %s", "03 direccion1": None, "04 direccion2": None, "05 telefono": "Tfno: %s, %s", "06 año_certif": None, "07 blanco1": "", # Separador "08 dni": None, #"09 iso1": "De EN13249:2001 a EN13257:2001", # Fijo #"10 iso2": "EN13265:2001", # Fijo # La norma ha cambiado. Ahora nos regimos por la del 2014 "09 iso1": "De EN13249:2014 a EN13257:2014", # Fijo "10 iso2": "EN13265:2014", # Fijo "11 blanco2": "", # Separador "12 producto": None, "13 descripcion": "Geotextil no tejido de polipropileno 100% virgen", "14 uso": "Uso: %s", "15 blanco3": "", # Separador "16 codigo": "Partida: %d Rollo: %s", "17 caracteristicas": "Gramaje: %d g/m² Ancho: %s m Largo: %d m" } if lang == "en": for k in _data: _data[k] = helene_laanest(_data[k]) estilos = defaultdict(lambda: ("Helvetica", 9)) # Helvética a 9 por defecto estilos["02 fabricado_por"] = ("Helvetica-Bold", 11) estilos["12 producto"] = ("Helvetica-Bold", 17) estilos["16 codigo"] = ("Helvetica-Bold", 17) estilos["17 caracteristicas"] = ("Helvetica-Bold", 13) data = {} # Datos de la BD dependientes del rollo for rollo in rollos: # 0.- ¿En qué formato viene? Si es el antiguo (datos en diccionario) # me quedo con el objeto de pclases en sí. if isinstance(rollo, dict): try: productoVenta = rollo['productoVenta'] except KeyError: # Si no me lo mandan en el diccionario, tiene que traer # el objeto rollo. Los partes mandan producto en dicccionario # porque a veces se genera etiqueta antes de crear el objeto # en la BD. Si viene de la consulta del listado de rollos, # como el rollo ya existe, me viene en el objeto toda la info. productoVenta = rollo['objeto'].productoVenta numpartida = utils.parse_numero(rollo['partida']) numrollo = rollo['nrollo'] else: productoVenta = rollo.productoVenta numpartida = rollo.partida.numpartida numrollo = rollo.numrollo # 1.- Empresa try: # Si hay distribuidor, este texto cambia. distribuidor = productoVenta.camposEspecificosRollo.cliente if distribuidor: if lang == "en": data["02 fabricado_por"] = helene_laanest( "Distribuido por: %s") % (distribuidor.nombre) else: data["02 fabricado_por"] = "Distribuido por: %s" % ( distribuidor.nombre) d = distribuidor.get_direccion_completa() dircompleta = textwrap.wrap(d, (len(d) + max([len(w) for w in d.split()])) / 2) data["03 direccion1"] = dircompleta[0] data["04 direccion2"] = dircompleta[1] data["05 telefono"] = _data["05 telefono"] % ( distribuidor.telefono, distribuidor.email) else: # Sigo con los datos de "propia empresa". Distribuyo yo. empresa = pclases.DatosDeLaEmpresa.select()[0] data["02 fabricado_por"] = _data["02 fabricado_por"] % ( empresa.nombre) data["03 direccion1"] = empresa.direccion + ", " + empresa.cp data["04 direccion2"] = ", ".join((empresa.ciudad, empresa.provincia, empresa.pais)) data["05 telefono"] = _data["05 telefono"] % (empresa.telefono, empresa.email) # Para los clientes sin teléfono o sin email: data["05 telefono"] = data["05 telefono"].strip() if data["05 telefono"].startswith(","): data["05 telefono"] = data["05 telefono"][1:] if data["05 telefono"].endswith(","): data["05 telefono"] = data["05 telefono"][:-1] if len(data["05 telefono"]) <= 7: data["05 telefono"] = "" except IndexError: data["02 fabricado_por"] = "" data["03 direccion1"] = "" data["04 direccion2"] = "" data["05 telefono"] = "" # 2.- Producto producto = productoVenta if producto.annoCertificacion != None: data["06 año_certif"] = "%02d" % producto.annoCertificacion else: data["06 año_certif"] = "" data["08 dni"] = producto.dni if len(producto.nombre) <= 50: data["12 producto"] = producto.nombre else: #if "//" in producto.nombre: # Productos Intermas # data["11 blanco2"], data["12 producto"] = producto.nombre.split("//") #else: data["11 blanco2"], data["12 producto"] = utils.dividir_cadena( producto.nombre) data["11 blanco2"] = data["11 blanco2"].strip() data["12 producto"] =data["12 producto"].strip() estilos["11 blanco2"] = estilos["12 producto"] if producto.uso: if lang == "en": data["14 uso"] = _data["14 uso"] % helene_laanest(producto.uso) else: data["14 uso"] = _data["14 uso"] % producto.uso else: data["14 uso"] = "" # 3.- Rollo data["16 codigo"] = _data["16 codigo"] % (numpartida, numrollo) data["17 caracteristicas"] = _data["17 caracteristicas"] % ( producto.camposEspecificosRollo.gramos, float2str(producto.camposEspecificosRollo.ancho, autodec = True, separador_decimales = "."), producto.camposEspecificosRollo.metrosLineales) rectangulo(c, (margen, margen), (ancho - margen, alto - margen)) if mostrar_marcado: c.drawImage(logo_marcado, marcado[0], marcado[1], width = logo[0], height = logo[1]) else: data["01 texto_marcado"] = "" lineas = _data.keys() lineas.sort() # Posición y estilo de la primera línea. tamfuente = estilos[lineas[0]][1] y = alto - logo[1] - 0.1 * cm - tamfuente # ¿Cuánto me desplazaré de línea a línea? offset_y = (y - margen) / len(lineas) for linea in lineas: try: dato = data[linea] except KeyError: # Si no está en los valores asignados, busco # en los originales. Deben ser datos fijos. dato = _data[linea] if dato is None: dato = "" c.setFont(*estilos[linea]) #c.drawCentredString((ancho / 2), # y, # escribe(dato)) el_encogedor_de_fuentes_de_doraemon(c, fuente = estilos[linea][0], tamannoini = estilos[linea][1], xini = margen, xfin = ancho - margen, y = y, texto = dato, alineacion = 0) y -= offset_y c.showPage() c.save() return nomarchivo
def cabecera_y_cliente(canvas, doc, datos_cliente, datos_de_la_empresa, titular, datos_albaran): """ Escribe el texto "ALBARÁN/CARTA DE PORTE" y los datos del cliente. Los datos del cliente vienen en un diccionario con: código (de cliente), cif, razón social, dirección, población, provincia. """ fuente = "Helvetica" tamanno = 12 canvas.drawString(1.0*cm, PAGE_HEIGHT - 1.5*cm, escribe("ALBARÁN/CARTA DE PORTE")) altura_linea = 16 xCliente = (PAGE_WIDTH - 1*cm) / 2.5 linea = (PAGE_HEIGHT-1.5*cm) - 0.10*cm rectangulo(canvas, (xCliente - 0.2*cm, PAGE_HEIGHT - 1.5*cm + altura_linea), (PAGE_WIDTH - 1*cm, (PAGE_HEIGHT- 1.5*cm + altura_linea)-(altura_linea*5 + 0.5*cm)) ) canvas.drawString(xCliente, linea, escribe( "Cód. cliente: %s C.I.F.: %s" % ( datos_cliente['código'], datos_cliente['cif']))) linea -= altura_linea el_encogedor_de_fuentes_de_doraemon(canvas, fuente, tamanno, xCliente, PAGE_WIDTH - 1*cm, linea, escribe("Razón social: %s" % datos_cliente['razón social'])) #canvas.drawString(xCliente, # linea, # escribe("Razón social: %s"%datos_cliente['razón social'])) linea -= altura_linea el_encogedor_de_fuentes_de_doraemon(canvas, fuente, tamanno, xCliente, PAGE_WIDTH - 1*cm, linea, escribe("Dirección: %s" % datos_cliente['dirección'])) #canvas.drawString(xCliente, # linea, # escribe("Dirección: %s" % datos_cliente['dirección'])) linea -= altura_linea canvas.drawString(xCliente, linea, escribe("Población: %s" % datos_cliente['población'])) linea -= altura_linea canvas.drawString(xCliente, linea, escribe("Provincia: %s" % datos_cliente['provincia'])) # Y el pie de página: logo, empresa = build_logo_y_empresa_por_separado(datos_de_la_empresa) LineaHorizontal(0.9 * PAGE_WIDTH).drawOn(canvas, 78.0, 12.5*cm) LineaHorizontal(0.9 * PAGE_WIDTH).drawOn(canvas, 78.0, 12.4 *cm) logo.drawOn(canvas, 3*cm, 10 * cm) fuente = "Helvetica" tamanno = 10 for i in range(len(empresa)): linea = 11.5 * cm el_encogedor_de_fuentes_de_doraemon(canvas, fuente, tamanno, 5.25*cm, PAGE_WIDTH - 1*cm, linea - (i*0.5*cm), escribe(empresa[i])) #logo_y_empresa.drawOn(canvas, 10.5*cm, 78.0) texto = build_texto(titular) lineas = [] for l in [p.text for p in texto._content]: lineas.extend(l.split("\n")) y = 9.5*cm tamanno = 8 centrado = False for linea in lineas: linea = linea.replace(" ", "") if "<b>" in linea: fuente = "Times-Bold" linea = linea.replace("<b>", "").replace("</b>", "") # Aprovechando que el Pisuerga... centrado = True else: fuente = "Times-Roman" if "<font size=12>" in linea: tamanno = 12 linea = linea.replace("<font size=12>", "").replace("</font>", "") else: tamanno = 10 lineas_agregadas = agregarFila(1*cm, y, PAGE_WIDTH - 1*cm, escribe(linea), canvas, fuente, tamanno, centrado = centrado) y -= lineas_agregadas * 10 #canvas.drawString(PAGE_WIDTH - 2*cm, 2*cm, str(canvas.getPageNumber())) #texto.drawOn(canvas, 9*cm, 72.0) # Página x de y. canvas.saveState() canvas.setFont("Times-Italic", 9) canvas.drawRightString(PAGE_WIDTH - 1.5*cm, 12.7*cm, escribe("Página %d de " % canvas.getPageNumber())) canvas.doForm("lastPageNumber") canvas.restoreState() # Cabecera. # Sí, ahora va aquí. No hace falta que ponga el CWT, ¿o sí? canvas.saveState() x1 = 1.0 * cm + 1 limite = x1 + 0.9 * PAGE_WIDTH incremento = (limite - x1) / 4 y1 = 24.5 * cm y2 = y1 - 18 for texto, clave in (("Fecha", "fecha"), ("Nº Albarán", "número"), ("Kilos", "kilos"), ("Bultos", "bultos")): x2 = x1 + incremento canvas.setFont("Times-Roman", 12) rectangulo(canvas, (x1, y1), (x2, y2), texto = escribe(datos_albaran[clave]), alinTxtX = "centro", alinTxtY = "centro") canvas.setFont("Times-Roman", 10) canvas.drawString(x1+0.2*cm, y1 + 3, texto) x1 += incremento canvas.restoreState()