🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PDF

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

PHP

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

Q&A

解決済

2回答

732閲覧

PHPの繰り返し処理が不規則な時の書き方

free_gin

総合スコア8

PDF

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

PHP

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

0グッド

0クリップ

投稿2019/10/07 04:58

編集2019/10/08 06:15

テンプレートPDFに配列データを表示させたいのですが、
テンプレートの表が不規則な幅のため最後のforeach文でどのようにX座標を足していったらいいかわからず行き詰まっております。
テンプレートの表なんですが、
表が横に計14項目あり、
最初のセルが、横幅1cm、2個目が2cm3個目が3cmの表で縦幅は均等です。

以下のコードもこちらのサイトで教えていただいたもので恐縮ですが、またご教授ください。

PHP

1 $data = array( 2 array("1", "testest", "TESTTEST", "TEST", "TT", "00000", "1", "000000", "0000", "0000", "0000", "0000", "00000", "test" ), 3 array("1", "testest", "TESTTEST", "TEST", "TT", "00000", "1", "000000", "0000", "0000", "0000", "0000", "00000", "test" ), 4 array("1", "testest", "TESTTEST", "TEST", "TT", "00000", "1", "000000", "0000", "0000", "0000", "0000", "00000", "test" ), 5 ); 6 7 include(dirname(__FILE__).'/tcpdf/tcpdf.php'); 8 include(dirname(__FILE__).'/fpdi/fpdi.php'); 9 10 // PDF関連の設定 11 define('ORIENTATION', 'L'); //横向き 12 define('FORMAT', 'A4'); 13 14 define('TEMPLATE_FILE', 'test.pdf'); 15 16 // 書き込み位置の設定(単位:ミリメートル) 17 define('CELL_TOP', 83.5); 18 define('CELL_LEFT', 7.5); 19 define('FIRST_CELL_WIDTH', 15); 20 define('OTHER_CELL_WIDTH', 25); 21 define('CELL_HEIGHT', 10); 22 23 $pdf = new FPDI(); 24 25 // PDF 設定 26 $pdf->SetMargins(0, 0, 0); 27 $pdf->SetAutoPageBreak(true,15); 28 $pdf->SetCellPadding(0); 29 $pdf->setPrintHeader(false); 30 $pdf->setPrintFooter(false); 31 $pdf->SetFont('kozgopromedium', '', 10); 32 $pdf->AddPage(ORIENTATION, FORMAT); 33 34 // テンプレート関連処理 35 $pdf->setSourceFile(TEMPLATE_FILE); 36 $template = $pdf->importPage(1); 37 $pdf->useTemplate($template, 0, 0); 38 39 // データを書き込む 40 $pdf->SetXY(CELL_LEFT, CELL_TOP); 41 42 foreach ($data as $row) { 43 44 foreach ($row as $j => $col) { 45 46 $w = OTHER_CELL_WIDTH; 47 48 // 先頭セルの設定 49 if ($j == 0) { 50 $w = FIRST_CELL_WIDTH; 51 $pdf->SetXY(CELL_LEFT, $pdf->GetY() + CELL_HEIGHT); 52 } 53 54 $pdf->MultiCell( $w, CELL_HEIGHT, $row[$j], 0, 'C', 0, 0, $pdf->GetX(), $pdf->GetY(), false, 1, true, true, CELL_HEIGHT, 'M', false); 55 56 } 57 58 59 } 60 61 $pdf->Output('test.pdf', 'D');

追記:
ifで条件分岐までは出来たんですが、
初めの[0]のセルと、[1]のセルがどうしてもずれてしまうのですが原因が何か突き止められません。
先頭セルが例えば1と表示してるんですが、その横のセルが若干右下に表示されてしまいます。

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

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

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

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

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

guest

回答2

0

ごく単純に条件分岐をして座標指定するだけだと思いますが?

追記
配列をうまく使用すると条件分岐はいらないかもしれないですね。

投稿2019/10/07 05:04

編集2019/10/07 05:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

free_gin

2019/10/07 05:19

回答ありがとうございます。 if文を追加していく形で試してみます。
free_gin

2019/10/07 06:47

ifで条件分岐とは、こんな感じで合ってますでしょうか? // 先頭セルの設定 if ($j == 0) { $w = FIRST_CELL_WIDTH; $pdf->SetXY(CELL_LEFT, $pdf->GetY() + CELL_HEIGHT); } if ($j == 1 OR 2 OR 3) { $w = OTHER_CELL_WIDTH; $pdf->SetXY($pdf->GetX(), $pdf->GetY()); } if ($j == 4) { $w = FIRST_CELL_WIDTH; $pdf->SetXY($pdf->GetX(), $pdf->GetY()); } if ($j == 5) { $w = OTHER_CELL_WIDTH; $pdf->SetXY($pdf->GetX(), $pdf->GetY()); } if ($j == 6) { $w = FIRST_CELL_WIDTH; $pdf->SetXY($pdf->GetX(), $pdf->GetY()); }
退会済みユーザー

退会済みユーザー

2019/10/07 08:15

間違っています。変数を追って、処理が意図したものになっているか確認すると良いです。
free_gin

2019/10/07 09:26 編集

確認してみたのですが、何が間違っているかわかりませんでした。。。 恐縮ですが、もう少しヒントいただけないでしょうか。。。 このifを処理した後は$jはint(13)となっていました。
退会済みユーザー

退会済みユーザー

2019/10/07 09:38

なるほど、 if ($j == 1 OR 2 OR 3) { } シンタックスエラーにはならんのか…
退会済みユーザー

退会済みユーザー

2019/10/07 09:49

適当なタイミングで switch と配列の回答、投下してあげてくださいw
退会済みユーザー

退会済みユーザー

2019/10/07 09:52 編集

とりあえず、手元の最新のソースコードを提示してもらうまでは、何もするつもりなし… 今の段階では質問として不備があるので。
退会済みユーザー

退会済みユーザー

2019/10/07 09:59

欲を言えば、コメントで追記されたコードを見る限り、前回の質問についた回答のコードの理解が正直足りないと感じている。
退会済みユーザー

退会済みユーザー

2019/10/07 10:21

僕としては配列使ったコードで自己回答/自己解決してほしいなぁ。
free_gin

2019/10/07 15:05

Kosuke_Shibuya様、te2ji様 ありがとうございます。もう少し頑張ってみます。
guest

0

自己解決

php

1 $data = array( 2 array("1", "testest", "TESTTEST", "TEST", "TT", "00000", "1", "000000", "0000", "0000", "0000", "0000", "00000", "test" ), 3 array("2", "testest", "TESTTEST", "TEST", "TT", "00000", "1", "000000", "0000", "0000", "0000", "0000", "00000", "test" ), 4 array("3", "testest", "TESTTEST", "TEST", "TT", "00000", "1", "000000", "0000", "0000", "0000", "0000", "00000", "test" ), 5 ); 6 7 include(dirname(__FILE__).'/tcpdf/tcpdf.php'); 8 include(dirname(__FILE__).'/fpdi/fpdi.php'); 9 10 // PDF関連の設定 11 define('ORIENTATION', 'L'); //横向き 12 define('FORMAT', 'A4'); 13 14 define('TEMPLATE_FILE', 'test.pdf'); 15 16 // 書き込み位置の設定(単位:ミリメートル) 17 define('CELL_TOP', 80); 18 define('CELL_LEFT', 5); 19 define('CELL_HEIGHT', 10); 20 21 $pdf = new FPDI(); 22 23 // PDF 設定 24 $pdf->SetMargins(0, 0, 0); 25 $pdf->SetAutoPageBreak(true,15); 26 $pdf->SetCellPadding(0); 27 $pdf->setPrintHeader(false); 28 $pdf->setPrintFooter(false); 29 $pdf->SetFont('kozgopromedium', '', 10); 30 $pdf->AddPage(ORIENTATION, FORMAT); 31 32 // テンプレート関連処理 33 $pdf->setSourceFile(TEMPLATE_FILE); 34 $template = $pdf->importPage(1); 35 $pdf->useTemplate($template, 0, 0); 36 37 //データを書き込む 38 $y = CELL_TOP; 39 foreach($data as $i => $row){ 40 41 $pdf->SetXY(CELL_LEFT, $y); 42 $pdf->useTemplate($template, 0, 0); 43 44 $pdf->Cell(10, CELL_HEIGHT, $row[1], 0, 0, 'C', "", 2, false, 'C', ''); 45 $pdf->Cell(20, CELL_HEIGHT, $row[2], 0, 0, 'C', "", 2, false, 'C', ''); 46 $pdf->Cell(30, CELL_HEIGHT, $row[3], 0, 0, 'C', "", 2, false, 'C', ''); 47 48 $y += 10; 49 } 50 51 $pdf->Output('test.pdf', 'D'); 52

と、
Cellの大きさが一つ一つ違うので個別にCellを書いたところ解決できました。
ありがとうございました。

追記:最終的なコードを修正しました。

投稿2019/10/08 04:22

編集2019/10/08 06:15
free_gin

総合スコア8

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

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

退会済みユーザー

退会済みユーザー

2019/10/08 05:21 編集

なんとか出来たようですが、これと同じ回答を私がしたとしたら、あなたは回答として十分満足できると思うでしょうか? この回答であなたは問題を解決できますか? それに、ちゃんとした最終的なソースコードが出されていれば、もっとこうするほうがいいよといったアドバイスもしやすい。
free_gin

2019/10/08 06:17 編集

ありがとうございます。 すみません、最初に提示した質問と数値がずれてしまいましたので修正もしてます。
退会済みユーザー

退会済みユーザー

2019/10/08 06:36 編集

これ意図したように動かないと思いますよ あ、動くか・・・ ループの中の $pdf->useTemplate($template, 0, 0); は無駄ですね。
free_gin

2019/10/08 06:59

次のページに行った時にテンプレートがうまく入らなかったので、ループの中に入れたところテンプレートを読み込めたのですが、やはりおかしいですかね。。 今は次のページに行った時に1つ目の$rowしか入らなくて困っております。。。 頑張ります(涙)
退会済みユーザー

退会済みユーザー

2019/10/08 07:08

「次のページに行った時」ってなんのことかよくわからないので、コメントできませんが、 手詰まりになったら、また新たな質問をあげるなりしてみてください。
free_gin

2019/10/08 07:11

伝え方が下手すぎてすみません。 また質問させていただきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問