こんにちは、エンジニアの上田です。
Chrome の Headless で、スクレイピングで特定の URL のスクリーンショットやファイルのダウンロードを試した方がいるのではないでしょうか?
今回は、Chrome の Headless を操作する Node ライブラリの puppeteer で、ローカルに SVG ファイルを置いて、PDF ファイルを作成する例を紹介したいと思います。
puppeteer 自体の説明は、 GitHub – GoogleChrome/puppeteer: Headless Chrome Node API をご参考ください。
環境構築
この記事では、Ubuntu Server 16 をセットアップ直後からの内容になります。
※Amazon Linux でも試してみましたが、Google Chrome が yum では入らなかったため、Ubuntu Server で試しています。
また、Windows でも動作することを確認しました。
Node.js の導入
puppeteer を利用するには、Node.js が必要になりますので、以下のようにして導入しています。
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - $ sudo apt-get install nodejs
puppeteer の導入
この記事では、以下のように “TestPDF” フォルダを作り、そこに導入して試します。
$ mkdir ~/TestPDF $ cd ~/TestPDF $ npm i puppeteer
最新バージョンの puppeteer v0.13.0 では、”~/TestPDF/node_modules/puppeteer/.local-chromium/” フォルダに、puppeteer に対応している Chromium がダウンロードされており、
別途、Google Chrome / Chromium を用意しなくても動作することを確認しました。
Node.js で実行するスクリプトの準備
以下のようなスクリプトを用意します。
※便宜上、createPDF.js として準備しました。
※スプリプトの引数は、URL, 出力ファイル, 用紙のサイズ, 用紙の縦横指定としています。
const puppeteer = require('puppeteer'); async function main(url, outputFile, paperW, paperH, orientation) { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url, {waitUntil:['networkidle0'], timeout:10000}); await page.setViewport({ width: Number(paperW), height: Number(paperH), }); await page.pdf({ path: outputFile, width: paperW, height: paperH, landscape: orientation=='portrait'? false : true, }); await browser.close(); } if (process.argv.length < 5) { console.log('arguments error.'); return; } var url = process.argv[2]; var outputFile = process.argv[3]; var paperWH = process.argv[4]; var orientation = process.argv[5]; var arrPaperWH = paperWH.split('*'); var paperW = arrPaperWH[0]; var paperH = arrPaperWH[1]; main(url, outputFile, paperW, paperH, orientation);
上記のスクリプトで利用している API は、puppeteer.launch, browser.newPage, page.goto, page.pdf などですが、API の説明は Puppeteer API v1.0.0-rc をご参考ください。
PDF ファイルにしたい内容の SVG ファイルの用意
PDF ファイルにしたい内容の SVG ファイルを用意します。
※便宜上、test.svg として準備しました。
※表示内容は、幅 1000px, 高さ 2000px に赤と青の四角形を表示する内容としています。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="2000" overflow="visible"> <rect fill="rgba(255,0,0,1)" width="500" height="500" y="0" x="0"></rect> <rect fill="rgba(0,0,255,1)" width="500" height="500" y="1500" x="500"></rect> </svg>
スプリプトの実行
用意したスクリプト と SVG ファイルを実行させます。
$ node createPDF.js file:///home/username/TestPDF/test.svg output.pdf 1000*2000 portrait # URL の部分は、フルパスが必要になりますので、ユーザー名の部分は "username" に変更しています。
作成した PDF ファイルの内容
最後に
ご紹介した内容は、事前に用意した SVG ファイルを Chrome の Headless で PDF ファイルを作ったため、固定的な出力になりましたが、
SVG ファイルをプログラム的に作成したりすると、任意の PDF ファイルの作成ができます。
Chrome の Headless の利用としては、スクレイピングで外の URL を操作するイメージがあると思いますが、ご紹介した内容のようにローカルファイルにも利用できますので、色々な用途を考えてみては如何でしょうか?
ソーシャルアカウント
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!