ヘッドレスChromeでPDFHTMLからPDFを生成する必要があって、以下の方法を考えた。Edgeに該当URIを叩かせて、プリンタドライバにMS純正のPDF出力を設定しておいてJavaScriptでprintを呼び出す。これが確実に動くのはわかっているのだが、実行環境がGNU/Linuxなのでどうにもならない。Firefoxはapt-getで入れられるのでメンテナンスが楽そうだが、PDFに出力する簡単な方法が考え付かない。しょうがないので、ヘッドレスChrome(頭があって手足がないが正解な気がするが本人がヘッドレスを名乗っているのだからまあ良いのだろう)を使うことにした。Chromeはapt-getはできないが、debが用意されているから我慢する(のだが、今、あらためてみると、どうやってdebをダウンロードしたのかまったくわからない。あってもWindows版をダウンロードさせようとするのだが、キャンセルしまくると小さな文字のリンクがあって、Linuxを選択すると、またダイアログが出てくる......。1週間くらい前にはまともなページにたどり着けて、そのURIをcurlしたんだよなぁ)。ことはじめ)に飛ばされて、かつ情報が古い(Windowsでは待てとなっているが、Windowsでも--headlessで動作するので古い。書いてあるChromeは59についてだが、Windows版は65になっているし)が、まあ、このページからリンクされているところはそれっぽいから問題なかろう。Englishにしたら、Windowsは60からのサポートとバージョン番号付きで書いてあった。いうか、なんで先頭で言語を選択できるようにしていないのだろうか(または常に同期を取らないのだろうか)。なんか本当に面倒くさいベンダーだなぁ。いうのが出ているのだが、これが全然だめだ。コンテンツに重なって頼みもしないヘッダとフッタが出力される。Overflowにやはり同じ問題で困った人たちが質問しているが、有効な解答が、マージンなしにして出力すればヘッダとフッタが下になって隠されるというやつで、なんだそれ。思ったがall、print、screen、speech以外に何が使えるか調べるのもあほらしくてやらなかった)。DevTool(Chromeのデバッガインターフェイス)を眺めたら、Page#printToPDFというメソッドがあって、そのパラメータに、displayHeaderFooterというまさにおれが欲しいものがあるではないか。この場合、Chromeを起動しておいて外部からWebSocketで操作することになる。WebSocketの口はhttpで/jsonから取得する、おお、こういうインターフェイスは大好きだ。いうところは素晴らしい。--remote-debug-port=9222とすれば良いらしい(というか、これで動いた)。ポートの9222はデフォルトらしいので変えたければ別の値を指定すれば良いのだろうけど、いずれにしてもクライアントが最初にHTTPでアクセスするからウェルノウンにしておく必要はある。あと、disable-gpuは無くても動くようだが、バグを突くといやだから(バグ回避用の設定っぽい)指定する。これをnohupしておいて別口のクライアントからアクセスすることになる。見、DevToolを操作するためのnode用のライブラリがあるようだが、そんなもの使いたくないので、自分でopen-uriを使ってポート9222の/jsonを叩いてPageのURIを取ってWebSocketを使ってと書き始めたが、ふと、こんな程度の処理なら誰か作っているのではと気づいた。探すと(しかしドキュメント性が低いのでやたらと時間が食われるのには閉口した)、chrome_remoteというGemがあることがわかったので、それを利用することした。ロード後に数秒実行に必要なJavaScriptが動くとしたらここで待機するか、またはイベントをチェックする必要がある。endend実際は同じChromeのインスタンスを使いまわしたいので、Mutex使って排他制御したり他にもいろいろするが、単発ならこれでOK。