def draw_right_image(self, canvas, url, x, y, w, h, x_padding=0, y_padding=0, title=''): try: canvas.drawImage(url, x + x_padding, y - h - y_padding, w, h, preserveAspectRatio=True) except: canvas.roundRect(x + x_padding, y - y_padding - h, w, h, 0, stroke=1, fill=0) canvas.line(x + x_padding, y - y_padding + h - h, x + x_padding + w, y - y_padding - h) canvas.line(x + x_padding, y - y_padding - h, x + x_padding + w, y - y_padding + h - h)
def title(canvas, doc): canvas.saveState() lemma_img = 'L:/resources/code/models/accuracy_assessment/report/images/' lemma_img += 'lemma_logo.gif' # Page background canvas.setStrokeColor(colors.black) canvas.setLineWidth(1) canvas.setFillColor('#e6ded5') canvas.roundRect(0.5 * u.inch, 0.5 * u.inch, 7.5 * u.inch, 10.0 * u.inch, 0.15 * u.inch, stroke=1, fill=1) # Page banner - image canvas.drawImage(lemma_img, 0.5 * u.inch, 7.5 * u.inch, width=7.5 * u.inch, height=3 * u.inch, mask='auto') canvas.restoreState()
def roundedBox(canvas, x0=4.5 * cm, y0=2.5 * cm, width=12.5 * cm, heigh=1.63 * cm, linewidth=1.5, radius=0.25 * cm): canvas.setLineWidth(linewidth) canvas.roundRect(x0, y0, width, heigh, radius)
def _draw_single_border(self, canvas, x, width, height): canvas.saveState() if type(self.BORDER_COLOR) == str: canvas.setFillColor(self.BORDER_COLOR) else: canvas.setFillColorRGB(self.BORDER_COLOR[0]/255, self.BORDER_COLOR[1]/255, self.BORDER_COLOR[2]/255) canvas.roundRect(x, 0, width, height, self.CARD_CORNER_DIAMETER, stroke=0, fill=1) canvas.restoreState()
def _draw_single_border(self, canvas, x, width, height): canvas.saveState() canvas.setFillColor(self.border_color) canvas.roundRect( x, 0, width, height, max(self.CARD_CORNER_DIAMETER - self.bleed, 0.0 * mm), stroke=0, fill=1, ) canvas.restoreState()
def landscape(canvas, doc): canvas.saveState() # Page background canvas.setStrokeColor(colors.black) canvas.setLineWidth(1) canvas.setFillColor('#e6ded5') canvas.roundRect(0.5 * u.inch, 0.5 * u.inch, 10.0 * u.inch, 7.5 * u.inch, 0.15 * u.inch, stroke=1, fill=1) canvas.restoreState()
def titulo_pdf_proovedor(canvas, doc): datos = DATOS_DE_LA_EMPRESA.objects.get(pk=1) membrete= '%s \n RIF %s \n DIRECCION: %s \n TELEFONOS: %s / %s \n ZONA POSTAL: %s'%(datos.NOMBRE.upper(), datos.RIF.upper(), datos.DIRECCION.upper(), datos.TELEFONO, datos.CELULAR, datos.CODIGO_POSTAL) nombre= datos.NOMBRE.upper() rif = 'RIF: %s'% (datos.RIF.upper()) direccion= 'DIRECCION: %s'% (datos.DIRECCION.upper()) telefonos = '%s / %s'% (datos.TELEFONO, datos.CELULAR) codigo_postal='CODIGO POSTAL: %s'% (datos.CODIGO_POSTAL) canvas.saveState() canvas.setFillColorRGB(0,0,0) #canvas.drawCentredString(50, PAGE_HEIGHT-150, membrete) #canvas.drawString(100, 800, str(libro.titulo))#Obtenemos el titulo de un libro y lap.drawImage(str(libro.portada.url), 100, 100, width=400, height=600) # mostramos y guardamos el objeto PDF. canvas.setFont('Times-Bold',12) canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-110, nombre) canvas.roundRect(0, 750, 694, 120, 20, stroke=0, fill=1) canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-130, rif) textobject = canvas.beginText() textobject.setTextOrigin(inch, 400) textobject.setFont("Helvetica-Oblique", 14) for line in direccion: textobject.textLine(line) textobject.setFillGray(0.4) textobject.textLines(direccion) canvas.drawText(textobject) #canvas.drawString(100, 100, direccion) canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-170, telefonos) canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-190, codigo_postal) canvas.drawString(12, 10 * 50, "First Page / %s" % membrete) canvas.restoreState()
side = 'A' # day = startdate + timedelta(days=leday) # day2 = startdate + timedelta(days=pages) + timedelta(days=leday) bx = bindpad by = pad tx = w/2 - (bindpad+pad) ty = h - pad*2 print("Bottom x,y =%s,%s" %(bx, by)) print("Top x,y =%s,%s" %(tx, ty)) canvas.roundRect(bx, by, tx, ty, 9, stroke=1, fill=0) ts = day.strftime("%A %B %d, %Y") print(ts) canvas.drawString(bindpad+10,ty ,ts) #canvas.setFillColor(black) #ADD LINES hours = ['8','9','10','11','12','1','2','3','4','5',] i=0 for hour in hours: i=i+1 print(i) y = h - pad - i*50
def beforeDrawPage(self, canvas, doc): BaseInvoiceTemplate.beforeDrawPage(self, canvas, doc) self.rcptFrame.addFromList(self.rcpttext, canvas) with save_state(canvas): p = canvas.beginPath() to = canvas.beginText() to.setTextOrigin(20 * mm, self.height - 44 * mm) to.setFont('Helvetica', 8) to.textOut(_(u'Your reference')) to.setFont('Helvetica', 10) to.textOut(' ') to.textLine(self.buyerref) to.setFont('Helvetica', 8) to.textLine(_(u'Your notes')) paragraphs = [ Paragraph(line, self.styles['Normal']) for line in self.annotation ] self.annotationframe.addFromList(paragraphs, canvas) canvas.drawText(to) if self.pgnum and self.total != 0: ypos = self.height - 75 * mm - 5 to = canvas.beginText() to.setTextOrigin(20 * mm, ypos) to.setFont('Helvetica', 10) to.textLine('Betalas till') to.setFont('Helvetica-Bold', 12) to.textOut('Pg ' + formatters.pgnum(self.pgnum)) to.setTextOrigin(55 * mm, ypos) to.setFont('Helvetica', 10) to.textLine('OCR / referens') to.setFont('Helvetica-Bold', 12) to.textOut(self.ocr) to.setTextOrigin(85 * mm, ypos) to.setFont('Helvetica', 10) to.textLine('Att betala') to.setFont('Helvetica-Bold', 12) to.textLine(formatters.money(self.total, True)) ypos = to.getY() - 5 if self.expiryDate: to.setTextOrigin(20 * mm, ypos) to.setFont('Helvetica', 10) to.textLine(u'Förfallodatum') to.setFont('Helvetica-Bold', 12) to.textLine(formatters.date(self.expiryDate)) latestyle = ParagraphStyle('Late', fontName='Helvetica', fontSize=8, leading=9) lateframe = Frame(45 * mm, ypos - 15, 65 * mm, 22, id='latefee', leftPadding=0, bottomPadding=0, rightPadding=0, topPadding=0, showBoundary=self.showBoundary) lateframe.addFromList([Paragraph(self.latefee, latestyle)], canvas) canvas.drawText(to) canvas.roundRect(17 * mm, ypos - 21, 100 * mm + 68, 68, 6) # Need to set ECI to UTF-8 # seee https://github.com/zxing/zxing/blob/3de3374dd25739bde952c788c1064cb17bc11ff8/core/src/main/java/com/google/zxing/qrcode/decoder/Mode.java # etc, update qrcode encoder... qd = Drawing() # No border, deal with quiet zone manually data = [QRECI(26), QR8bitByte(self.qrcode)] q = qr.QrCodeWidget(data, barLevel='L', barBorder=4.0, barWidth=68.0, barHeight=68.0) qd.add(q) renderPDF.draw(qd, canvas, 117 * mm, ypos - 21) qrstyle = ParagraphStyle('QR', fontName='Helvetica', fontSize=10, leading=12) qrinfoframe = Frame(145 * mm, ypos - 21, self.width - 160 * mm, 68, id='qrinfo', topPadding=0, leftPadding=0, bottomPadding=0, rightPadding=0, showBoundary=self.showBoundary) qrinfoframe.addFromList([ Paragraph( u'Om du betalar med bankapp kan du skanna QR-koden ' u'bredvid eller OCR-raden nedan. ' u'Läs mer om QR-koden på http://usingqr.se', qrstyle) ], canvas) # http://www.nordea.se/sitemod/upload/root/content/nordea_se/foretag/programleverantorer/filer/ocr_totalin.pdf to = canvas.beginText() to.setTextOrigin(10 * mm, self.height - 105 * mm) to.setFont('OCRB', 10) # 7777777777666666666655555555554444444444333333333322222222221111111111000000000 # 9876543210987654321098765432109876543210987654321098765432109876543210987654321 # '# 123456789012 #12345678 50 9 > 12345678 #14# ' # # ooooooooooooooooooooooooo #kkkkkkkk öö c > PpppppppP#tt# ocrformat = '# {ocr:>25} #{totalkr:>8} {totaldec:<02} {totalcheck:1} > {pgnum:>23} #14# ' totalkr = str(int(self.total)) # integer part of Decimal totaldec = str(int(self.total % 1 * 100)) # fraction part of Decimal totalcheck = luhn.luhn_checksum( str(self.total).replace('.', '') + '0') ocrkeys = { 'ocr': self.ocr, 'totalkr': totalkr, 'totaldec': totaldec, 'totalcheck': totalcheck, 'pgnum': self.pgnum } ocrline = ocrformat.format(**ocrkeys) assert len(ocrline) == 79 to.textLine(ocrline) canvas.drawText(to)
def make_a_table(canvas, ncol, nrow, entries, str_index): width, height = A4 cell_size = 16 * mm table_data = [] for i in range(nrow): row = [] for j in range(ncol): if 1 < j < ncol - 1: row.append('') else: try: row.append(entries[i]) except: row.append('') table_data.append(row) kanji_tbl_style = [] kanji_tbl_style.append(('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black)) kanji_tbl_style.append(('BOX', (0, 0), (-1, -1), 0.25, colors.black)) for i in range(ncol): kanji_tbl_style.append(('ALIGN', (i, 0), (i, -1), 'CENTER')) kanji_tbl_style.append(('VALIGN', (i, 0), (i, -1), 'BOTTOM')) kanji_tbl_style.append(('FONT', (i, 0), (i, -1), 'Stroke', 36)) if i == ncol - 1: kanji_tbl_style.append(('TEXTCOLOR', (i, 0), (i, -1), NAVY)) elif i < 2: kanji_tbl_style.append(('TEXTCOLOR', (i, 0), (i, -1), GRAY)) kanji_tbl = Table(table_data, colWidths=cell_size, rowHeights=cell_size) kanji_tbl.setStyle(TableStyle(kanji_tbl_style)) kanji_tbl.wrapOn(canvas, width, height) table_x, table_y = 12 * mm, 21 * mm kanji_tbl.drawOn(canvas, table_x, table_y) kanji_info = [] info_tbl_style = [] info_style = ParagraphStyle( name='Info', fontName='Hiragino', fontSize=7, ) for i in range(nrow): try: text = Paragraph(kanji_lookup[entries[i]], info_style) kanji_info.append([text]) except: kanji_info.append(['']) info_tbl_style.append(('VALIGN', (0, 0), (-1, -1), 'TOP')) info_tbl = Table(kanji_info, colWidths=50 * mm, rowHeights=cell_size) info_tbl.setStyle(TableStyle(info_tbl_style)) info_tbl.wrapOn(canvas, width, height) info_tbl.drawOn(canvas, table_x + cell_size * ncol, table_y) for i in range(nrow): coord_trans = (table_x + cell_size * ncol + 50 * mm, table_y + cell_size * i) if i % 2 == 1: char_x = table_x + cell_size * ncol + 5 * mm else: char_x = table_x + cell_size * ncol + 22 * mm coord_char = (char_x, table_y + cell_size * i + 2 * mm) try: kanji = entries[nrow - i - 1] canvas.setFillColor(BLACK) canvas.setFont('Times-Italic', 8) canvas.drawRightString(*coord_trans, trans_lookup[kanji]) if kanji in font_lookup['bone']: canvas.setFillColor(GREEN30) canvas.setFont('Bone', 55) elif kanji in font_lookup['tenbun']: canvas.setFillColor(RED30) canvas.setFont('Tenbun', 55) else: continue canvas.drawString(*coord_char, kanji) except: pass sep_x = table_x + cell_size * ncol + 0.5 * mm canvas.setLineWidth(0.1 * mm) canvas.line(sep_x, table_y, sep_x, table_y + cell_size * nrow) canvas.setFillColor(LIGHTGRAY) rect_x, rect_y = table_x, height - 16 * mm canvas.roundRect(rect_x, rect_y, 70 * mm, 10 * mm, 1 * mm, fill=1, stroke=0) canvas.setFont('Hiragino', 12) canvas.setFillColor(BLACK) canvas.drawString(rect_x + 2 * mm, rect_y + 3 * mm, "Joytan Kanji Practice | 漢字練習帳") # Name with underline canvas.setLineWidth(0.1 * mm) canvas.setFillColor(BLACK) canvas.setFont('Hiragino', 10) name_x, name_y = width - 90 * mm, height - 14 * mm canvas.drawString(name_x, name_y, "名前:") canvas.line(name_x, name_y - 2 * mm, name_x + 70 * mm, name_y - 2 * mm) # Left footer canvas.setFont('Helvetica-Bold', 10) coord_msg = (table_x, table_y - 5 * mm) canvas.drawString( *coord_msg, "Support our project: https://kokimame.github.io/joytan/") coord_index = (table_x, table_y - 12 * mm) canvas.drawString(*coord_index, "%s | © Joytan" % str_index) # Right footer coord_l1 = (width - 20 * mm, table_y - 5 * mm) coord_l2 = (width - 20 * mm, table_y - 10 * mm) coord_l3 = (width - 20 * mm, table_y - 13 * mm) canvas.setFont('Hiragino', 9) canvas.drawRightString(*coord_l1, "【部首】/画数/学年 オンヨミ くんよみ") canvas.setFont('Hiragino', 8) canvas.drawRightString( *coord_l2, "【radical】/#stroke/grade Onyomi(Katakana) Kunyomi (Hiragana)") canvas.setFont('Times-Italic', 7) canvas.drawRightString(*coord_l3, "* Rough kanji-wise translation") # Additional lines canvas.setDash([0.1 * mm, 1.2 * mm]) canvas.setLineCap(1) # Dotted vertical lines for i in range(ncol): x = table_x + cell_size / 2 + cell_size * i canvas.line(x, table_y, x, table_y + nrow * cell_size) # Dotted horizontal lines for i in range(nrow): trans_y = table_y + cell_size / 2 + cell_size * i canvas.line(table_x, trans_y, table_x + ncol * cell_size, trans_y) # Separation between the Info panel for i in range(nrow + 1): x = table_x + cell_size * ncol trans_y = table_y + cell_size * i canvas.line(x, trans_y, x + 50 * mm, trans_y) canvas.showPage()