centos7の環境でpuppeteerをインストールしてPDFを出力する

nodejsとpuppeteerインストール

公式のインストール方法があるみたい
node.js 8.x をyumでインストールする
https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora

node.js10はまだLTS(LongTermSupport)じゃないのでやめとく。
2018/10からLTSとなるようだ。

インストールはroot権限で実行する。

1
2
3
$ sudo su -
# curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
# yum install -y nodejs gcc-c++ make

下記はpuppeteerの方で必要になるツール

1
2
$ sudo su -
# yum -y install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc

puppeteerのインストール
※内部的にHeadlessChromeが使われるがChromiumも一緒にインストールされるので別途chromeをinstallする必要はない

1
npm i puppeteer

output-pdf.jsを作成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = await browser.newPage();
await page.goto('https://github.com/trending', {waitUntil: 'networkidle2'});

var file_name = 'default';

if (process.argv[2]) {
file_name = process.argv[2];
}

await page.pdf(
{
path: file_name + '.pdf',
width: '1680px',
printBackground :true,
}
);

await browser.close();
})();

下記のコマンドでgithub-trend.pdfが作成されれば成功

1
$ node index.js github-trend

Apache(php)からpuppeteerを実行するには?

Error executing Puppeteer from PHP
Can’t execute Puppeteer with user “apache” (CentOS 7)

上記などでも報告されているとおり、puppeteernpm i puppeteerによって最初からハンドルされているchromeを使用する場合はWebアクセスをトリガーにphpからpuppeteerを実行することはできない。

node_modules/puppeteer/.local-chromium/のpermissionを変更する方法もありますが、chromiumをOSにインストールする方が正攻法な気がする。

  1. 下記でchromiumをインストールする

    1
    $ sudo yum install chromium
  2. インストールしたchromiumを指定するようにソースを編集する

実行パス(executablePath)をインストールしたchromiumに変更する

1
2
3
4
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
executablePath: '/bin/chromium-browser',
})
;