es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un PDF a partir de una plantilla DOCX utilizando Python?

Tengo un script que funciona cuando genero un docx a partir de una plantilla de docx. Sin embargo, el PDF no está funcionando, intenté convertir el documento de Word a PDF, pero esto requiere Microsoft. Y en mi Linux no tengo esta opción.
Este es el script, por favor, aconseje cuál es la mejor manera de convertir el documento de Word a PDF.

from docxtpl import DocxTemplate
from docx2pdf import convert

async def generate_template(resume: Resume):
    name = resume.name;
    pdfFile = 'static/cvs/' + name + '.pdf'
    wordFile = 'static/cvs/' + name + '.docx'

    print (resume)
    # Test para crear un documento de Word a partir de una plantilla.
    tpl = DocxTemplate('../templates/' + resume.templateName + '.docx')

    tpl.render(resume)
    tpl.save(wordFile)
    if resume.templateType == "pdf":
        try:
            print ("Convirtiendo documento de Word a PDF...")

            convert(wordFile, pdfFile)
            return {"success": True, "doc": pdfFile}
        except Exception as e:
            print("¡Conversión fallida!")
            return {"error": e}

    return {"success": True, "doc": wordFile}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en Python y PDF, la mejor manera de convertir un archivo .docx a un archivo .pdf sin depender de software propietario como Microsoft Office en Linux es utilizar un paquete de Python como pydocx o python-docx para leer el archivo Docx y generar un PDF utilizando un paquete separado de generación de PDF como weasyprint, reportlab o xhtml2pdf.

    Primero, deberás instalar estos paquetes usando pip:

    pip install python-docx
    pip install weasyprint
    

    Luego, modifica la función generate_template():

    from docx import Document
    import os
    from weasyprint import HTML
    
    async def generate_template(resume: Resume):
        name = resume.name;
        pdfFile = 'static/cvs/' + name + '.pdf'
        wordFile = 'static/cvs/' + name + '.docx'
    
        # Prueba para crear un documento Word a partir de una plantilla.
        tpl = DocxTemplate('../templates/' + resume.templateName + '.docx')
    
        tpl.render(resume)
        tpl.save(wordFile)
    
        if resume.templateType == "pdf":
            try:
                print("Convirtiendo documento Word a PDF...")
    
                # abrir el documento Word como un objeto Document de python-docx
                doc = Document(wordFile)
    
                # guardar el objeto Document como una cadena HTML
                html = ""
                for p in doc.paragraphs:
                    html += "<p>" + p.text + "</p>"
                for table in doc.tables:
                    html += "<table>"
                    for row in table.rows:
                        html += "<tr>"
                        for cell in row.cells:
                            html += "<td>" + cell.text + "</td>"
                        html += "</tr>"
                    html += "</table>"
                html += '<style type="text/css">table {border-collapse: collapse;}</style>'
    
                # generar un PDF a partir del HTML usando weasyprint
                HTML(string=html).write_pdf(pdfFile)
    
                return {"success": True, "doc": pdfFile}
            except Exception as e:
                print("¡La conversión falló!")
                return {"error": e}
    
        return {"success": True, "doc": wordFile}
    

    Esta función modificada lee el archivo .docx generado con el paquete python-docx y convierte el contenido del documento en una cadena HTML. El HTML resultante se convierte luego en un archivo .pdf utilizando la función weasyprint.HTML().write_pdf().

    Con esta modificación, el script ahora debería ser capaz de generar archivos .pdf en Linux sin depender de Microsoft Office.

Comments are closed.