Пример #1
0
	def __applyCanvasOptions(self, canvas, opts):
		for opt in opts:
			if opt == 'fillColor':
				canvas.setFillColor(opts[opt])
			if opt == 'fontSize':
				canvas.setFontSize(opts[opt])
		return canvas
Пример #2
0
 def __call__(self, canvas, doc):
     canvas.saveState()
     w, h = canvas._pagesize
     font_size = random_integer_from_list(self.config['text']['font_size'])
     line_y = random_integer_from_list(self.config['text']['bottom_margin'])
     canvas.setFontSize(font_size)
     canvas.drawCentredString(w / 2, line_y, str(canvas.getPageNumber()))
     canvas.restoreState()
    def centred_text(canvas, x, y, row, what):
        x_centre = x + size[0] / 2.0
        canvas.saveState()

        for font_size in range(12, 5, -1):
            canvas.setFontSize(font_size)
            if canvas.stringWidth(what) < size[0]:
                break
        else:
            print("Warning: text", what, "too wide")

        offset = row * size[1] / 4.0
        canvas.drawCentredString(x_centre, y + offset, what)
        canvas.restoreState()
    def centred_text(canvas, x, y, row, what):
        x_centre = x + size[0] / 2.0
        canvas.saveState()

        for font_size in range(12, 5, -1):
            canvas.setFontSize(font_size)
            if canvas.stringWidth(what) < size[0]:
                break
        else:
            print("Warning: text", what, "too wide")

        offset = row * size[1] / 4.0
        canvas.drawCentredString(x_centre, y + offset, what)
        canvas.restoreState()
Пример #5
0
	def myFirstPage(self,canvas, doc):
		canvas.saveState()
		canvas.drawImage(STATICFILES_DIRS[0]+'escudo_transito.jpg',35, PAGE_HEIGHT-115)
		canvas.setLineWidth(1)
		canvas.line(10, 723, 600,723)
		canvas.setFont('Times-Roman',8)
		canvas.drawString(10,PAGE_HEIGHT-130, "MUNICIPIO DE LEON GUANAJUATO")
		canvas.drawString(10,PAGE_HEIGHT-142, "SECRETARIA DE SEGURIDAD PUBLICA")
		canvas.drawString(420,PAGE_HEIGHT-142, "INFORME DE CAPTURA DE INFRACCIONES")
		canvas.setFillColorRGB(1,0,0)
		canvas.setFontSize(18)
		canvas.setFontSize(10)
		canvas.setFillColorRGB(0,0,0)
		canvas.drawString(10,PAGE_HEIGHT-154, "DIRECCION GENERAL DE TRANSITO MUNICIPAL")
		
Пример #6
0
	def myFirstPage(self,canvas, doc):
		canvas.saveState()
		canvas.drawImage(STATICFILES_DIRS[0]+'escudo_transito.jpg',35, PAGE_HEIGHT-115)
		canvas.setLineWidth(1)
		canvas.line(10, 723, 600,723)
		canvas.setFont('Times-Roman',8)
		canvas.drawString(10,PAGE_HEIGHT-130, "MUNICIPIO DE LEON GUANAJUATO")
		canvas.drawString(10,PAGE_HEIGHT-142, "SECRETARIA DE SEGURIDAD PUBLICA")
		canvas.drawString(420,PAGE_HEIGHT-142, "ACTA DE INFRACCION No T.")
		
		canvas.setFillColorRGB(1,0,0)
		canvas.setFontSize(18)
		
		folio=self.data.get('folio_infraccion',"")
		
		canvas.drawString(530,PAGE_HEIGHT-142, folio)
		canvas.setFontSize(10)
		canvas.setFillColorRGB(0,0,0)
		

		canvas.drawString(10,PAGE_HEIGHT-154, "DIRECCION GENERAL DE TRANSITO MUNICIPAL")
		canvas.setFont('Times-Roman',7.5)
		fundamento='Con fundamento en los artículos 16 de la  Constitución Política de los Estados Unidos '
		fundamento=fundamento + '  Mexicanos 4 de la Ley Orgánica Municipal para el Estado de Guanajuato1,2,3,4,fracción 1X 42,44 y 47 del'
		canvas.drawString(10,PAGE_HEIGHT-178, fundamento)
		canvas.drawString(10,PAGE_HEIGHT-190, "reglamento de Tránsito Municipal de Léon,  Guanajuato se procede a levantar la presente.")
		canvas.drawString(330,PAGE_HEIGHT-190, "ACTA DE INFRACCION")
		#canvas.setFillColorRGB(0,0,0)
		#canvas.setFillColorCMYK(1,1,0,0)
		canvas.rect(10, 600, 583, 35)
		canvas.drawString(12,PAGE_HEIGHT -213, "EN LEON. Guanajuato, el suscrito")
		canvas.setFont('Times-Bold',7)

		canvas.drawString(170,PAGE_HEIGHT -213, "AGENTE")
		canvas.setFont('Times-Roman',7.5)																																																																																																																																																																																																																																																										
		canvas.drawString(250,PAGE_HEIGHT -213, "de nombre")
		canvas.setStrokeColorRGB(0,0,0)
		canvas.setLineWidth(1)
		canvas.line(300, 627, 430,627)
		canvas.setFont('Times-Bold',7)
		nombre=self.data.get('nombreAgente',"")
		canvas.drawString(300,PAGE_HEIGHT -213, nombre)
		canvas.setFont('Times-Roman',7.5)
		canvas.drawString(525,PAGE_HEIGHT -213, "adscrito a la")
		canvas.setFont('Times-Bold',7.5)

		canvas.drawString(12,PAGE_HEIGHT -222, "PRIMERA COMANDANCIA")
		canvas.drawString(130,PAGE_HEIGHT -222, "TURNO A")
		canvas.drawString(180,PAGE_HEIGHT -222, "DELEGACION PONIENTE")
		canvas.setFont('Times-Roman',7.5)

		canvas.drawString(280,PAGE_HEIGHT -222, " de la Direccion de Transito municipal de Leon  Guanajuato como consta en la ")
		canvas.setFont('Times-Bold',7.5)
		
		canvas.drawString(525,PAGE_HEIGHT -222, "CREDENCIAL")
		cobro=self.data.get('noCobro',"")
		canvas.drawString(12,PAGE_HEIGHT -231, str(cobro))
		canvas.setLineWidth(1)
		canvas.line(12, 609, 40,609)
		canvas.setFont('Times-Roman',7.5)

		canvas.drawString(45,PAGE_HEIGHT -231, "expedida por el titular de la Dependencia Municipal. con la cual me identifica. Siendo las")
		canvas.setFont('Times-Bold',7.5)
		hora=self.data.get('hora_infrac',"")

		canvas.drawString(318,PAGE_HEIGHT -231, hora)
		canvas.setLineWidth(1)
		canvas.line(318, 609, 337,609)
		canvas.setFont('Times-Roman',7.5)

		canvas.drawString(350,PAGE_HEIGHT -231, "Horas del dia")
		canvas.setFont('Times-Bold',7.5)
		canvas.drawString(398,PAGE_HEIGHT -231, "24")
		canvas.setLineWidth(1)
		canvas.line(395, 609, 407,609)
		canvas.setFont('Times-Roman',7)

		canvas.drawString(413,PAGE_HEIGHT -231, "del mes de")
		canvas.setFont('Times-Bold',7)

		canvas.drawString(453,PAGE_HEIGHT -231, "OCTUBRE")
		canvas.setLineWidth(1)
		canvas.line(450, 609, 493,609)
		canvas.setFont('Times-Roman',7.5)

		canvas.drawString(495,PAGE_HEIGHT -231, "Del año")
		canvas.setFont('Times-Bold',7.5)

		canvas.drawString(525,PAGE_HEIGHT -231, "2013")
		canvas.setFont('Times-Roman',7.5)

		canvas.drawString(12,PAGE_HEIGHT -240, "Hago constar que el conductor de vehiculo cuyos  datos se especifican a continuacion:")
		canvas.rect(10, 575, 585, 10)
		canvas.rect(10, 495, 585, 80)
		canvas.setLineWidth(1)
		canvas.line(10, 565, 595,565)
		canvas.line(10, 555, 595,555)
		canvas.line(10, 545, 595,545)
		canvas.line(10, 535, 595,535)
		canvas.line(10, 525, 595,525)
		canvas.line(10, 515, 595,515)
		canvas.line(10, 505, 595,505)
		canvas.line(295, 495, 295,585)
		canvas.drawString(135,PAGE_HEIGHT -265, "Datos Personales")
		canvas.drawString(395,PAGE_HEIGHT -265, "Caracteristicas de Vehiculo")
		canvas.drawString(300,PAGE_HEIGHT -275, "Marca:")
		canvas.setFont('Times-Bold',7)
		

		self.LabelVehiculo(canvas)
		self.LabelConductor(canvas)
		vehiculo=self.data.get('vehiculo',"")
		if vehiculo !="":
			mar=vehiculo.get('marca',"")
			canvas.drawString(330,PAGE_HEIGHT -275,  mar)
			vehiculo=self.data.get('vehiculo',"")
			sub=vehiculo.get('submarca',"")
			canvas.drawString(500,PAGE_HEIGHT -275, sub)
			#canvas.drawString(500,PAGE_HEIGHT -275, "PICK UP")
			canvas.setFont('Times-Roman',7)
			#canvas.drawString(500,PAGE_HEIGHT -275, "Camioneta")
			canvas.setFont('Times-Bold',7)
			modelo=vehiculo.get('modelo',"")
			canvas.drawString(340,PAGE_HEIGHT -285, modelo)
			canvas.setFont('Times-Roman',7)

			canvas.setFont('Times-Bold',7)
			color=vehiculo.get('color',"")
			canvas.drawString(470,PAGE_HEIGHT -285, color)
			canvas.setFont('Times-Roman',7)

			canvas.setFont('Times-Bold',7)
			placas=vehiculo.get('placas',"")
			canvas.drawString(340,PAGE_HEIGHT -295, placas)
			canvas.setFont('Times-Roman',7)

			
			canvas.setFont('Times-Bold',7)
			serie=vehiculo.get('serie',"")
			canvas.drawString(470,PAGE_HEIGHT -295, serie)
			canvas.setFont('Times-Roman',7)

			
			canvas.setFont('Times-Bold',7)
			empresa=vehiculo.get('empresa',"")
			canvas.drawString(360,PAGE_HEIGHT -305, empresa)
			canvas.setFont('Times-Roman',7)

			
			canvas.setFont('Times-Bold',7)
			tipo_vehiculo=vehiculo.get('tipo_vehiculo',"")
			canvas.drawString(500,PAGE_HEIGHT -305, tipo_vehiculo)
			canvas.setFont('Times-Roman',7)

			
			canvas.setFont('Times-Bold',7)
			estado=vehiculo.get('estado',"")
			canvas.drawString(53,PAGE_HEIGHT -325, estado)

			
			canvas.setFont('Times-Bold',7)
			empresa=vehiculo.get('empresa',"")
			canvas.drawString(360,PAGE_HEIGHT -325, empresa)
			
			canvas.setFont('Times-Roman',7)
			
			canvas.setFont('Times-Bold',7)
			ruta=vehiculo.get('ruta','')
			canvas.drawString(500,PAGE_HEIGHT -325, ruta)

			canvas.setFont('Times-Roman',7)
			
			canvas.setFont('Times-Bold',7)
			sub=vehiculo.get('no_economico',"")
			canvas.drawString(370,PAGE_HEIGHT -335, sub)

			canvas.setFont('Times-Roman',7)
			
			canvas.setFont('Times-Bold',7)
			no_tarjeton=vehiculo.get('no_tarjeton',"")
			canvas.drawString(400,PAGE_HEIGHT -345, no_tarjeton)


		infractor=self.data.get('infractor',"")
		if infractor !="":
			
			canvas.setFont('Times-Bold',7)
			nombre=infractor.get('nombre',"")
			canvas.drawString(57,PAGE_HEIGHT -285, nombre)
			canvas.setFont('Times-Roman',7)

			
			canvas.setFont('Times-Bold',7)
			edad=infractor.get('edad',"")
			canvas.drawString(57,PAGE_HEIGHT -295, edad)

			canvas.setFont('Times-Roman',7)
			
			canvas.setFont('Times-Bold',7)
			sexo=infractor.get('sexo',"")
			canvas.drawString(170,PAGE_HEIGHT -295, sexo)

			
			canvas.setFont('Times-Bold',7)
			domicilio=infractor.get('domicilio',"")
			canvas.drawString(53,PAGE_HEIGHT -305, domicilio)
			canvas.setFont('Times-Roman',7)

			
			canvas.setFont('Times-Bold',7)
			sub=infractor.get('colonia',"")
			canvas.drawString(53,PAGE_HEIGHT -315, sub)

			canvas.setFont('Times-Roman',7)
			
			canvas.setFont('Times-Bold',7)

			ciudad=infractor.get('ciudad',"")
			canvas.drawString(170,PAGE_HEIGHT -325, ciudad)
			canvas.setFont('Times-Roman',7)
			
			canvas.setFont('Times-Bold',7)
			no_licencia=infractor.get('no_licencia',"")
			canvas.drawString(120,PAGE_HEIGHT -335, no_licencia)
		
		

		
		

		
		"""
	

		## ESTO DEBE DE ESTAR EN ALGUN LADO
		tipo_servicio=self.data.get('tipo_servicio',"")
		canvas.drawString(395,PAGE_HEIGHT -315, tipo_servicio)
		canvas.setFont('Times-Roman',7)

		canvas.setFont('Times-Roman',7)
		canvas.drawString(12,PAGE_HEIGHT -345, "Tipo de Operativo:")
		canvas.setFont('Times-Bold',7)
		sub=self.data.get('tipo_operativo',"")
		canvas.drawString(100,PAGE_HEIGHT -345, sub)

		canvas.setFont('Times-Roman',7)
		canvas.drawString(12,PAGE_HEIGHT -355, "Quien en estos Momentos")
		canvas.setFont('Times-Bold',7)
		sub=self.data.get('firmo',"")
		canvas.drawString(100,PAGE_HEIGHT -355, sub)

		canvas.setFont('Times-Roman',7)
		canvas.drawString(116,PAGE_HEIGHT -355, "se encuentra presente, cometio flagrantemente infraccion a los articulo(s) que se detalla(n) a continuacion")
		canvas.setLineWidth(2)
		##canvas.rect(10, 440, 585, 35)
		canvas.setLineWidth(1)
		
		canvas.line(180, 440, 180,476)
		canvas.drawString(12,PAGE_HEIGHT -374, "Reglamento de Transito para")
		canvas.drawString(12,PAGE_HEIGHT -380, "el municipio de Leon, Guanajuato")
		canvas.drawString(190,PAGE_HEIGHT -378, "Descripcion de los Motivos de la infraccion")
		canvas.setFont('Times-Roman',7)
		
		canvas.setFont('Times-Bold',7)
		dy=585

		canvas.rect(10, dy, 585, 45)

		canvas.drawString(12,PAGE_HEIGHT -dy, " Hechos que ocurrieron en:")
		canvas.setFont('Times-Bold',7)
		
		calle=self.data.get('calle1',"")
		canvas.drawString(200,PAGE_HEIGHT -dy, calle)
		
		canvas.line(190, dy-1, 315,dy-1)
		canvas.setFont('Times-Roman',7)

		canvas.drawString(395,PAGE_HEIGHT -dy, "Con circulacion de:")
		canvas.setFont('Times-Bold',7)
		bar=self.data.get('circulacion',"")
		canvas.drawString(475,PAGE_HEIGHT -dy, bar)

		canvas.setFont('Times-Roman',7)

		canvas.drawString(200,PAGE_HEIGHT -(dy+9), " Calle BOULEVARD / AVENIDA")

		canvas.setFont('Times-Bold',7)
		bar=self.data.get('colonia',"")
		dy=dy+19

		canvas.drawString(73,PAGE_HEIGHT -dy, bar)
		canvas.line(29, dy-40, 150,dy-40)
		canvas.setFont('Times-Roman',7)

		canvas.drawString(190,PAGE_HEIGHT -dy, "Referencia")
		canvas.setFont('Times-Bold',7)
		bar=self.data.get('referencia',"")

		canvas.drawString(320,PAGE_HEIGHT -dy, bar)

		canvas.line(250, dy-40, 400,dy-40)
		canvas.setFont('Times-Roman',7)

		canvas.drawString(23,PAGE_HEIGHT-450, "FRACCIONAMIENTO COLONIA COMUNIDAD")
		canvas.drawString(250,PAGE_HEIGHT-450, "SENALAR FRENTE A QUE NUMERO ENTRE QUE CALLE U OTRO PUNTO DE REFERENCIA")
		canvas.drawString(12,PAGE_HEIGHT-455, "Ubicacion de senalamiento vial (en los casos que proceda)")
		
		
		canvas.drawString(12,PAGE_HEIGHT-480, "Con fundamento en lo dispuesto por el articulo 44 del reglamento de Transito Municipalde Leon Guanajuato para garantizar el cumplimiento de la sancion administrativa que")
		
		canvas.drawString(12,PAGE_HEIGHT -490, "en su caso se proceda, SE RETIENE AL INFRACTOR:")
		se_recoje=self.data.get('se_recoje',"")
		if se_recoje.get('tipo',"") == 'PLACAS':
			canvas.drawString(45,PAGE_HEIGHT -498, "X")	
		canvas.drawString(12,PAGE_HEIGHT -498, "PLACAS  (  )")

		if se_recoje.get('tipo',"") == 'TARJETA DE CIRCULACION':
			canvas.drawString(190,PAGE_HEIGHT -498, "X")
		canvas.drawString(95,PAGE_HEIGHT -498, "TARJETA DE CIRCULACION (    )")

		if se_recoje.get('tipo',"") == 'LICENCIA':
			canvas.drawString(253,PAGE_HEIGHT -498, "X")
		canvas.drawString (215,PAGE_HEIGHT -498,"LICENCIA (     )")

		if se_recoje.get('tipo',"") == 'VEHICULO':
			canvas.drawString(360,PAGE_HEIGHT -498, "X")
		canvas.drawString(320,PAGE_HEIGHT -498, "VEHICULO (    )")

		if se_recoje.get('tipo',"") == 'CORTESIA':
			canvas.drawString(460,PAGE_HEIGHT -498, "X")
		canvas.drawString(420,PAGE_HEIGHT -498, "CORTESIA  (    )")

		
		if se_recoje.get('tipo',"") == 'PAGO MOVIL':
			canvas.drawString(570,PAGE_HEIGHT -498, "X")
		canvas.drawString(520,PAGE_HEIGHT -498, "PAGO MOVIL  (    )")


		canvas.rect(10, 266, 585, 45)
		canvas.drawString(12,PAGE_HEIGHT -538, "En caso de violacion al articulo 36 del Reglamento de Transito Municipal deLeon, Guanajuato se remitio al conductor ante el Medico legista qien a traves del CERTIFICADO MEDICO")
		canvas.drawString(12,PAGE_HEIGHT -546, "NUMERO determino que ")
		print  self.data
		## LA CERTIFICACION NO ESTA EN ESTE MOMENTO
		certificado=self.data.get('certificado',"")
		if certificado['ebriedad_incompleta'] == 'si':
		 	canvas.drawString(105,PAGE_HEIGHT -554, "X" )
		canvas.drawString(15,PAGE_HEIGHT -554, "EBRIEDAD INCOMPLETA (     )" )

		 
		if certificado['ebriedad_completa'] == 'si':
			canvas.drawString(200,PAGE_HEIGHT -554, "X" )
		canvas.drawString(120,PAGE_HEIGHT -554, "EBRIEDAD COMPLETA (     )" )

		 
		if certificado['influjo_droga'] == 'si':
			canvas.drawString(315,PAGE_HEIGHT -554, "X")
		canvas.drawString(220,PAGE_HEIGHT -554, "BAJO INFLUJO DE DROGAS (    )")

		 
		if certificado['aliento_alcoholico'] == 'si':
			canvas.drawString(423,PAGE_HEIGHT -554, "X")
		canvas.drawString(340,PAGE_HEIGHT -554, "ALIENTO ALCOHOLICO (    )")

		## certificado=self.data.get('certificado',"")
		if certificado['normal'] == 'si':
			canvas.drawString(512,PAGE_HEIGHT -554, "X")
		canvas.drawString(450,PAGE_HEIGHT -554, "ESTADO NORMAL(    )")
		
		
		canvas.drawString(12,PAGE_HEIGHT -562, "Se recoje el vehiculo infraccionado y se deposita en la pension autorizada que corresponda de conformidad a los(articulos) del reglamento de Transito Municipal de Leon Guanajuato.")
		canvas.drawString(12,PAGE_HEIGHT -570, "15 Ultimo parrafo(   )")
		canvas.drawString(120,PAGE_HEIGHT -570, "18 Tercer y Cuarto Parrafo(   )")
		canvas.drawString(300,PAGE_HEIGHT -570, "36 Ultimo Parrafo")
		canvas.drawString(395,PAGE_HEIGHT -570, "44 (   )")
		canvas.drawString(470,PAGE_HEIGHT -570, "45 (   )")
		tam= PAGE_WIDTH/3
		"""
		canvas.restoreState()
Пример #7
0
    return "%s-%s: %s" % (start, end, e["summary"][:45])


def add_weather_info(canvas, x, y, weather_location):
    try:
        import pywapi
    except ImportError:
        return None

    try:
        weather_info = pywapi.get_weather_from_google(weather_location)
    except Exception, e:
        return None

    canvas.setFontSize(10)
    canvas.drawString(
        x, y,
        u"Weather for %s" % (weather_info["forecast_information"]["city"], ))
    y -= 12

    canvas.setFontSize(8)
    canvas.drawString(
        x, y, u"%s: %s, High %s°  Low %s°" %
        (weather_info["forecasts"][0]["day_of_week"],
         weather_info["forecasts"][0]["condition"],
         weather_info["forecasts"][0]["high"],
         weather_info["forecasts"][0]["low"]))
    y -= 10

    try:
Пример #8
0
    return "%s-%s: %s" % (start, end, e["summary"][:45])


def add_weather_info(canvas, x, y, weather_location):
    try:
        import pywapi
    except ImportError:
        return None

    try:
        weather_info = pywapi.get_weather_from_google(weather_location)
    except Exception, e:
        return None

    canvas.setFontSize(10)
    canvas.drawString(x, y, u"Weather for %s" % (weather_info["forecast_information"]["city"],))
    y -= 12

    canvas.setFontSize(8)
    canvas.drawString(
        x,
        y,
        u"%s: %s, High %s°  Low %s°"
        % (
            weather_info["forecasts"][0]["day_of_week"],
            weather_info["forecasts"][0]["condition"],
            weather_info["forecasts"][0]["high"],
            weather_info["forecasts"][0]["low"],
        ),
    )
Пример #9
0
def generatePage(words, canvas: canvas.Canvas, page: PageSettings, title):
    """
    :param words: matrix of words (rows * columns)
    :param canvas: PDF canvas
    :param meta: other information (e.g page title)
    :return:
    """

    if page.landscape:
        (marginR, marginT, marginL, marginB) = page.margins
        (height, width) = page.pagesize
        titleX = marginT
        titleY = width - marginR
    else:
        (marginT, marginL, marginB, marginR) = page.margins
        (width, height) = page.pagesize
        titleX = marginL
        titleY = height - marginT

    # if page.title:
    #     canvas.setFont("HatWordFont", page.titleFontSize)
    #     canvas.drawString(titleX + page.titleIndent, titleY - page.titleHeight / 2, title)

    if page.landscape:
        canvas.rotate(90)
        canvas.translate(0, -height)

    gwidth = width - marginL - marginR
    gheight = height - marginT - marginB

    goriginx = marginL
    goriginy = marginB

    # if page.title:
    #     if page.landscape:
    #         gwidth -= page.titleHeight
    #     else:
    #         gheight -= page.titleHeight

    if page.cutGrid:
        canvas.setStrokeColor(black)
        # Large bold rectangle

        canvas.setLineWidth(0.4 * mm)
        canvas.rect(goriginx, goriginy, gwidth, gheight)
        # outer cutting lines:
        canvas.setLineWidth(0.3 * mm)
        canvas.line(0, goriginy, width, goriginy)
        canvas.line(0, goriginy + gheight, width, goriginy + gheight)
        canvas.line(goriginx, 0, goriginx, height)
        canvas.line(goriginx + gwidth, 0, goriginx + gwidth, height)

    # grid
    cellWidth = gwidth / page.columns
    cellHeight = gheight / page.rows

    canvas.setLineWidth(0.2 * mm)

    canvas.grid([goriginx + i * cellWidth for i in range(page.columns + 1)],
                [goriginy + j * cellHeight for j in range(page.rows + 1)])

    # add words
    canvas.setFont("HatWordFont", page.fontSize)

    # As y starts at the end of the page, adjust for it and start from the top
    # (so that empty cells will placed be at bottom).
    yoffset = goriginy + cellHeight / 2 + cellHeight * (page.rows - 1)
    for row in words:
        xoffset = goriginx + cellWidth / 2
        for word in row:
            # scale down font size for long words
            numlines = word.count(";") + 1
            fontSize = page.fontSize
            while fontSize > 0 and max(
                    canvas.stringWidth(w, fontSize=fontSize) for w in
                    word.split(";")) >= cellWidth - 2 * page.wordMargin - 0.5:
                fontSize -= 1
            canvas.setFontSize(fontSize)
            # Somewhat cheap guess on string height : fontsize / 2
            yoff = yoffset + fontSize * numlines * 0.65 - fontSize / 2
            # print("99999999", word)
            flag = False
            for i in word.split(";"):
                print(i)
                if (flag):
                    yoff -= fontSize * 1.1
                if (i[:5] == "Место"):
                    flag = True
                else:
                    flag = False
                if (i == word.split(";")[0]):
                    canvas.setFont("HatWordFontBold", page.titleFontSize)
                    canvas.setFontSize(fontSize)
                    canvas.drawCentredString(xoffset, yoff, i)
                    yoff -= fontSize * 1.1
                else:
                    canvas.drawString(xoffset - cellWidth / 2 + 10, yoff, i)
                if (i == word.split(";")[0]):
                    canvas.setFont("HatWordFont", page.titleFontSize)
                    canvas.setFontSize(fontSize)
                yoff -= fontSize * 1.1
            xoffset += cellWidth
        yoffset -= cellHeight