Contents

Disabling Error Notification Toast when Generating PDF from a Vue Project

Intro

When generating a PDF from a webpage using Puppeteer in a Vue project, it’s often desirable to prevent the display of any error notification popups. This was the challenge I encountered. Specifically, in a Vue project, when a REST API call failed, a notification popup would appear on the browser screen. If a PDF version of the webpage needed to be generated, this popup would persist in the output. An example of this scenario is illustrated below: https://raw.githubusercontent.com/williamyuaus/blog-img/master/img/202308111144239.png

Approach

My solution involved utilizing a media query. Initially, I attempted to conditionally disable the notification based on the screen size. I added the following CSS code to App.vue:

<style>
@media only screen and (max-width: 596px) {
  .toastNotification {
    display: none !important;
  }
}
</style>

Here, max-width: 596px corresponds to the dimensions of the PDF report (595px * 842px). In this project, the vue-toastification library is employed for toast notifications. In the main.ts file, the configuration is defined as follows:

...
import Toast from 'vue-toastification';
...
app.use(Toast, {
  transition: 'Vue-Toastification__fade',
  maxToasts: 20,
  newestOnTop: true,
  toastClassName: 'toastNotification',
});

However, this approach proved ineffective. I suspected that additional Puppeteer configurations might be required. I experimented with the setViewport function and adjusted the width and length parameters for the page.pdf function. My attempts included the following:

const browser = await puppeteer.launch({
        executablePath: '/usr/bin/google-chrome',
        headless: 'new', args: ['--no-sandbox', '--disable-setuid-sandbox'],
        defaultViewport: null
    });
const page = await browser.newPage();

await page.setViewport({ width: 595, height: 842 });
await page.goto(url, {waitUntil: 'networkidle0', timeout: 0});

...


const pdfBuffer = await page.pdf({
    printBackground: true,
    format: 'A4',
    width: '595px',
    height: '842px',
    displayHeaderFooter: true,
    margin: { right: '20px', left: '20px', top: '130px', bottom: '80px' },
    headerTemplate: header,
    footerTemplate: footer
});

Regrettably, none of these attempts yielded the desired outcome. The generated PDF continued to display the error notification.

Solution

Ultimately, I came to the realization that the page.pdf process in Puppeteer essentially emulates a “print to PDF” action. Consequently, regardless of the screen size set within Puppeteer, the page.pdf process remains unaffected.

For the solution, I modified the media query in App.vue as follows:

<style>
@media print {
  .toastNotification {
    display: none !important;
  }
}
</style>

With this adjustment, error notification toasts no longer appear in the generated PDF.