spiritix/php-chrome-html2pdf

View on GitHub
lib/Converter.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * This file is part of the spiritix/php-chrome-html2pdf package.
 *
 * @copyright Copyright (c) Matthias Isler <mi@matthias-isler.ch>
 * @license   MIT
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

import puppeteer from 'puppeteer';

const defaultOptions = {};

class Converter
{
    constructor(html, options)
    {
        this.html = html;
        this.options = options;
    }

    getDefaultOptions()
    {
        return defaultOptions;
    }

    getOptions()
    {
        return Object.assign({}, defaultOptions, this.options);
    }

    async run()
    {
        const browser = await this._launchBrowser();
        const page = await this._initPage(browser);
        const buffer = await this._convert(page);

        await this._close(browser);

        return buffer;
    }

    async _launchBrowser()
    {
        return puppeteer.launch({
            ignoreHTTPSErrors: true,
            headless: 'new',
            args: [
                '--no-sandbox', 
                '--disable-web-security', 
                '--font-render-hinting=none', 
                '--proxy-server="direct://"', 
                '--proxy-bypass-list=*',
            ]
        });
    }

    async _initPage(browser)
    {
        return browser.newPage();
    }

    async _convert(page)
    {
        let options = this.getOptions();

        if (options.hasOwnProperty('mediaType')) {
            await page.emulateMediaType(options.mediaType);
            delete options.mediaType;
        }

        if (options.hasOwnProperty('viewport')) {
            await page.setViewport(options.viewport);
            delete options.viewport;
        }

        if (options.hasOwnProperty('cookies')) {
            await page.setCookie(...options.cookies);
            delete options.cookies;
        }

        await this._setHtml(page, this.html);

        if (options.hasOwnProperty('pageWaitFor')) {
            await page.waitForTimeout(parseInt(options.pageWaitFor));
            delete options.pageWaitFor;
        }

        return this._getPdf(page, options)
    }

    async _setHtml(page, html)
    {
        return page.setContent(html, {
            waitUntil: ['load', 'networkidle0']
        });
    }

    async _getPdf(page, options)
    {
        return page.pdf(options);
    }

    async _close(browser)
    {
        return browser.close();
    }
}

export default Converter;