SlideShare a Scribd company logo
1 of 33
レポート自動生成
PHPでWordファイルを作る
pChart, PHPWord,
CakePHP, ZohoAPI
2014/2/13	

株式会社エイゾク	

市川
• ビール系エンジニア	

• Twitter: cakephper / ichikaway	

• Fukuoka.php
現状
• 毎月の運用レポートを手動で生成	

• Wordで作成、PDFにして提出	

• Wordの独自テンプレート利用	

• サーバ管理画面から情報、画像取得
問題点
• 1レポート作成に1∼2時間かかる	

• サーバからデータを収集する作業	

• エクセルでグラフ作成	

• レポートが増えると人を増やさないと・・
ゴール
• 1レポート10分程度	

• 90%以上を自動生成	

• 内容確認、微調整、PDF出力のみ行う
レポート
サンプル
※実際のレポート内容とは異なります
要件
• データ自動取得、ドキュメント自動生成	

• 提出前に修正できること	

• 目次、ページ番号	

• ヘッダ、フッタ	

• 画像(グラフなど)、表、見出し
検討したこと
• htmlでレンダリングし、PDF保存	

• ブラウザの機能でPDF出力までいける	

• Webアプリとして全て実装	

• jsのチャート表示ライブラリ
NG理由
• htmlでレンダリングし、PDF保存	

• Webアプリの作り込みがどこまでか
見えない(急な微調整に対応できない)	

• 目次が作れない	

• 改ページができない
今回のアプローチ
• サーバサイドでWord(docx)ファイル生成	

• 提出前に慣れたWordで微調整できる	

• 目次OK	

• docxファイルはphpwordライブラリ	

• チャート画像はpChartライブラリ	

• 生成スクリプトはCakeShellベース
全体構成図
顧客用サーバ1	

MongoDB
顧客用サーバ2	

MongoDB
顧客用サーバ3	

MongoDB
Zoho CRM
顧客情報	

サーバ名	

レポート契約
ZohoAPI	

にて取得
SSHポート	

フォワード	

にてMongoDB
に接続
HTTPSで	

サーバ負荷	

グラフ画像を取得
レポート	

サーバ
全ての情報が った
らレポート生成
情報取得フェーズ
ZohoCRM API
/usr/bin/curl --cipher rsa_rc4_128_sha 	

-s "https://crm.zoho.com/crm/private/json/Potentials/
getSearchRecords?newFormat=1&scope=crmapi&fromIndex=1&toIndex
=200

&authtoken=認証トークン
&searchCondition=(レポート|=|有り)
&selectColumns=(顧客名,サーバ名,IPアドレス、SSL)"
http://www.zoho.com/crm/help/api/
顧客用サーバへの接続
• SSHトンネルで各顧客サーバのMongoDB
に接続(PHPのpecl Mongo)	

• 各サーバのFirewallの変更不要	

• サーバ間はSSHで暗号化	

• サーバが増えても設定変更が不要
顧客サーバの接続
exec(	

‘ssh -f -C -N -L 	

5555:127.0.0.1:27017 顧客サーバIP > /dev/null’	

)
/dev/nullにリダイレクトしないと処理が	

PHP側に戻ってこない
この後に、localhost:5555にMongo clientで繋ぐ
サーバ負荷グラフ取得
• HTTPSにて各顧客サーバの負荷グラフ
(muninとかのグラフ)を取得	

• new HttpSocket(['ssl_verify_peer' => false]);
SSL証明書のエラーを無視する

推奨しないが場合によって
レポート生成
フェーズ
チャート生成
• pChart 2.x	

• http://www.pchart.net/	

• チャートや図形が簡単に生成できる	

• 豊富なサンプルコード	

• http://wiki.pchart.net/	

• 日本語フォントを自分でサーバに設置
pChart例
今回は棒グラフ生成
Wordファイル生成
• PHPWord	

• https://phpword.codeplex.com/	

• 最新版はgithub(日本語対応済み)	

• https://github.com/PHPOffice/PHPWord	

• APIドキュメント必須	

• https://phpword.codeplex.com/downloads/get/
138036
PHPWord機能
• フォーマット、タイトル、目次	

• 改行、改ページ	

• 画像、OLEオブジェクト挿入	

• ヘッダ、フッタ	

• テーブル(表)作成	

• テンプレート
PHPWord問題点
!
• 目次にページ数が出ない	

• 一度Wordで読み込み、PDF出力すると出る	

• テンプレート機能は文字置換のみ	

• かなり固定された形式しか使えない	

• 画像の拡大縮小すると画像が出なくなる	

• pChartやImageMagickで事前処理
PHPWordの使い方
$PHPWord = new PHPWord();	

$section = $PHPWord->createSection();	

!
$section->addText(‘株式会社テスト御中’); //文字挿入	

$section->addPageBreak(); //改ページ	

createSection()で生成したオブジェクトを使って、	

積み上げていく感じ
PHPWordの使い方
$section->addTOC(); //目次生成	

//章のタイトル生成(目次に反映される)

$section->addTitle(‘はじめに’, 1); 	

$section->addTitle(‘レポートの目的’, 2); //小見出し
PHPWordの使い方
//画像	

$section->addImage(画像パス, ['align' => 'center']);	

//テーブル	

$table = $section->>addTable();	

$table->addRow();	

$table->addCell()->addText('ドメイン名');	

$table->addCell()->addText('eizoku.com');
PHPWordの使い方
// Wordファイルの保存	

$a =
PHPWord_IOFactory::createWriter($PHPWord,
'Word2007');	

$a->save(filepath);
まとめ
色々なツールを合わせて
目標を達成	

pChat + PHPWordで大体
いける
Thank you
Yasushi Ichikawa	

@cakephper

More Related Content

More from ichikaway

VAddy at LL Diver LT
VAddy at LL Diver LTVAddy at LL Diver LT
VAddy at LL Diver LT
ichikaway
 

More from ichikaway (20)

ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019
ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019
ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019
 
現場で使える脆弱性検査サービス VAddy
現場で使える脆弱性検査サービス VAddy 現場で使える脆弱性検査サービス VAddy
現場で使える脆弱性検査サービス VAddy
 
OS入門 Fukuoka.php vol.18 LT資料
OS入門 Fukuoka.php vol.18 LT資料OS入門 Fukuoka.php vol.18 LT資料
OS入門 Fukuoka.php vol.18 LT資料
 
Yapc8oji: セキュリティテストサービスを開発運営してきた2年
Yapc8oji: セキュリティテストサービスを開発運営してきた2年Yapc8oji: セキュリティテストサービスを開発運営してきた2年
Yapc8oji: セキュリティテストサービスを開発運営してきた2年
 
VAaddyとは VAddyミートアップvol3_20160629
VAaddyとは  VAddyミートアップvol3_20160629VAaddyとは  VAddyミートアップvol3_20160629
VAaddyとは VAddyミートアップvol3_20160629
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
 
Vulnerabilities are bugs, Let's test for them!
Vulnerabilities are bugs, Let's test for them!Vulnerabilities are bugs, Let's test for them!
Vulnerabilities are bugs, Let's test for them!
 
脆弱性もバグ、だからテストしよう!
脆弱性もバグ、だからテストしよう!脆弱性もバグ、だからテストしよう!
脆弱性もバグ、だからテストしよう!
 
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
 
継続的Webセキュリティテスト testing casual talks2
継続的Webセキュリティテスト testing casual talks2継続的Webセキュリティテスト testing casual talks2
継続的Webセキュリティテスト testing casual talks2
 
Ctf2015 ichikawa Eizoku PM2.5 dial
Ctf2015 ichikawa Eizoku PM2.5 dialCtf2015 ichikawa Eizoku PM2.5 dial
Ctf2015 ichikawa Eizoku PM2.5 dial
 
VAddy - CI勉強会 fukuoka
VAddy - CI勉強会 fukuokaVAddy - CI勉強会 fukuoka
VAddy - CI勉強会 fukuoka
 
Jenkinsを使った継続的セキュリティテスト
Jenkinsを使った継続的セキュリティテストJenkinsを使った継続的セキュリティテスト
Jenkinsを使った継続的セキュリティテスト
 
継続的セキュリティテストVaddy説明資料
継続的セキュリティテストVaddy説明資料継続的セキュリティテストVaddy説明資料
継続的セキュリティテストVaddy説明資料
 
VAddy at LL Diver LT
VAddy at LL Diver LTVAddy at LL Diver LT
VAddy at LL Diver LT
 
phpcon kansai 20140628
phpcon kansai 20140628phpcon kansai 20140628
phpcon kansai 20140628
 
福岡xTwilio twilio meetup
福岡xTwilio  twilio meetup福岡xTwilio  twilio meetup
福岡xTwilio twilio meetup
 
Nginxを使ったオレオレCDNの構築
Nginxを使ったオレオレCDNの構築Nginxを使ったオレオレCDNの構築
Nginxを使ったオレオレCDNの構築
 
phpcon2013 PHP x twilio
phpcon2013 PHP x twiliophpcon2013 PHP x twilio
phpcon2013 PHP x twilio
 
fukuokaphp7 PHP x twilio
fukuokaphp7 PHP x twiliofukuokaphp7 PHP x twilio
fukuokaphp7 PHP x twilio
 

PHPWordを使ってレポート自動生成