HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/good-life-be/helper/pdfGeneration.js
/* eslint-disable import/no-extraneous-dependencies */
import ejs from 'ejs';
import fs, { readFileSync } from 'fs';
import imageToBase64 from 'image-to-base64';
import path, { dirname, join } from 'path';
import puppeteer from 'puppeteer';
import { fileURLToPath } from 'url';

const getBase64FromImageUrl = async (url) => {
  const base64Image = await imageToBase64(url);

  // Check if it's an SVG image and encode it accordingly
  if (url.endsWith('.svg')) {
    return base64Image.startsWith('data:image/svg+xml;base64,')
      ? base64Image
      : `data:image/svg+xml;base64,${base64Image}`;
  }
  // Handle PNG and other image formats (as per your original code)
  return base64Image.startsWith('data:image/png;base64,')
    ? base64Image
    : `data:image/png;base64,${base64Image}`;
};

export const generatePDF = async (data, htmlFilePath) => {
  const browser = await puppeteer.launch({
    headless: true, // Set to true or false based on your needs
    executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-profile',
      '--aggressive-cache-discard',
      '--disable-cache',
      '--media-cache-size=0',
      '--disk-cache-size=0',
      '--aggressive-cache-discard',
      '--disable-application-cache',
      '--disable-offline-load-stale-cache',
      '--disable-gpu-shader-disk-cache',
    ],
    timeout: 6000000,
  });

  const page = await browser.newPage();

  await page.setDefaultNavigationTimeout(6000000);
  await page.setDefaultTimeout(6000000);

  const htmlTemplate = readFileSync(htmlFilePath, 'utf-8');

  const base64Images = await Promise.all(
    data.imageUrls.map((url) => getBase64FromImageUrl(url))
  );

  data = { ...data, base64Images };

  const renderedHTML = ejs.render(htmlTemplate, {
    data,
  });

  // ejs.renderFile(htmlFilePath, { data }, (err, html) => {
  //   if (err) {
  //     console.error('Error rendering EJS:', err);
  //     return;
  //   }

  //   // Write the generated HTML to a file
  //   fs.writeFileSync('output.html', html);
  //   console.log('HTML file generated successfully!');
  // });

  await page.setContent(renderedHTML, {
    waitUntil: 'domcontentloaded',
    timeout: 6000000,
  });

  const pdfBuffer = await page.pdf({
    timeout: 6000000, // Set a high timeout
  }); // Generate PDF

  await browser.close();

  return pdfBuffer;
};

export const deletePdfs = () => {
  const currentModuleDirectory = dirname(fileURLToPath(import.meta.url));

  const folderPath = join(
    currentModuleDirectory,
    '..',
    'public',
    'calendarPDF'
  );

  fs.readdir(folderPath, (err, files) => {
    if (err) {
      console.error('Error reading directory:', err);
      return;
    }
    files.forEach((file) => {
      const filePath = path.join(folderPath, file);

      fs.unlink(filePath, (unlinkErr) => {
        if (unlinkErr) {
          console.error(`Error deleting file ${file}:`, unlinkErr);
        } else {
          console.log(`Successfully deleted file: ${file}`);
        }
      });
    });
  });
};