回答編集履歴

2 探してみた結果

miyabi-sun

miyabi-sun score 15878

2018/08/29 11:47  投稿

今質問文でJavaScriptを利かすとおっしゃいましたが、
そのJavaScriptの実行モジュールは何処にあるんですか?
JavaScriptはChrome等のブラウザ上で動的にDOMツリーを操作する事が主目的であり、
ChromeやFirefox等のブラウザ作っている団体が自前のエンジンを組み込んでブラウザに内包し、配布しています。
依存ライブラリはWebKitを利用しているとのことなので、実体としてはJavaScriptのエンジンがどっかに入ってそうですが、PDFを出力するのにJavaScriptエンジンを動かす必要は皆無で、多分そのライブラリからJavaScriptを解析して自由に動かす事は出来ないと思います
依存ライブラリはWebKitを利用しているとのことなので、実体としてはJavaScriptのエンジンがどっかに入ってそうですが、PDFを出力するのにJavaScriptエンジンを動かす必要は皆無で、~~多分そのライブラリからJavaScriptを解析して自由に動かす事は出来ないと思います~~
何とかHTMLやCSSをそれらしい形に修正して
基本的には何とかHTMLやCSSをそれらしい形に修正して
JavaScriptが実行された想定の状態をエミュレートで作ってください。
[phpQuery](https://github.com/punkave/phpQuery)みたいなライブラリとかを使えばなんとかなるんじゃないでしょうか?
---
ここから先は重い処理になると思いますので動的にPDFをバンバン生成したいという目的には使えませんが、
JavaScriptを搭載したブラウザごと強引に持ってきて実装する手段はあります。
LinuxにはLinux版Chromeが存在し、ヘッドレスモードで動作させることが可能です。
参考記事: [ヘッドレスChromeを使ったHTML→PDF変換サーバーを作る 改善編](http://uyamazak.hatenablog.com/entry/2018/02/01/120416)
しかし、JavaScriptを動かしてPDFを保存したいとのことで、
JavaScriptは初期処理をさっと行った後はイベントループにより、イベントの発生待ち状態になるものです。
何秒時点のスクショを取ればいいねん?…というのは誰にも保証出来ないので、たとえChromeのヘッドレスモードで開発を行うとしても、不具合が無いことを保証するところまでもっていくには結構しんどいんじゃないでしょうかね?
何秒時点のスクショを取ればいいねん?…というのは誰にも保証出来ないので、たとえChromeのヘッドレスモードで開発を行うとしても、不具合が無いことを保証するところまでもっていくには結構しんどいんじゃないでしょうかね?
---
> wkhtmltopdf(https://wkhtmltopdf.org/)がその役目を果たしてくれるのでは、と期待しているのですが無理筋でしょうか。
確かにWebKitなので何かあるかも知れないと思って探したら、あるものですね。
リンクだけ張っておきます。
[wkhtmltopdfにてJS処理が完了後にPDF化したい](https://teratail.com/questions/62439#reply-98989)
固定で10秒待つみたいな機能はあるようです。
○○の要素をクリックしてから更に待つみたいな指定は流石にヘッドレスブラウザの領域になりますが、
まずはこの機能を使ってみてはどうでしょうか?
1 ちょっと調べた内容追記

miyabi-sun

miyabi-sun score 15878

2018/08/28 20:45  投稿

今質問文でJavaScriptを利かすとおっしゃいましたが、
そのJavaScriptの実行モジュールは何処にあるんですか?
JavaScriptはChrome等のブラウザ上で動的にDOMツリーを操作する事が主目的であり、
ChromeやFirefox等のブラウザ作っている団体が自前のエンジンを組み込んでブラウザに内包し、配布しています。
つまり、今調査している方向性ではどうあがいてもJavaScriptを動作させる事は不可能です。
依存ライブラリはWebKitを利用しているとのことなので、実体としてはJavaScriptのエンジンがどっかに入ってそうですが、PDFを出力するのにJavaScriptエンジンを動かす必要は皆無で、多分そのライブラリからJavaScriptを解析して自由に動かす事は出来ないと思います。
何とかHTMLやCSSをそれらしい形に修正して
JavaScriptが実行された想定の状態をエミュレートで作ってください。
[phpQuery](https://github.com/punkave/phpQuery)みたいなライブラリとかを使えばなんとかなるんじゃないでしょうか?
---
ここから先は重い処理になると思いますので動的にPDFをバンバン生成したいという目的には使えませんが、
JavaScriptを搭載したブラウザごと強引に持ってきて実装する手段はあります。
LinuxにはLinux版Chromeが存在し、ヘッドレスモードで動作させることが可能です。
参考記事: [ヘッドレスChromeを使ったHTML→PDF変換サーバーを作る 改善編](http://uyamazak.hatenablog.com/entry/2018/02/01/120416)
しかし、JavaScriptを動かしてPDFを保存したいとのことで、
JavaScriptは初期処理をさっと行った後はイベントループにより、イベントの発生待ち状態になるものです。
何秒時点のスクショを取ればいいねん?…というのは誰にも保証出来ないので、たとえChromeのヘッドレスモードで開発を行うとしても、不具合が無いことを保証するところまでもっていくには結構しんどいんじゃないでしょうかね?

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る