質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

1回答

5370閲覧

cakePHPのPDF出力について

NakajiTatsuya

総合スコア6

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2018/10/01 09:39

前提・実現したいこと

PDF出力にphp文を組み込みたい
(cakePHP3.6)

ここに質問の内容を詳しく書いてください。
"tecnickcom/tcpdf": "^6.2" を使ってpdf出力をしていますが、html以外無視するのか、php文を読み込みません。
Bootstrapも無視されます。
htmlのみの記述の時は綺麗に出力されます。

発生している問題・エラーメッセージ

pdf出力した際、エラーはなく、php文で書いたところが空欄になってしまう

該当のソースコード

cakePHP3.6 "tecnickcom/tcpdf": "^6.2" MstPubController ... // pdf出力をおこなうアクション public function print() { $mstPub = $this->MstPub->newEntity(); // mstPubテーブルの全データをセット $this->set(compact('mstPub')); $this->response->type('pdf'); $this->response->charset('UTF-8'); // $this->response->download('print.pdf'); ブラウザ出力だけにするのでダウンロードはいらない $this->layout = false; } ... print.ctp <?php $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8'); $pdf->SetFont('kozgopromedium'); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->AddPage(); // 1ページ目を準備 $html = <<< EOF <html> <head> <style type="text/css"> h1 { text-align: center; } </style> </head> <body> <h1>店舗データ</h1> <table border="1"> <thead> <tr> <th>店舗コード</th> <th>'店舗ネーム'</th> </tr> </thead> <tbody> // ここから下が空欄で出力されてしまっている <?php foreach ($mstPub as $mstPub): ?> <tr> <td><div class="text-center"><?= h($mstPub->pub_cd) ?></div></td> <td><div class="text-center"><?= h($mstPub->pub_name) ?></div></td> </tr> <?php endforeach; ?> </tbody> </table> </body> </html> EOF; // 作った HTML を書きだします。 // PDF を出力 ( I = ブラウザ出力, D = ダウンロード, F = ローカルファイルとして保存, S = 文字列として出力 ) $pdf->writeHTML($html, false); echo $pdf->Output('', 'I'); ?>

試したこと

純粋にhtmlとcssだけでtableタグ内を表記すると綺麗に表示され、問題ないのですが、それでは、mstPubテーブルのデータ一覧を渡すことができないので困っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました

pdfにphpを埋め込んだものがネットにリソースが全然なかったのでかなり手こずりましたが、解決策は単純に

$html = <<< EOF
EOF;

のなかで変数を入れる時は、

<?= h($mstPub->pub_cd) ?> を使わずに <td>$mstPub->pub_cd</td>みたいにそのままぶち込むこと、およびループなどの計算処理をEOF内で使わないことでした。

理由は <<< EOF ... EOF はphpで長い文字列の定義であるため、string型の変数に代入されている状態であり、
最後に $pdf->writeHTML($html, false); でただの文字列がhtml変換されているからです。
ゆえに、htmlで変換できない処理が文字列に加わるとエラーを吐かれます。

よって、ループでテーブルデータ一覧を表示させたい時はEOF外でforeach文を使って文字列連結させれば良いうまくいきました。

↓ソースコード

pdf出力アクション print.ctp <?php $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8'); $pdf->SetFont('kozgopromedium'); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->AddPage(); // 1ページ目を準備 $html = <<< EOF <html> <head> <style type="text/css"> h1 { text-align: center; } </style> </head> <body> <h1>店舗データ</h1> <table border="1"> <thead> <tr> <th>店舗コード</th> <th>店舗ネーム</th> <th>住所</th> <th>店舗種類コード</th> <th>店舗サービスコード</th> <th>紹介画像</th> <th>電話番号</th> </tr> </thead> EOF; $pubData = ""; foreach ($mstPub as $mstPub) { $pubData .= "<tr><td>".$mstPub->pub_cd."</td>"; $pubData .= "<td>".$mstPub->pub_name."</td>"; $pubData .= "<td>".$mstPub->address1."</td>"; $pubData .= "<td>"; if ($mstPub->pub_type_cd){ if (isset($masterPubTypeValid[$mstPub->pub_type_cd])){ $pubData .= $masterPubTypeValid[$mstPub->pub_type_cd]; } } $pubData .= "</td>"; $pubData .= "<td>"; // サービスコード変換 if ($mstPub->pub_service_cd){ $serviceCdArray = explode(",", $mstPub->pub_service_cd); foreach ($serviceCdArray as $value) { if (isset($masterPubServiceValid[$value])){ $pubData .= $masterPubServiceValid[$value]."<br>"; } } } $pubData .= "</td>"; $pubData .= "<td>".$mstPub->present_image."</td>"; $pubData .= "<td>".$mstPub->tel_no."</td></tr>"; } $html .= <<< EOF <tbody> $pubData </tbody> </table> </body> </html> EOF; // 作った HTML を書きだします。 // PDF を出力 ( I = ブラウザ出力, D = ダウンロード, F = ローカルファイルとして保存, S = 文字列として出力 ) $pdf->writeHTML($html, false); // echo $pdf->Output('', 'S'); echo $pdf->Output('', 'I'); ?>
controller public function print() { $mstPub = $this->MstPub->find()->all(); $this->set(compact('mstPub')); $this->response->type('pdf'); $this->response->charset('UTF-8'); // $this->response->download('print.pdf'); $this->layout = false; }

$masterPubTypeValidとか$masterPubServiceValidとかは見てもわからないでしょうが、大事なのは
<<< EOF が長文字列であるため、文字列の中に計算処理を入れないことです。
スッキリ
ちなみにbootstrapはpdfファイルでは適用されないため、cssでレイアウトしていく予定です。

投稿2018/10/02 08:59

NakajiTatsuya

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問