Vi que você usou a biblioteca fpdf2 para gerar o PDF e achei que deu muito trabalho montar cada parte do PDF. Quando eu fiz geração de DANFE, usei template HTML mesmo. Usei jinja2 para renderizar o template HTML com os valores da NFe/NFS-e (variáveis passadas via context). Daí se quiser converter HTML para PDF, pode usar a biblioteca weasyprint:

from weasyprint import HTML
HTML(string=html_str).write_pdf(pdf_file_name)