import base64 import io import locale from datetime import date from uuid import uuid4 import qrcode from jinja2 import Template from PIL import Image from weasyprint import HTML locale.setlocale(locale.LC_TIME, 'pt_BR') today = date.today() with open('nr10_complementar_sep.html', encoding='utf-8') as f: html = f.read() def cpf_fmt(s: str) -> str: """Returns a string as a Brazilian CPF number.""" return '{}.{}.{}-{}'.format(s[:3], s[3:6], s[6:9], s[9:]) qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=10, border=3, ) qr.add_data('https://eduseg.com.br') qr.make(fit=True) img = qr.make_image(fill_color='black', back_color='white') img = img.resize((120, 120), Image.NEAREST) buffer = io.BytesIO() img.save(buffer, format='PNG') img_str = base64.b64encode(buffer.getvalue()).decode('utf-8') qrcode_base64 = f'data:image/png;base64,{img_str}' template = Template(html) html_rendered = template.render( id=uuid4(), name='Sérgio Rafael de Siqueira', cpf=cpf_fmt('07879819908'), progress=91.99, course='NR-10 Complementar (SEP)', today=today.strftime('%-d de %B de %Y'), started_date=today.strftime('%d/%m/%Y'), finished_date=today.strftime('%d/%m/%Y'), qrcode=qrcode_base64, ) HTML(string=html_rendered, base_url='').write_pdf('cert.pdf')