terter
This commit is contained in:
50
server.js
50
server.js
@@ -371,6 +371,7 @@ app.post('/api/upload-logo', upload.single('logo'), (req, res) => {
|
||||
|
||||
// Generate PDF
|
||||
app.post('/api/quotes/:id/pdf', async (req, res) => {
|
||||
let browser;
|
||||
try {
|
||||
const quoteResult = await pool.query(
|
||||
`SELECT q.*, c.name as customer_name, c.street, c.city, c.state, c.zip_code, c.account_number
|
||||
@@ -397,38 +398,63 @@ app.post('/api/quotes/:id/pdf', async (req, res) => {
|
||||
// Generate HTML for PDF
|
||||
const html = generateQuoteHTML(quote);
|
||||
|
||||
console.log('Starting PDF generation for quote', quote.quote_number);
|
||||
|
||||
// Generate PDF with Puppeteer
|
||||
const browser = await puppeteer.launch({
|
||||
browser = await puppeteer.launch({
|
||||
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium-browser',
|
||||
headless: true,
|
||||
args: [
|
||||
'--no-sandbox',
|
||||
'--disable-setuid-sandbox',
|
||||
'--disable-dev-shm-usage',
|
||||
'--disable-gpu'
|
||||
'--disable-gpu',
|
||||
'--disable-software-rasterizer',
|
||||
'--disable-extensions'
|
||||
]
|
||||
});
|
||||
|
||||
console.log('Browser launched, creating page...');
|
||||
const page = await browser.newPage();
|
||||
await page.setContent(html, { waitUntil: 'networkidle0' });
|
||||
|
||||
await page.setContent(html, {
|
||||
waitUntil: 'networkidle0',
|
||||
timeout: 30000
|
||||
});
|
||||
|
||||
console.log('Content set, generating PDF...');
|
||||
|
||||
const pdf = await page.pdf({
|
||||
format: 'Letter',
|
||||
printBackground: true,
|
||||
preferCSSPageSize: false,
|
||||
margin: {
|
||||
top: '0',
|
||||
right: '0',
|
||||
bottom: '0',
|
||||
left: '0'
|
||||
top: '0.4in',
|
||||
right: '0.4in',
|
||||
bottom: '0.4in',
|
||||
left: '0.4in'
|
||||
}
|
||||
});
|
||||
|
||||
await browser.close();
|
||||
browser = null;
|
||||
|
||||
res.contentType('application/pdf');
|
||||
console.log('PDF generated successfully, size:', pdf.length, 'bytes');
|
||||
|
||||
res.setHeader('Content-Type', 'application/pdf');
|
||||
res.setHeader('Content-Length', pdf.length);
|
||||
res.setHeader('Content-Disposition', `attachment; filename="Quote_${quote.quote_number}.pdf"`);
|
||||
res.send(pdf);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Error generating PDF' });
|
||||
console.error('PDF Generation Error:', err);
|
||||
if (browser) {
|
||||
try {
|
||||
await browser.close();
|
||||
} catch (closeErr) {
|
||||
console.error('Error closing browser:', closeErr);
|
||||
}
|
||||
}
|
||||
res.status(500).json({ error: 'Error generating PDF: ' + err.message });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -660,7 +686,7 @@ function generateQuoteHTML(quote) {
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<div class="company-info">
|
||||
<img class="logo-size" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==">
|
||||
<div style="width: 40px; height: 40px; background-color: #1e40af; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 18px;">BA</div>
|
||||
<div class="company-details">
|
||||
<h1>Bay Area Affiliates, Inc.</h1>
|
||||
<p>1001 Blucher Street<br>
|
||||
@@ -737,4 +763,4 @@ app.listen(PORT, () => {
|
||||
process.on('SIGTERM', async () => {
|
||||
await pool.end();
|
||||
process.exit(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user