トップへ(mam-mam.net/)

PHPでTCPDFでPDFファイルを生成するソースコード

検索:

PHPでTCPDFを使ってPDFファイルを生成する

PHPでTCPDFを使うとPDFファイルを生成できます。
ページを追加し文字や長方形、線、円弧、画像、HTMLを出力することができます。 ヘッダー、フッター(ページ、総ページ数の表示)を設定することもできるようです。

TCPDFのダウンロード

TCPDFを
https://sourceforge.net/projects/tcpdf/files/
からダウンロードします。
私は「tcpdf_6_3_2.zip」のリンクをクリックしてダウンロードしました。

https://github.com/tecnickcom/tcpdf や https://github.com/tecnickcom/tc-lib-pdf からもダウンロードできますが使うなと記述があります。

ダウンロードした「tcpdf_6_3_2.zip」を解凍します。
必要なファイル、フォルダは
/tcpdf.php
/tcpdf_autoconfig.php
/include/ フォルダおよびフォルダ内の全ファイル
/fonts/ フォルダおよびフォルダ内の全ファイル
のようで、サーバーに「tcpdf/」ディレクトリを作って入れます。

PDFファイルの動的生成サンプル

以下をクリックするとPHPで動的にPDFファイルを作成してPDFファイルを閲覧することができます。
サンプルを見る

サンプルのソースコード

<?php

// ライブラリの読み込み
require_once('./tcpdf/tcpdf.php');

// TCPDFインスタンスを作成
$orientation = 'P';  // 用紙の向き P:縦 L:横
$unit = 'mm';        // mm:ミリ単位 pt:ポイント単位 cm:センチ単位 in:インチ単位
$format = 'A4';      // 用紙サイズ指定
$unicode = true;     // TRUE:ドキュメントテキストがUnicode
$encoding = 'UTF-8'; // 文字コード
$diskcache = false;  // true:ディスクキャッシュを使う(メモリ節約) false:ディスクキャッシュを使わない
$tcpdf = new TCPDF($orientation, $unit, $format, $unicode, $encoding, $diskcache);

//ページ余白を設定する(左, 上[, 右]で設定、単位はコンストラクタで設定)
//ヘッダーを出力する場合は上余白を大きくとる必要がある
$tcpdf->SetMargins(8, 10, 8);

// PDFファイルのタイトルを設定
$tcpdf->SetTitle('PDF Title');
 // PDFファイルのサブタイトルを設定
$tcpdf->SetSubject('PDF Subject');
 // PDFファイルの作成者を設定
$tcpdf->SetAuthor('PDF Author');


//ヘッダー設定(使用はお勧めしない)ヘッダー下部に線が引かれる
  //ヘッダー表示 true:表示 false:非表示
  $tcpdf->setPrintHeader(false);
  //ヘッダーのフォント設定
  $tcpdf->setHeaderFont(
    /* 'arialunicid0'        :Arial Uni CID0
       'kozgopromedium'      :小塚ゴシックPro M
       'kozminproregular'    :小塚明朝Pro M
       'hysmyeongjostdmedium':HYSMyeongJoStd-Medium
       'msungstdlight'       :MSungStd-Light
       'stsongstdlight'      :STSongStd-Light  */
    [
      'kozminproregular', //「小塚明朝Pro M」の設定
      'I' ,               //スタイル B:太字 I:斜体 U:下線 D:取り消し
      8                   //フォントサイズ設定 デフォルト12pt
    ]
  );
  //印刷ヘッダーを上部から20mm下に出力するよう
  $tcpdf->setHeaderMargin(20);
  $tcpdf->setHeaderData(
    "logo.jpg", //ロゴ画像のファイル名を指定するようだがバージョンにより動かない
    10,  //ロゴ画像幅(ヘッダータイトルとヘッダー文字列は[左マージン+10]mmの位置に表示される)
    "ヘッダータイトル",
    "ヘッダー文字列",
    [0,0,255],  //文字の色 [r,g,b]
    [0,0,0]        //線の色 [r,g,b]
  );



//フッター設定(フッター上部に線が引かれ、フッター右端にページ/総ページ数が表示)
  //フッター true:表示 false:非表示
  $tcpdf->setPrintFooter(true);
  //日本語フォントの設定
  $tcpdf->setFooterFont(
    /* 'arialunicid0'        :Arial Uni CID0
       'kozgopromedium'      :小塚ゴシックPro M
       'kozminproregular'    :小塚明朝Pro M
       'hysmyeongjostdmedium':HYSMyeongJoStd-Medium
       'msungstdlight'       :MSungStd-Light
       'stsongstdlight'      :STSongStd-Light  */
    [
      'hysmyeongjostdmedium', //「HYSMyeongJoStd-Medium」に設定
      'I' ,                //スタイル B:太字 I:斜体 U:下線 D:取り消し
      8                  //フォントサイズ設定 デフォルト12pt
    ]
  );
  //フッターを下部から20mmに設定
  $tcpdf->setFooterMargin(20);
  $tcpdf->setFooterData(
    [0,0,255],  //文字の色 [r,g,b]
    [0,0,0]     //線の色 [r,g,b]
  );


//ページの追加
$tcpdf->AddPage('P','A4');//P(縦) or L(横),


//Text()関数
//単純なテキストの作成(改行不可等機能が少ないのであまり使用しない)
  //日本語フォントの設定
  $tcpdf->SetFont(
    /*
      'arialunicid0'        :Arial Uni CID0
      'kozgopromedium'      :小塚ゴシックPro M
      'kozminproregular'    :小塚明朝Pro M
      'hysmyeongjostdmedium':HYSMyeongJoStd-Medium
      'msungstdlight'       :MSungStd-Light
      'stsongstdlight'      :STSongStd-Light
    */
    'hysmyeongjostdmedium', //「HYSMyeongJoStd-Medium」に設定
    'D' ,             //スタイル B:太字 I:斜体 U:下線 D:取り消し
    16                //サイズ デフォルト12pt
  );
  //テキスト色設定
  $tcpdf->SetTextColor(255,0,0);//RGB
  //テキスト出力
  $tcpdf->Text(
    20,  //x座標
    30,  //y座標
    '$tcpdf->Text(x,y,文字列)でテキスト出力'
  );


//Cell()関数
//セル内(長方形のボックス内)で改行不可のリンク付きテキストの作成
//(\r\nでも改行不可、自動改行不可、文字列が長いと自動で幅の狭い縦長文字にできる)
  //日本語フォントの設定
  $tcpdf->SetFont(
    /*
      'arialunicid0'        :Arial Uni CID0
      'kozgopromedium'      :小塚ゴシックPro M
      'kozminproregular'    :小塚明朝Pro M
      'hysmyeongjostdmedium':HYSMyeongJoStd-Medium
      'msungstdlight'       :MSungStd-Light
      'stsongstdlight'      :STSongStd-Light
    */
    'hysmyeongjostdmedium', //「HYSMyeongJoStd-Medium」に設定
    'IU' ,             //スタイル B:太字 I:斜体 U:下線 D:取り消し
    12                //サイズ デフォルト12pt
  );
  //位置指定
  $tcpdf->SetXY(20,50);
  //塗りつぶしの設定
  $tcpdf->SetFillColor(255,255,0);//RGB
  //線の設定
  $tcpdf->SetLineStyle(["width"=>0.5,"cap"=>"round","join"=>"round","color"=>[0,0,255]]);//RGB
  //文字の出力と塗りつぶし
  $tcpdf->Cell(
    70,    //セル幅
    10,    //セル高さ
    '$tcpdf-Cell()'."  押すとリンク先 https://mam-mam.net/ へ",
    1,     //0:境界線無し 1:枠で囲む 'L':左 'R':右 'T':上 'B':下 'LR':左と右
    1,     //出力後のカーソルの移動方法 0:右へ移動 1:次の行へ移動 2:下へ移動
    'L',   //'L':左揃え 'C':中央揃え 'R':右揃え 'J':両端揃え
    1,     //0:背景透明 1:塗りつぶす
    'https://mam-mam.net/', //リンク先URLの指定
    1,     //テキストの伸縮モード 0:なし 1:必要に応じて水平伸縮 2:水平伸縮 3:必要に応じてスペース埋め 4:スペース埋め
    false, //false:矩形領域の高さの最小値調整をする true:矩形領域の高さの最小値調整をしない
    'T',   //Y座標に対するセルの配置 T:CellTop C:CellCenter B:CellBottom A:FontTop L:FontBaseline D:FontBottom
    'M'    //M:上下中央配置 T:上配置 B:下配置
  );


//MultiCell()関数
//セル内(長方形のボックス内)で自動改行されるテキストの作成(\r\nで改行位置も指定可、セルからはみ出す文字は消える)
  //日本語フォントの設定
  $tcpdf->SetFont(
    /*
      'arialunicid0'        :Arial Uni CID0
      'kozgopromedium'      :小塚ゴシックPro M
      'kozminproregular'    :小塚明朝Pro M
      'hysmyeongjostdmedium':HYSMyeongJoStd-Medium
      'msungstdlight'       :MSungStd-Light
      'stsongstdlight'      :STSongStd-Light
    */
    'kozgopromedium', //「小塚ゴシックPro M」に設定
    '' ,              //スタイル B:太字 I:斜体 U:下線 D:取り消し
    12                //サイズ デフォルト12pt
  );
  //文字色設定
  $tcpdf->SetTextColor(16,16,16);//RGB
  //背景色設定
  $tcpdf->SetFillColor(200,200,200);//RGB
  //線の設定(太さ,端,接続,色[r,g,b])
  $tcpdf->SetLineStyle(["width"=>0.5,"cap"=>"round","join"=>"round","color"=>[0,0,0]]);
  $tcpdf->MultiCell(
    85,    //セル幅
    40,    //セル高さ
    '出力文字列をここに指定します。\r\nで改行も可能。自動改行もされる。セルからはみ出した文字は消える。',
    1,     //0:境界線無し 1:枠で囲む 'L':左 'R':右 'T':上 'B':下 'LR':左と右
    'L',   //'L':左揃え 'C':中央揃え 'R':右揃え 'J':両端揃え
    1,     //0:背景透明 1:塗りつぶす
    1,     //出力後のカーソルの移動方法 0:右へ移動 1:次の行へ移動 2:下へ移動
    20,    //出力位置(x座標)
    70,   //出力位置(y座標)
    true,  //true:前回のセルの高さ設定をリセットする
    0,     //テキストの伸縮モード 0:なし 1:必要に応じて水平伸縮 2:水平伸縮 3:必要に応じてスペース埋め 4:スペース埋め
    false, //true:文字列がHTMLの場合 false:文字列がテキストの場合
    true,  //true:行幅に自動調整する false:自動調整しない
    40,    //高さの上限(上下配置に関係するのでセル高さと同じ値を設定する)
    'M',   //(htmlの場合は無効) M:上下中央配置 T:上配置 B:下配置
    false  //true:フォントサイズを小さくしてセル内に文字を自動で収める
  );

//MultiCell()関数
//セル内(長方形のボックス内)でHTMLの作成
//(CSS有効だが適用不可プロパティが多そう。セルからはみ出す文字は消えずにセル高さが自動調整される)
  //日本語フォントの設定
  $tcpdf->SetFont(
    /*
      'arialunicid0'        :Arial Uni CID0
      'kozgopromedium'      :小塚ゴシックPro M
      'kozminproregular'    :小塚明朝Pro M
      'hysmyeongjostdmedium':HYSMyeongJoStd-Medium
      'msungstdlight'       :MSungStd-Light
      'stsongstdlight'      :STSongStd-Light
    */
    'kozgopromedium',
    '' ,//スタイル B:太字 I:斜体 U:下線 D:取り消し
    12  //サイズ デフォルト12pt
  );
  //文字色設定
  $tcpdf->SetTextColor(16,16,16);//RGB
  //背景色設定
  $tcpdf->SetFillColor(200,200,200);//RGB
  //線の設定(太さ,端,接続,色[r,g,b])
  $tcpdf->SetLineStyle(["width"=>0.5,"cap"=>"round","join"=>"round","color"=>[0,0,0]]);
  $tcpdf->MultiCell(
    60,    //セル幅
    10,    //セル高さ(HTMLの場合は伸びる場合のみ自動調整)
    '<style>h4,p{margin:0px;padding:0px;font-size:12px;}</style><h4>タイトル</h4>'.
      '<p>出力文字列をここに指定します。<br>で改行も可能。'.
      '自動改行もされる。セルからはみ出した文字は消えずに高さが自動調整されると思われる。</p>',
    1,     //0:境界線無し 1:枠で囲む 'L':左 'R':右 'T':上 'B':下 'LR':左と右
    'L',   //'L':左揃え 'C':中央揃え 'R':右揃え 'J':両端揃え
    1,     //0:背景透明 1:塗りつぶす
    1,     //出力後のカーソルの移動方法 0:右へ移動 1:次の行へ移動 2:下へ移動
    120,    //出力位置(x座標)
    70,   //出力位置(y座標)
    true,  //true:前回のセルの高さ設定をリセットする
    0,     //テキストの伸縮モード 0:なし 1:必要に応じて水平伸縮 2:水平伸縮 3:必要に応じてスペース埋め 4:スペース埋め
    true, //true:文字列がHTMLの場合 false:文字列がテキストの場合
    true,  //true:行幅に自動調整する false:自動調整しない
    20,    //高さの上限(上下配置に関係するのでセル高さと同じ値を設定するがHTMLの場合は無視される)
    'B',   //(htmlの場合はT:上配置固定) M:上下中央配置 T:上配置 B:下配置
    false  //true:フォントサイズを小さくしてセル内に文字を自動で収める
  );


//Line()関数
//線を引く
  //線の設定
  $tcpdf->SetLineStyle(["width"=>1,"cap"=>"round","join"=>"round","color"=>[0,255,0]]);//RGB
  //線を出力
  $tcpdf->Line(10,140,100,160);


//矩形の塗りつぶし描画
  $tcpdf->SetLineStyle(["width"=>1,"cap"=>"round","join"=>"round","color"=>[0,255,255]]);//RGB
  //塗りつぶしの設定
  $tcpdf->SetFillColor(255,255,0);//RGB
  //矩形を出力
  $tcpdf->Rect(
    10,  //左上x
    165,  //左上y
    50,   //幅
    20,   //高さ
    'DF'  //'D':周りの線のみ描画 'F':塗りつぶしのみ描画 'DF':線+塗りつぶし
  );


//Circle()関数
//円弧を塗りつぶし描画
  //線の設定
  $tcpdf->SetLineStyle(["width"=>1,"cap"=>"round","join"=>"round","color"=>[0,0,255]]);//RGB
  //塗りつぶしの設定
  $tcpdf->SetFillColor(0,0,0);//RGB
  //円弧を出力
  $tcpdf->Circle(
    30,  //中心x
    200,  //中心y
    10,   //半径r
    0,    //円弧の開始角度(中心から真右が0度で反時計回り)
    270,  //円弧の終了角度(中心から真右が0度で反時計回り)
    'DF'  //'D':円弧のみ描画 'F':塗りつぶしのみ描画 'DF':円弧+塗りつぶし 'C':閉じる
  );


//Ellipse()関数
//楕円弧の塗りつぶし描画
  //線の設定
  $tcpdf->SetLineStyle(["width"=>1,"cap"=>"round","join"=>"round","color"=>[255,0,0]]);//RGB
  //塗りつぶしの設定
  $tcpdf->SetFillColor(0,0,255);//RGB
  $tcpdf->Ellipse(
    40,  //中心x
    230,  //中心y
    20,   //水平半径rx
    10,   //垂直半径ry
    45,    //楕円全体の回転方向(反時計回り) 例:45を指定するとx,yを中心に楕円が反時計回りに45度回転する
    0,    //円弧の開始角度(中心から真右が0度で反時計回り)
    315,  //円弧の終了角度(中心から真右が0度で反時計回り)
    'DF'  //'D':円弧のみ描画 'F':塗りつぶしのみ描画 'DF':円弧+塗りつぶし 'C':閉じる
  );


//Image()関数
//既存画像の描画
  $tcpdf->Image(
    './imgs/car2.jpg', //ファイル名
    100,         //左上座標x
    160,        //左上座標y
    80,         //幅w(指定しない場合又は0で自動計算)
    0,          //高さh(指定しない場合又は0で自動計算)
    '',         //画像フォーマット。GDを使用しない場合は'JPEG' 'PNG'を指定可能。''で自動
    'https://mam-mam.net'   //クリック時のリンクURL
  );


//Image()関数
//GDで動的に画像を作成して描画
  $w=50;//幅
  $h=50;//高さ
  $img = imagecreatetruecolor($w,$h);//画像の作成(w=50,h=50)
  $tranColor = imagecolorallocate($img, 254, 253, 252);//背景色セット
  imagefill($img, 0, 0, $tranColor);     //背景を塗る
  imagecolortransparent($img,$tranColor);//透明化
  imagesavealpha($img, true);            //アルファチャンネル情報保存をOn
  //ランダムに四角形を描く
  for($i=0;$i<10;$i++){
    $col=imagecolorallocate($img,random_int(0,255),random_int(0,255),random_int(0,255));
    $x1=random_int(0,$w);
    $y1=random_int(0,$h);
    $x2=random_int($x1,$w);
    $y2=random_int($y1,$h);
    imagefilledrectangle($img, $x1, $y1, $x2, $y2, $col);
  }
  ob_start();
  imagepng($img);
  $buf = ob_get_clean();
  ob_end_clean();
  $tcpdf->Image(
    '@'.$buf,
    100,220,50,50,'',''
  );


//ページの追加
$tcpdf->AddPage('P','A4');//P(縦) or L(横),

//writeHTML()関数
//HTMLレイアウトを描画する(CSS有効だが適用不可プロパティが多そう)
  // HTMLレイアウトを作成
  $html ="
    <style>
    * {margin:0; padding:0; color:#000;}
    table{border:none;width:200px;border-collapse:collapse;}
    th,td{border:1px solid #000;}
    h1{background-color:#fff;}
    </style>
    <h1>HTMLで記述</h1>
    <table>
      <tr><td>1</td><td>とても良い</td></tr>
      <tr><td>2</td><td>良い</td></tr>
      <tr><td>3</td><td>普通</td></tr>
      <tr><td>4</td><td>悪い</td></tr>
    </table>";
  //位置指定
  $tcpdf->SetXY(20,50);//2ページ目の左から20mm、上から50mmを左上とする位置に設定する
  // HTMLをPDFに書き込む
  $tcpdf->writeHTML($html, true, true, true, true);




//Output()関数
//作成したPDFの表示、ダウンロード、PDFファイルの保存、データの取り出し
  // 'I':ブラウザ表示(デフォルト)
  // 'D':ファイルの強制ダウンロード
  // 'F':指定ファイル名でローカルサーバーに保存
  // 'S':PDFドキュメントの内容を文字列として返す(ファイル名は無視される)
  // 'FI':F+Iと同じ
  // 'FD':F+Dと同じ
  $pdfData = $tcpdf->Output(rawurlencode('sample.pdf'), 'S');



//■PDFを画面に出力する(ブラウザに表示)
  header('Content-Type: application/pdf');
  header("Content-Disposition: inline; filename*=UTF-8''".rawurlencode($fileName));
  echo $pdfData;


/*
//■pdfファイルをダウンロードさせる
  header('Content-Type: application/octet-stream', false);
  header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($fileName));
  echo $pdfData;
*/