今回は TCPDF で行う 「PDFファイル出力」 について説明したいと思います。
Webシステムでエクセルファイルやワードファイルのダウンロードは良くあることですが、 それらのファイルを見るためには、エクセルやワードのソフトが必要になります。
そこで PDF の出番ですが、上記のソフトが無くてもブラウザ上で見ることが出来る様になっていますので、 各種のデータ検索後のPDF出力の需要は結構あります。
このライブラリですが PHPでの 「PDFファイル出力」 と言えば TCPDF と推奨されています。
割と簡単に PDFファイル が作成できますので、使用されてみてはいかがでしょうか。
■TCPDF のダウンロードとインストール
TCPDF のダウンロードは以下の所から行えます。
【GitHub】tecnickcom / TCPDF
⇒https://github.com/tecnickcom/tcpdf
画面上部の緑色の Code ボタンをクリックし更に Download ZIP をクリックででダウンロードが開始されます。
以下の様に HTML ドキュメントのフォルダに展開します。 私のテスト環境はWindows上の xampp で行いますので C:\xampp\htdocs\ フォルダの中に tcpdf フォルダを作成し TCPDF-main.zip を展開し、中身を tcpdf フォルダにコピーしました。(下図参照)
■簡単なPDF表示
簡単なPDF表示処理として HTML 形式の内容をPDFとしてブラウザに表示させることを行います。 手順としては以下の様になります。
- TCPDF ライブラリの読込
- TCPDF クラスの生成
- TCPDF クラスへの新規ページ追加
- 日本語フォントの設定
- HTML文字列のブラウザへの表示
<?php // ライブラリ読込 require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); $pdf->setPrintHeader(false); // 新規ページ追加 $pdf->AddPage(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $pdf->SetFont("kozgopromedium", "", 10); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> EOF; // HTML書式で出力する $pdf->writeHTML($html); // PDF表示出力 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
実行結果は以下の様な表示になるはずです。 HTML での表現をそのまま PDF として表示できますので、いろんなものが簡単に PDF 化できると思います。
TCPDF クラスの生成は引数無しで行っていますが、クラス生成の関数(__construct をみると)の引数は7個あり、以下の様になっています。
public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false, $pdfa=false)
- $orientation用紙の向き('P':ポートレート, 'L':ランドスケープ 規定値:'P')
- $unit測位単位('mm':ミリm, 'cm':センチm, 'pt':ポイント, 'in':インチ 規定値:'mm')
- $format用紙の大きさ('A4','A5','B5' などの用紙サイズを文字列指定 規定値:'A4')
- $unicode文字列がUNICODEかの指定(規定値:true)
- $encoding文字セットエンコーディング(htmlを戻すときに使用 規定値:true)
- $diskcache廃止された機能(規定値:false) この機能は内部的に使っていない
- $pdfa[PDF/A]モードを使う場合バージョンNO[1, 3]を指定(規定値:false [PDF/A]モード未使用)
TCPDF クラスの生成を引数ありで記述すれば以下の様になります。
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false, false);
クラスの生成直後は TCPDF オブジェクトにはPDFのページが存在しませんので AddPage() メソッドで1ページ追加します。 ページを追加することで、そのページに対して出力処理が行える状態になります。
文字のフォントは規定値では helvetica になっていますので、これを日本語が表示出来る様に TCPDF に既に備わっている 日本語フォント[小塚ゴシックPro M:'kozgopromedium']を SetFont() メソッドで指定します。
次は HTML 文字列を作成しを writeHTML() メソッドで PDF のページに書き出します。
なお、HTMLのタグは以下のものがサポートされています。(実際のソースより)
Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul
最後に Output() メソッドで PDF をブラウザに出力します。
public function Output($name='doc.pdf', $dest='I') // $name : 保存時のファイル名 // $dest : ドキュメントの出力先を指定 // 'I': ブラウザに出力する、ブラウザで保存する時のファイル名が $name で指定した名前になる。 // 'D': ブラウザでダウンロードする。ファイル名は $name で指定した名前になる。 // 'F': ローカルサーバーファイルとして保存する。ファイル名は $name で指定した名前になる。 // 'S': PDFドキュメントの内容を文字列として出力する。
■HTMLページからPDFを別タブで表示させる(A タグ)
上の例ではブラウザの URL アドレスに直接「http://localhost/_test_pdf/pdf1.php」などと入力し、そのタブでの PDF 表示を行いました。
ただし、URL を直接では無く HTML ページから間接的に指定して別タブで表示させることが出来ます。
A タグを使って以下の様にすれば、リンクをクリックすると別タブに PDF 出力が表示されます。
<html> <head> <meta charset="utf-8"> <title>PDF - 1</title> </head> <body> <h2>PDF 出力を起動</h2> <a href="./pdf1.php" target="_blank">[pdf1.pdf]別タブで表示</a> </body> </html>
さらに、A タグをソースで記述では無く Javascript で行う場合は以下の様になります。
<html> <head> <meta charset="utf-8"> <title>PDF - 1</title> <script type="text/javascript"> function showPdf() { var a = document.createElement("a"); document.body.appendChild(a); a.href = "./pdf1.php"; a.target = "blank"; a.click(); a.remove(); } </script> </head> <body> <h2>PDF 出力を起動</h2> <button onclick="showPdf();">[pdf1.pdf]別タブで表示</button> </body> </html>
PDF 出力とは直接関係はないことでしたが、出力処理だけで動作させることは少なく、起動の方法も必要かと思いここに記しました。
■HTMLページからPDFを別タブで表示させる・その2
上の例では A タグを使って別タブに PDF 出力を表示する方法でしたが、 PDF 出力プログラム側で引数が必要な場合、 A タグではブラウザの URL に引数がそのまま表示されてしまいます。
これを出ない様にするには POST する必要があります。
それでは以下に PDF 側に1個の引数を持つ様に変更して、それを呼出す HTML ファイルを記します。
PDF出力側
<?php require_once('../tcpdf/tcpdf.php'); // 引数の取得 $para = ""; if (isset($_POST["para"])) { $para = $_POST["para"]; } // TCPDFクラス生成 $pdf = new TCPDF(); $pdf->setPrintHeader(false); // 新しいpdfページを追加 $pdf->AddPage(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $pdf->SetFont("kozgopromedium", "", 10); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> <p>引数は <b>$para</b> です。</p> EOF; // HTML書式で出力する $pdf->writeHTML($html); // pdf表示設定 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
PDF出力を呼出すHTML側
<html> <head> <meta charset="utf-8"> <title>PDF 1-3</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> function showPdf() { var form = document.createElement("form"); form.method = "POST"; form.action = "./pdf1-2.php"; form.target = "blank"; var hid = document.createElement("input"); hid.type = "hidden"; hid.name = "para"; hid.value = $("#para").val(); form.appendChild(hid); document.body.appendChild(form); form.submit(); form.remove(); } </script> </head> <body> <h2>PDF 出力を起動</h2> <input type="input" id="para" value="test" /> <button onclick="showPdf();">[pdf1.pdf]別タブで表示</button> </body> </html>
コメント