import path from 'path'; import fs from 'fs'; import puppeteer from 'puppeteer'; import { sanitizeFilename } from '@/app/(presentation-generator)/utils/others'; import { NextResponse, NextRequest } from 'next/server'; export async function POST(req: NextRequest) { const { id, title } = await req.json(); console.log('path', process.env.APP_DATA_DIRECTORY); if (!id) { return NextResponse.json({ error: "Missing Presentation ID" }, { status: 400 }); } const browser = await puppeteer.launch({ headless: true, args: [ '--no-sandbox', '--disable-web-security', ] }); const page = await browser.newPage(); await page.setViewport({ width: 1280, height: 720 }); await page.goto(`http://localhost/pdf-maker?id=${id}`, { waitUntil: 'networkidle0', timeout: 80000 }); await page.waitForFunction('() => document.readyState === "complete"') try { await page.waitForFunction( ` () => { const allElements = document.querySelectorAll('*'); let loadedElements = 0; let totalElements = allElements.length; for (let el of allElements) { const style = window.getComputedStyle(el); const isVisible = style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0'; if (isVisible && el.offsetWidth > 0 && el.offsetHeight > 0) { loadedElements++; } } return (loadedElements / totalElements) >= 0.95; } `, { timeout: 10000 } ); await new Promise(resolve => setTimeout(resolve, 1000)); } catch (error) { console.log("Warning: Some content may not have loaded completely:", error); } const pdfBuffer = await page.pdf({ width: "1280px", height: "720px", printBackground: true, margin: { top: 0, right: 0, bottom: 0, left: 0 }, }); browser.close(); const sanitizedTitle = sanitizeFilename(title); const destinationPath = path.join(process.env.APP_DATA_DIRECTORY!, 'exports', `${sanitizedTitle}.pdf`); console.log('destinationPath', destinationPath); await fs.promises.writeFile(destinationPath, pdfBuffer); return NextResponse.json({ success: true, path: destinationPath }); }