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

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

詳細はこちら
PDF

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

PHP

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

Q&A

解決済

1回答

2993閲覧

PHPでPDFテンプレートに文字を当てはめたい

free_gin

総合スコア8

PDF

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

PHP

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

0グッド

0クリップ

投稿2019/10/05 03:59

編集2019/10/05 04:46

PHPでPDFテンプレート(表のようなもの)を読み込み、そこに多次元配列のデータを当てはめたいです。
X座標は横に不規則に推移し、Y座標はページが変わる時以外は一定に推移します。
そういう場合のロジックはどのように考えたらいいのでしょうか?

自分で考えたこと:
if文で何個目のデータの時は X+=10;とする。

PHP

1$data = array( 2array("1","氏名","電話番号","00000000"), 3array("1","太郎","090000066666","00000000"), 4); 5 6 include(dirname(__FILE__).'tcpdf/tcpdf.php'); 7 include(dirname(__FILE__).'fpdi/fpdi.php'); 8 9 // AddPage 引数 10 $orientation = 'L'; 11 $format = 'A4'; 12 13 $pdf = new FPDI(); 14 $pdf->SetMargins(0,0,0); // 上左右マージンの設定 15 $pdf->SetCellPadding(0); // セルパディングの設定 16 $pdf->SetAutoPageBreak(false); // 自動改ページを無効 17 $pdf->setPrintHeader(false); // ページヘッダ無効 18 $pdf->setPrintFooter(false); // ページフッタ無効 19 20 $pdf->setSourceFile('test.pdf'); // テンプレートを読み込み 21 $template = $pdf->importPage(1); 22 $pdf->AddPage($orientation, $format); 23 $pdf->useTemplate($template, 0, 0); 24 $pdf->SetFont('kozgopromedium', '', 12); 25 26 // データを書き込む 27 $y = 93; 28 29 foreach($data as $i => $row){ 30 31 $x = 13; 32 33 foreach($row as $j => $col){ 34 35 $pdf->SetXY($x,$y); 36 $pdf->Cell(20,10, $row[$j], 0, 0, 'R', '', 2, false, 'C', ''); 37 38 } 39 40 $y += 10; 41 42 } 43 44 45 $pdf->Output('test.pdf','D');

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/05 04:11 編集

とりあえず、質問文のコードは回答者がコピペして動作するものを提示するマナーを守ってください。 わざわざ提示されたコードの不足を補ってまで回答する気にはなれません。 せめてそれくらいの配慮をしてください。
free_gin

2019/10/05 04:29

動作していただいてる事すら知らなかったです、申し訳ありません。 すぐに修正させていただきます。
退会済みユーザー

退会済みユーザー

2019/10/05 04:30

回答者のほとんどはコードを実際に動かして、回答しています。 「試したけどダメでした」というコメントは見飽きてるので。
free_gin

2019/10/05 04:33

本当にありがたいです。 教えていただきありがとうございます。 今後はこのようなことがないよう気をつけます。 申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2019/10/05 04:34

一度、提示したコードは動かして、確認してみてください。これだけで動きますか?
free_gin

2019/10/05 04:42 編集

なんども失礼しました。 すぐにテストして修正します。
退会済みユーザー

退会済みユーザー

2019/10/05 04:42 編集

質問文のコードをそのままコピペしたらエラーになりますよ。<?php もないし、array()の定義の後に; もない。お手元のコードが動くのであれば、そもそも手元のコードと提示したコードは異なっているということです。
free_gin

2019/10/05 04:47

何度も申し訳ありません、お恥ずかしい限りです。修正いたしました。
退会済みユーザー

退会済みユーザー

2019/10/05 04:48

GJ!
退会済みユーザー

退会済みユーザー

2019/10/05 04:50 編集

ただ、これだけでは問題点を解決できません。なぜなら、「PDFテンプレート(表のようなもの)」の設定が不明だからです。表の幅や、高さも不明なのに、「ずれる」事が問題なのでは?どう回答すればいいの?
free_gin

2019/10/05 05:00

なるほど・・・。 表の高さや幅は何とお伝えしたらいいものなんでしょうか。 上から10cm程度の所から表が始まり、各セルの大きさは縦幅1cm、 番号の横幅は1cm、氏名・番号・数字の横幅は3cm、なんですが伝わりますでしょうか・・・。
退会済みユーザー

退会済みユーザー

2019/10/05 05:03

OKです。本当は長さを記入したスクショとかを貼り付けたほうが回答者には伝わりやすいでしょうが、条件さえ過不足なく伝わればOKです。
guest

回答1

0

ベストアンサー

php

1<?php 2 3// サンプルデータ 4$data = [ 5 ["1", "氏名", "電話番号", "00000000"], 6 ["1", "太郎", "090000066666", "00000000"], 7]; 8 9// PDF関連の設定 10define('ORIENTATION', 'L'); 11define('FORMAT', 'A4'); 12 13define('TEMPLATE_FILE', 'template.pdf'); 14 15// 書き込み位置の設定(単位:ミリメートル) 16define('CELL_TOP', 100); // 10cm 17define('CELL_LEFT', 13); // 1.3cm 18define('FIRST_CELL_WIDTH', 10); // 1cm 19define('OTHER_CELL_WIDTH', 50); // 5cm 20define('CELL_HEIGHT', 10); // 1cm 21 22$pdf = new FPDI(); 23 24// PDFの基本的な設定でまとめる 25$pdf->SetMargins(0, 0, 0); 26$pdf->SetAutoPageBreak(false); 27$pdf->SetCellPadding(0); 28$pdf->setPrintHeader(false); 29$pdf->setPrintFooter(false); 30$pdf->SetFont('kozgopromedium', '', 12); 31$pdf->AddPage(ORIENTATION, FORMAT); 32 33// テンプレート関連の処理をまとめる 34$pdf->setSourceFile(TEMPLATE_FILE); 35$template = $pdf->importPage(1); 36$pdf->useTemplate($template, 0, 0); 37 38// データを書き込む 39$pdf->SetXY(CELL_LEFT, CELL_TOP); 40 41foreach ($data as $row) { 42 foreach ($row as $i => $col) { 43 44 $w = OTHER_CELL_WIDTH; 45 46 // 先頭セルの設定 47 if ($i === 0) { 48 $w = FIRST_CELL_WIDTH; 49 $pdf->SetXY(CELL_LEFT, $pdf->GetY() + CELL_HEIGHT); 50 } 51 52 $pdf->Cell($w, CELL_HEIGHT, $col, 0, 0, 'R', false, '', 1, false, 'C'); 53 } 54} 55 56$pdf->Output('test.pdf', 'D');

投稿2019/10/05 05:41

編集2019/10/05 08:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

free_gin

2019/10/05 05:59

Kosuke_Sgibuya様 やりたかったことが実現できました! 定数の使い方、とても勉強になりました。 GetY()はこんな風に使用するんですね。 そして何よりこんなに綺麗なコード・・・私も早くKosuke_Shibuyaさんのようなコードが書けるように努力します。 いつもありがとうございます。またよろしくお願いします。 今から頂いたコードで理解を深めてきます。
退会済みユーザー

退会済みユーザー

2019/10/05 06:13 編集

頑張ってください! 理解してもらうためのコメントとか余計に書いていますが、ここからどのコメントを残しておくか、または何を足すべきかなどもセンスが問われるところです。 「// セルパディングの設定」とかいうコメントって不要だと思うんですよね。「SetCellPadding」関数名だけで判断できますから。 「// テンプレート関連の処理をまとめる」→「// テンプレート関連の処理」でいいでしょうし。 $pdf->SetFont('kozgopromedium', '', 12); の「'kozgopromedium'」や「12」も定数にしておくほうがいいとも思います。
free_gin

2019/10/05 06:58

なるほど、コメントもセンスが問われるんですね。 フォントとサイズの定数化、早速やってみます! たくさん教えていただき感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問