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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

10332閲覧

TCPDF: 改ページの制御をしたい

saya24

総合スコア221

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/02/16 12:32

編集2019/02/17 11:35

PHPで TCPDFというライブラリを使用して DBの内容をPDFに出力しようとしています。
初心者向けに紹介されたサイト参考にしたサイトをみながらなんとかPDFが画面に現われるようになりましたが、
自分なりに手順を拡張できずに困っています。

一般的な記事では

PHP

1$tcpdf->writeHTML($html);

のオブジェクト・メソッドで1度きりの表示内容設定ですが、改ページ制御のためにこの手順を何回かに分けて(ページヘッダ部分とTABLEのHTMLを格納)行って、PDFへの出力、

PHP

1$tcpdf->Output('XXXXXX.pdf', 'I');

を最後の1回に行う構成で考えています。以下現況のコーディングですが、PDFが現われなくなてしまいました。原因は一体なにでしょう?
今回functionにしているmPage()の部分を、functionとはせず単純に2回立て続けに書いたら、ちゃんと2ページに渡って同じデータの内容が表れてきました。ということは2回以上に渡って、writeHTMLのメソッドが実行されたった1回のOutputのメソッドが実行されても 問題はないということですよねぇ??

尚、$rows には4列の項目を保持する100レコードの連想配列が格納されています。
やはり$tcpdf->writeHTML($html);をfunctionにくくったことで 動かなくなってしまっているのでしょうか?(そうだとしたらどうすれば良いのか分からないので、対策をご教示頂けたら幸いです)

PHP

1function hMaker($pcnt) { 2 3 global $html2; 4 $html2 = '<div style="float:right; text-align: right;"><span>'.date('Y年m月d日').' </span><span>P.'.$pcnt.'</span></div><div style="float:left;" ><span class="b12" style="text-align: left;">○○○○株式会社</span><span> 行</span></div> 5 <div style="clear: both"></div> 6 <h1>注文書</h1> 7 <table><thead><tr><th style="width: 30%">取引先名</th><th style="width: 40%">住所</th><th style="width: 15%">TEL</th><th style="width: 15%">郵便番号</th></tr></thead>'; 8} 9 10function dMaker_f($col1,$col2,$col3,$col4) { 11 global $html2; 12 $html2 = $html2.'<tbody><tr><td style="width: 30%">'.$col1.'</td><td style="width: 40%">'.$col2.'</td><td style="width: 15%">'.$col3.'</td><td style="width: 15%">'.$col4.'</td></tr>'; 13} 14 15function dMaker($col1,$col2,$col3,$col4) { 16 global $html2; 17 $html2 = $html2.'<tr><td style="width: 30%">'.$col1.'</td><td style="width: 40%">'.$col2.'</td><td style="width: 15%">'.$col3.'</td><td style="width: 15%">'.$col4.'</td></tr>'; 18} 19 20 21$tcpdf = new TCPDF("L", "mm", "A4", true, "UTF-8" ); 22$tcpdf->SetFont("kozgopromedium", "", 10); 23$tcpdf->setPrintHeader(false); 24$tcpdf->SetDisplayMode(80); 25$tcpdf->SetAutoPageBreak(false); //自動改ページモードをオフ 26 27$linecount = 99; 28$pcnt = 0; 29foreach($rows as $row){ 30 if (count($rows)> 0 && $linecount > 50) { 31 if ($pcnt > 0) { 32 $html2 = $html2.'</tbody></table>'; 33 mPage(); 34 $html2 = null; 35 } 36 $linecount = 0; 37 $pcnt++; 38 $tcpdf->AddPage(); // 【ライブラリのメソッド】:ページ手配 39 hMaker($pcnt); // HTMLでヘッダのデザインを変数$html2に追記 40 dMaker_f($row["tname"], $row["taddress"], $row["ttelno"], $row["tpostno"]);// HTMLで明細を変数$html2に追記(TBODYタグ含む) 41 } else { 42 dMaker($row["tname"], $row["taddress"], $row["ttelno"], $row["tpostno"]);// HTMLで明細を変数$html2に追記(TBODYタグ含まない) 43 } 44 $linecount++; 45} 46if (count($rows)> 0) { 47 $html2 = $html2.'</tbody></table>'; 48} else { 49 $html2 = "対象はありません。"; 50} 51mPage(); 52 53//★☆★TCPDFを紹介している記事では、出力内容($html)が仕上がったら この部分を一度だけ実行 54//★☆★改ページ制御のため、ページ単位にこの部分を呼ぶようにしてみた。 55function mPage() { 56// $tcpdf->AddPage(); //【ライブラリのメソッド】:ページ手配⇒コメント!!! 57 $html = <<< EOF 58 <style> 59 h1 { 60 font-size: 24px; 61 text-align: center; 62 } 63 span.b12 { 64 font-size: 12px; 65 font-weight: bold; 66 } 67 table { 68 border-collapse: collapse; 69 } 70 table th, table td { 71 border: solid 1px black; 72 } 73 </style> 74EOF; 75 $tcpdf->writeHTML($html.$html2); // 【ライブラリのメソッド】:表示内容の設定 76} 77 78 79$tcpdf->Output('XXXXX.pdf', 'I'); // 【ライブラリのメソッド】:表示

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

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

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

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

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

guest

回答1

0

自己解決

$tcpdf->writeHTML($出力内容);というメソッドで表したい内容を出力、最後に$tcpdf->Output('XXXXXX.pdf', 'I');のメソッデから画面もしくはダウンロードで、PDFを手元に取得する仕様、と解釈して取り組んでいましたが、改ページの制御が分からず今日まで悩んできました。

ネット上の紹介記事では$tcpdf->writeHTML($出力内容); 1回、$tcpdf->Output('XXXXXX.pdf', 'I'); 1回の構成が大半でしたが、
$tcpdf->writeHTML($出力内容); N数に対し、$tcpdf->Output('XXXXXX.pdf', 'I');を1回だけ呼び出す動作も許可されることが分かり
改ページの単位に$tcpdf->writeHTML($出力内容); を行うようにしてなんとか進展しました。
(これが正規なやり方かどうか分かりません。当方は連想配列のデータセットをページ余白の問題だけでなく=キーブレークによる改ページも行う上でこの方策をとりました)

自分のHTML出力はテーブルでした。そこで一つのデータセット(連想配列)をページ単位に複数のテーブルを形成する・改ページ条件になったら当該TABLEを締め切って、次のTABLEを手配することを意識したら なんとか 克服できました。

PHP

1//【ヘッダ手配】 2function hMaker($pcnt) { 3 4 global $prdata; 5 6 $style = <<< EOF 7 <style> 8 h1 { 9 font-size: 24px; 10 text-align: center; 11 } 12 span.b12 { 13 font-size: 12px; 14 font-weight: bold; 15 } 16 table { 17 border-collapse: collapse; 18 } 19 table th, table td { 20 border: solid 1px black; 21 } 22 </style> 23EOF; 24 25 $prdata = $style.'<div style="float:right; text-align: right;"><span>'.date('Y年m月d日').' </span><span>P.'.$pcnt.'</span></div><div style="float:left;" ><span class="b12" style="text-align: left;">○○○○株式会社</span><span> 行</span></div> 26 <div style="clear: both"></div> 27 <h1>住所録</h1> 28 <table><thead><tr><th style="width: 30%">取引先名</th><th style="width: 40%">住所</th><th style="width: 15%">TEL</th><th style="width: 15%">郵便番号</th></tr></thead>'; 29} 30 31//【ヘッダ直後のレコード出力(TBODYタグ含める)】 32function dMaker_f($col1,$col2,$col3,$col4) { 33 global $prdata; 34 $prdata = $prdata.'<tbody><tr><td style="width: 30%">'.$col1.'</td><td style="width: 40%">'.$col2.'</td><td style="width: 15%">'.$col3.'</td><td style="width: 15%">'.$col4.'</td></tr>'; 35} 36 37//【通常の行のレコード出力(TBODYタグは含めない)】 38function dMaker($col1,$col2,$col3,$col4) { 39 global $prdata; 40 $prdata = $prdata.'<tr><td style="width: 30%">'.$col1.'</td><td style="width: 40%">'.$col2.'</td><td style="width: 15%">'.$col3.'</td><td style="width: 15%">'.$col4.'</td></tr>'; 41} 42 43 44$tcpdf = new TCPDF("L", "mm", "A4", true, "UTF-8" ); 45$tcpdf->SetFont("kozgopromedium", "", 10); 46$tcpdf->setPrintHeader(false); 47$tcpdf->SetDisplayMode(70); //70%で表示 48$tcpdf->SetAutoPageBreak(false); //自動改ページモードをオフ 49 50$linecount = 99; 51$pcnt = 0; 52//【連想配列のデータセットをレコード分ループ】 53foreach($rows as $row){ 54 if (count($rows)> 0 && $linecount > 30) { 55 if ($pcnt > 0) { 56 $prdata = $prdata.'</tbody></table>'; 57 $tcpdf->writeHTML($prdata); // ★ライブラリのメソッド⇒HTMLの出力 58 $prdata = null; 59 } 60 $linecount = 0; 61 $pcnt++; 62 $tcpdf->AddPage(); // ★ライブラリのメソッド⇒ページの手配 63 hMaker($pcnt); 64 dMaker_f($row["tname"], $row["taddress"], $row["ttelno"], $row["tpostno"]); 65 } else { 66 dMaker($row["tname"], $row["taddress"], $row["ttelno"], $row["tpostno"]); 67 } 68 $linecount++; 69} 70if (count($rows)> 0) { 71 $prdata = $prdata.'</tbody></table>'; 72} else { 73 $prdata = "対象はありません。"; 74} 75$tcpdf->writeHTML($prdata); // ★ライブラリのメソッド⇒HTMLの出力 76 77 78$tcpdf->Output('PurchaceOrder.pdf', 'I'); // ★ライブラリのメソッド⇒PDFを表示

投稿2019/02/18 11:29

saya24

総合スコア221

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問