From 20977e00bdf6cbe261bb872caffe2c52a5b6d285 Mon Sep 17 00:00:00 2001 From: Alaguraj0361 Date: Mon, 18 May 2026 22:46:10 +0530 Subject: [PATCH] feat: Add local logo image and improve PDF generation layout --- logo.png | Bin 0 -> 64417 bytes pdfGenerator.js | 345 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 291 insertions(+), 54 deletions(-) create mode 100644 logo.png diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..388d42c78de6a9147dffc19a2d9a63a9547d50e0 GIT binary patch literal 64417 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 W`ea-l0Hfb6AW~xTzp6wG1OFe7rR^;M literal 0 HcmV?d00001 diff --git a/pdfGenerator.js b/pdfGenerator.js index 696b975..3974d84 100644 --- a/pdfGenerator.js +++ b/pdfGenerator.js @@ -1,14 +1,51 @@ const PDFDocument = require('pdfkit'); /** - * Generates a PDF invoice based on Shopify order data. + * Helper to draw a mock barcode in the top right corner + */ +function drawMockBarcode(doc, x, y, width, height) { + doc.save(); + let currentX = x; + const endX = x + width; + + // Draw a series of random thin/thick black lines to look like a barcode + while (currentX < endX) { + const lineWidth = Math.random() * 2 + 0.8; // 0.8 to 2.8 pixels wide + const spacing = Math.random() * 3 + 1.2; // 1.2 to 4.2 pixels spacing + + if (currentX + lineWidth > endX) break; + + doc.rect(currentX, y, lineWidth, height).fill('#000000'); + currentX += lineWidth + spacing; + } + doc.restore(); +} + +/** + * Fetch image buffer from URL safely + */ +async function fetchImageBuffer(url) { + if (!url) return null; + try { + const response = await fetch(url); + if (!response.ok) return null; + const arrayBuffer = await response.arrayBuffer(); + return Buffer.from(arrayBuffer); + } catch (err) { + console.error(`Failed to fetch image from ${url}:`, err.message); + return null; + } +} + +/** + * Generates a PDF invoice matching the user's custom layout. * @param {Object} orderData - The Shopify order payload * @returns {Promise} - A promise that resolves to a Buffer containing the PDF data */ -const generateInvoicePDF = (orderData) => { - return new Promise((resolve, reject) => { +const generateInvoicePDF = async (orderData) => { + return new Promise(async (resolve, reject) => { try { - const doc = new PDFDocument({ margin: 50 }); + const doc = new PDFDocument({ margin: 40, size: 'A4' }); let buffers = []; doc.on('data', buffers.push.bind(buffers)); @@ -17,68 +54,268 @@ const generateInvoicePDF = (orderData) => { resolve(pdfData); }); - // Invoice Header - doc.fontSize(20).text('Invoice', { align: 'right' }); - doc.moveDown(); + // Colors + const primaryColor = '#1e293b'; // Slate dark gray + const textColor = '#334155'; + const lightGray = '#cbd5e1'; + const rowAltColor = '#f8fafc'; - doc.fontSize(12) - .text(`Order Number: ${orderData.name || orderData.order_number}`) - .text(`Date: ${new Date(orderData.created_at).toLocaleDateString()}`) - .moveDown(); + // --- 1. TITLE & BARCODE --- + // Title (Left) + const isQuote = orderData.gateway === 'Request Quote' || orderData.payment_gateway_names?.includes('Request Quote'); + const titleText = isQuote ? 'Request Quote' : 'Invoice'; + + doc.fontSize(28) + .font('Helvetica-Bold') + .fillColor(primaryColor) + .text(titleText, 40, 40); - // Store Info (You can customize this) - const shopName = process.env.SHOP_NAME || 'Your Store Name'; - doc.fontSize(14).text(shopName); - doc.moveDown(); - - // Customer Info - doc.fontSize(14).text('Billed To:'); - doc.fontSize(12).text(`${orderData.billing_address?.first_name || ''} ${orderData.billing_address?.last_name || ''}`); - doc.text(`${orderData.billing_address?.address1 || ''}`); - if (orderData.billing_address?.address2) { - doc.text(`${orderData.billing_address.address2}`); - } - doc.text(`${orderData.billing_address?.city || ''}, ${orderData.billing_address?.province || ''} ${orderData.billing_address?.zip || ''}`); - doc.text(`${orderData.billing_address?.country || ''}`); + // Barcode (Right) + drawMockBarcode(doc, 380, 40, 175, 40); doc.moveDown(2); - // Line Items Table Header - doc.fontSize(12).font('Helvetica-Bold'); - doc.text('Item', 50, doc.y, { continued: true }); - doc.text('Qty', 300, doc.y, { continued: true, width: 50, align: 'right' }); - doc.text('Price', 350, doc.y, { continued: true, width: 100, align: 'right' }); - doc.text('Total', 450, doc.y, { width: 100, align: 'right' }); + // --- 2. LOGO & FROM DETAILS --- + const fromY = 110; - doc.moveTo(50, doc.y).lineTo(550, doc.y).stroke(); - doc.moveDown(0.5); + // Logo (Left) + let logoLoaded = false; + const fs = require('fs'); + const path = require('path'); + const localLogoPath = path.join(__dirname, 'logo.png'); - // Line Items Table Rows - doc.font('Helvetica'); - let currentY = doc.y; + if (fs.existsSync(localLogoPath)) { + try { + doc.image(localLogoPath, 40, fromY, { width: 130 }); + logoLoaded = true; + } catch (e) { + console.error('Error rendering local logo image:', e); + } + } + + if (!logoLoaded) { + const logoUrl = process.env.SHOP_LOGO_URL; + const logoBuffer = await fetchImageBuffer(logoUrl); + if (logoBuffer) { + try { + doc.image(logoBuffer, 40, fromY, { width: 130 }); + logoLoaded = true; + } catch (e) { + console.error('Error rendering logo image from URL:', e); + } + } + } + + if (!logoLoaded) { + // Stylish text fallback if image is missing + doc.fontSize(20) + .font('Helvetica-Bold') + .fillColor('#db2777') // Pink accent + .text('RAY AARI SHOP', 40, fromY); + } + + // From Address (Right) + doc.fontSize(10) + .font('Helvetica-Bold') + .fillColor(primaryColor) + .text('From', 380, fromY) + .font('Helvetica') + .fillColor(textColor) + .text('Ray Aari Shop', 380, fromY + 15) + .text('Sivanatham Salai', 380, fromY + 28) + .text('Arappalayam Cross Rd, Near : Madura Coats pvt', 380, fromY + 41, { width: 175 }) + .text('Madurai 625016', 380, fromY + 67) + .text('Tamil Nadu, India', 380, fromY + 80) + .text('9994333548', 380, fromY + 93); + + // --- 3. BILL TO & ORDER DETAILS --- + const detailsY = 240; + + // Bill To (Left) + const billing = orderData.billing_address || {}; + doc.fontSize(11) + .font('Helvetica-Bold') + .fillColor(primaryColor) + .text('Bill to', 40, detailsY); + + doc.fontSize(10) + .font('Helvetica') + .fillColor(textColor); + let billTextY = detailsY + 18; + if (billing.first_name || billing.last_name) { + doc.text(`${billing.first_name || ''} ${billing.last_name || ''}`, 40, billTextY); + billTextY += 13; + } + if (billing.address1) { + doc.text(billing.address1, 40, billTextY); + billTextY += 13; + } + if (billing.address2) { + doc.text(billing.address2, 40, billTextY); + billTextY += 13; + } + if (billing.city || billing.province || billing.zip) { + doc.text(`${billing.city || ''} ${billing.province || ''} ${billing.zip || ''}`, 40, billTextY); + billTextY += 13; + } + if (billing.country) { + doc.text(billing.country, 40, billTextY); + billTextY += 13; + } + if (orderData.email || orderData.contact_email) { + doc.text(orderData.email || orderData.contact_email, 40, billTextY); + billTextY += 13; + } + if (billing.phone || orderData.phone) { + doc.text(billing.phone || orderData.phone, 40, billTextY); + } + + // Order Details (Right) + const orderDateStr = new Date(orderData.created_at).toLocaleDateString('en-GB'); // DD-MM-YYYY + const gatewayName = orderData.gateway || 'Request Quote'; + + doc.fontSize(14) + .font('Helvetica-Bold') + .fillColor(primaryColor) + .text(`Order no: ${orderData.order_number}`, 380, detailsY) + .fontSize(10) + .font('Helvetica-Bold') + .text('Order date: ', 380, detailsY + 22, { continued: true }) + .font('Helvetica') + .fillColor(textColor) + .text(orderDateStr) + .font('Helvetica-Bold') + .fillColor(primaryColor) + .text('Payment method: ', 380, detailsY + 37, { continued: true }) + .font('Helvetica') + .fillColor(textColor) + .text(gatewayName); + + // --- 4. PRODUCT TABLE --- + let tableY = 380; + + // Table Headers + doc.fontSize(9) + .font('Helvetica-Bold') + .fillColor(primaryColor); + + doc.text('S.No', 40, tableY, { width: 35 }); + doc.text('Image', 85, tableY, { width: 60 }); + doc.text('Product', 155, tableY, { width: 200 }); + doc.text('Quantity', 365, tableY, { width: 50, align: 'right' }); + doc.text('Unit price', 425, tableY, { width: 60, align: 'right' }); + doc.text('Total price', 495, tableY, { width: 60, align: 'right' }); + + // Line below header + doc.moveTo(40, tableY + 12) + .lineTo(555, tableY + 12) + .lineWidth(0.8) + .strokeColor(lightGray) + .stroke(); + + tableY += 20; + + // Currency formatting symbol + const currencySymbol = orderData.currency === 'INR' ? 'Rs. ' : `${orderData.currency} `; + + // Table Rows if (orderData.line_items && orderData.line_items.length > 0) { - orderData.line_items.forEach(item => { - doc.text(item.name, 50, currentY, { width: 250 }); - doc.text(item.quantity.toString(), 300, currentY, { width: 50, align: 'right' }); - doc.text(`${orderData.currency} ${parseFloat(item.price).toFixed(2)}`, 350, currentY, { width: 100, align: 'right' }); - const total = parseFloat(item.price) * item.quantity; - doc.text(`${orderData.currency} ${total.toFixed(2)}`, 450, currentY, { width: 100, align: 'right' }); + for (let i = 0; i < orderData.line_items.length; i++) { + const item = orderData.line_items[i]; - doc.moveDown(0.5); - currentY = doc.y; - }); + // Fetch product image buffer + let imageBuffer = null; + if (item.image) { + imageBuffer = await fetchImageBuffer(item.image); + } else if (item.featured_image && item.featured_image.url) { + imageBuffer = await fetchImageBuffer(item.featured_image.url); + } + + // Background color for alternating rows + if (i % 2 === 1) { + doc.rect(40, tableY - 4, 515, 38).fill(rowAltColor); + } + + doc.fontSize(9) + .font('Helvetica') + .fillColor(textColor); + + // S.No + doc.text((i + 1).toString(), 40, tableY); + + // Image + if (imageBuffer) { + try { + doc.image(imageBuffer, 85, tableY - 2, { fit: [35, 30] }); + } catch (err) { + console.error('Failed to draw item image:', err); + } + } + + // Product Name and Variant/Quantity details + const productText = item.title || item.name; + doc.text(productText, 155, tableY, { width: 200, height: 15, ellipsis: true }); + + // Display quantity/variant info if available + if (item.variant_title) { + doc.fontSize(8) + .fillColor('#64748b') + .text(item.variant_title, 155, tableY + 12, { width: 200 }); + } + + // Reset font size + doc.fontSize(9).fillColor(textColor); + + // Quantity + doc.text(item.quantity.toString(), 365, tableY, { width: 50, align: 'right' }); + + // Unit Price + const unitPrice = parseFloat(item.price).toFixed(2); + doc.text(`${currencySymbol}${unitPrice}`, 425, tableY, { width: 60, align: 'right' }); + + // Total Price + const totalPrice = (parseFloat(item.price) * item.quantity).toFixed(2); + doc.text(`${currencySymbol}${totalPrice}`, 495, tableY, { width: 60, align: 'right' }); + + // Divider Line + doc.moveTo(40, tableY + 28) + .lineTo(555, tableY + 28) + .lineWidth(0.5) + .strokeColor('#f1f5f9') + .stroke(); + + tableY += 34; + } } - doc.moveTo(50, currentY).lineTo(550, currentY).stroke(); - doc.moveDown(1); + // --- 5. TOTALS SECTION --- + tableY += 10; - // Totals - doc.text(`Subtotal: ${orderData.currency} ${orderData.subtotal_price}`, { align: 'right' }); - if (orderData.total_tax > 0) { - doc.text(`Tax: ${orderData.currency} ${orderData.total_tax}`, { align: 'right' }); - } - doc.text(`Shipping: ${orderData.currency} ${orderData.total_shipping_price_set?.shop_money?.amount || '0.00'}`, { align: 'right' }); - doc.font('Helvetica-Bold').text(`Total: ${orderData.currency} ${orderData.total_price}`, { align: 'right' }); + doc.fontSize(10) + .font('Helvetica') + .fillColor(textColor); + + // Subtotal + doc.text('Subtotal', 365, tableY, { width: 100, align: 'right' }); + doc.font('Helvetica-Bold') + .text(`${currencySymbol}${parseFloat(orderData.subtotal_price).toFixed(2)}`, 480, tableY, { width: 75, align: 'right' }); + + // Divider + doc.moveTo(365, tableY + 15) + .lineTo(555, tableY + 15) + .lineWidth(0.5) + .strokeColor(lightGray) + .stroke(); + + tableY += 22; + + // Total + doc.fontSize(11) + .font('Helvetica-Bold') + .fillColor(primaryColor); + + doc.text('Total', 365, tableY, { width: 100, align: 'right' }); + doc.text(`${currencySymbol}${parseFloat(orderData.total_price).toFixed(2)}`, 480, tableY, { width: 75, align: 'right' }); doc.end(); } catch (error) {