import os import subprocess from datetime import datetime # In your latex_utils.py def generate_latex(cv_data): latex_template = r"""\documentclass[12pt]{resume} \usepackage[left=0.5in, right=0.5in, top=0.4in, bottom=0.4in]{geometry} \usepackage[hidelinks]{hyperref} \usepackage{enumitem} \usepackage{parskip} \usepackage{fontawesome5} \name{\parbox{\linewidth}{\centering %(name)s \\ \normalsize}} \begin{document} % Contact Info \vspace{-20pt} \begin{center} \small \href{mailto:%(email)s}{%(email)s} \textbar{} %(phone)s \textbar{} \href{%(linkedin)s}{LinkedIn} \textbar{} \href{https://github.com/}{GitHub} \end{center} \vspace{-8pt} \small % Professional Summary \begin{rSection}{Professional Summary} %(summary)s \end{rSection} %(sections)s \end{document} """ # Ensure all required fields have default values cv_data.setdefault('name', '') cv_data.setdefault('email', '') cv_data.setdefault('phone', '') cv_data.setdefault('linkedin', '') cv_data.setdefault('summary', '') # Generate sections dynamically sections = "" for section in ['skills', 'experience', 'education', 'projects']: if section in cv_data and cv_data[section]: sections += f"\\begin{{rSection}}{{{section.capitalize()}}}\n" # Add section content here sections += "% Add your section content generation logic\n" sections += "\\end{rSection}\n\n" return latex_template % { 'name': cv_data['name'], 'email': cv_data['email'], 'phone': cv_data['phone'], 'linkedin': cv_data['linkedin'], 'summary': cv_data['summary'], 'sections': sections } def compile_latex_to_pdf(tex_file, output_dir): """Compile LaTeX file to PDF using latexmk""" try: result = subprocess.run( ['latexmk', '-pdf', '-quiet', '-output-directory=' + output_dir, tex_file], cwd=output_dir, check=True, capture_output=True ) pdf_file = os.path.splitext(tex_file)[0] + '.pdf' if os.path.exists(pdf_file): return pdf_file except subprocess.CalledProcessError as e: print(f"LaTeX compilation failed: {e.stderr.decode()}") return None except Exception as e: print(f"Error during LaTeX compilation: {str(e)}") return None return None