

zendframework2で構築されているWEBシステムの改修を実施したいのですが、WEBページ（複数画像あり）上にPDF出力ボタンを配置し、それを押下するとPDFが出力される方法をどなたかご教示願います。

何卒よろしくお願いいたします。

【備考】  
システムOS：WindowsServer2012R2  
言語：PHP5.6.3(ZendFramework2)  
DB：Postgres


CC BY-SA 3.0
2015-02-06T01:35:26.673
6035
2015-07-06T11:11:56.647
2015-02-06T05:52:56.940
8104
8104
question
php zend-framework
zend framework2においてのPDF出力方法をご教示願います


この回答は、出力したいPDFが動的であり、PDFファイルを静的に配置するだけでは対応できない状況を想定しています。また、HTMLをPDFに変換する方法になりますので、ZF2側では、出力したいPDFの元となるページを用意しておくことが前提条件となります。

まず、PHPはネイティブでPDFを生成できます。  
<http://php.net/manual/ja/book.pdf.php>

しかしこの方法は(当然ですが)PHPでしか使えず、実装も手間かと思います。

外部ライブラリを用いたPDFの生成は、主にHTMLをPDFに変換する方式を採用しています。以下は例です。  
<https://github.com/dompdf/dompdf>  
<https://github.com/tcpdf-clone/tcpdf>

また、PhantomJSを使えば、言語やフレームワークを問わずに、HTMLをPDFに変換することが出来ます。  
<http://phantomjs.org/>

DomPDFやTCPDFはPHPのプロセス上でHTMLやCSSを解析してPDFを生成(JSは動かない)しますが、PhantomJSはPhantomJS上のプロセスで、飽くまでブラウザとしてHTMLにアクセスしてPDFを生成(JSは動く)します。

以下、PhantomJS公式サイトの <http://phantomjs.org/screen-capture.html> に記載された  
"Beside PNG format, PhantomJS supports JPEG, GIF, and PDF."  
の方法になります。ZF2側で意識すべきは、最後のPHPサンブル箇所になります。

まず、お使いのOS用のPhantomJSを <http://phantomjs.org/download.html>
からDLします。バスは必要に応じて通して下さい。例えばMacの場合だと、DLしたzipファイル内の
phantomjs-{VERSION}-macosx/bin/phantomjs が必要なファイルなので、このファイルを /usr/local/bin/
などに移動します。以下のようにバージョンの確認ができればOKです。

[code]

    $ phantomjs -v
    2.0.0
    
[/code]

次に <https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js>
をDLします。curlやwget、あるいはブラウザから
<https://raw.githubusercontent.com/ariya/phantomjs/master/examples/rasterize.js>
を保存します。

以上で準備は完了です。PhantomJSでPDFを作成、保存します。以下のコマンドは、DLした rasterize.js がある場所で実行して下さい。

[code]

    $ phantomjs rasterize.js http://example.com/ example.com.pdf
    
[/code]

コマンドを実行した場所に "example.com.pdf" が作成され、内容が <http://example.com/>
になっていれば正しく実行されています。

最後に、この方法をPHPで実行するサンプルが、以下になります。

[code]

    <?php
    
    $pdf = uniqid().'.pdf';
    exec('phantomjs rasterize.js http://example.com/ '.$pdf);
    
    header('Content-type:application/pdf');
    echo file_get_contents($pdf);
    unlink($pdf);
    
[/code]


CC BY-SA 3.0
2015-02-06T02:29:30.733
6038
2015-02-06T07:06:35.367
2015-02-06T07:06:35.367
589
589
6035
answer


@mamor さんと同様のもので Snappy (wkhtmltopdf) というものがあります。

<https://github.com/KnpLabs/snappy>

もし `$ composer` が使えない環境で行う場合は

<http://wkhtmltopdf.org/>

だけでもいいと思います。(ちなみに wkhtmltopdf はコマンドとして使えます)

`Phantom.js` と同じように、 web ページのコンテンツによって情報が欠落したり、レンダリング結果に差異がありますので、ご注意ください。


CC BY-SA 3.0
2015-02-06T04:54:14.920
6055
2015-02-06T04:54:14.920
7926
6035
answer