79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
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
|
|
});
|
|
}
|