diff --git a/src/pif_compiler/api/routes/common.py b/src/pif_compiler/api/routes/common.py index b3b100f..5c32a47 100644 --- a/src/pif_compiler/api/routes/common.py +++ b/src/pif_compiler/api/routes/common.py @@ -56,7 +56,7 @@ async def generate_pdf_endpoint(request: GeneratePdfRequest): logger.info(f"API request received to generate PDF: name='{request.name}', link='{request.link}'") try: - result = generate_pdf(request.link, request.name) + result = await generate_pdf(request.link, request.name) if result: file_path = f"pdfs/{request.name}.pdf" diff --git a/src/pif_compiler/functions/common_func.py b/src/pif_compiler/functions/common_func.py index 692c1e5..8cb8683 100644 --- a/src/pif_compiler/functions/common_func.py +++ b/src/pif_compiler/functions/common_func.py @@ -1,25 +1,44 @@ -from playwright.sync_api import sync_playwright +from playwright.async_api import async_playwright import os from pif_compiler.functions.common_log import get_logger log = get_logger() -def generate_pdf(link : str, name : str): - if os.path.exists(f'pdfs/{name}.pdf'): +async def generate_pdf(link: str, name: str): + """ + Generate a PDF from a web page URL using Playwright. + + Args: + link: URL of the page to convert to PDF + name: Name for the generated PDF file (without extension) + + Returns: + bool: True if PDF was generated or already exists, False otherwise + """ + pdf_path = f'pdfs/{name}.pdf' + + if os.path.exists(pdf_path): log.info(f"PDF already exists for {name}, skipping generation.") return True - else: - log.info(f"Generating PDF for {name} from link: {link}") - with sync_playwright() as p: - browser = p.chromium.launch() - page = browser.new_page() - page.goto(link) - page.pdf(path=f'pdfs/{name}.pdf') - browser.close() - if os.path.exists(f'pdfs/{name}.pdf'): - log.info(f"PDF generated for {name}") + + log.info(f"Generating PDF for {name} from link: {link}") + + try: + async with async_playwright() as p: + browser = await p.chromium.launch() + page = await browser.new_page() + await page.goto(link, wait_until='networkidle') + await page.pdf(path=pdf_path) + await browser.close() + + if os.path.exists(pdf_path): + log.info(f"PDF generated successfully for {name}") return True else: - log.error(f"PDF generation failed for {name}") - return False \ No newline at end of file + log.error(f"PDF generation failed for {name}: file not found after generation") + return False + + except Exception as e: + log.error(f"Error generating PDF for {name}: {str(e)}", exc_info=True) + return False \ No newline at end of file