(2022.3.2 記)
「PDF出力したい」という要望があったので実装た時の忘備録です。
PHPから利用できるPDF作成のフリーツールはいくつか存在するのですが、私は「TCPDF」というツールを導入しました。
理由としては、フリーツールを探している中でユーザーが多いと感じたため。
(使ってる人が多いと、困ったときに解決する糸口をつかめる可能性が高くなるから)
ただ、フリーツールというだけあり導入方法と使用方法にクセがあるので、メモとして残しましたという内容です。
※実際に会社等で利用する際、対外向けのシステムなら有償版の製品を利用することを勧めます。
(全行程の所要時間:PDFに出力する内容次第だが、導入自体はライブラリのコピーで完了)
0.実行環境
■実行環境
・さくらVPN(メモリ:1GB、CPU:2コア、SSD:100GB)
・LinuxOS:Ubuntu18.04
・Apache:2.4
・MySQL:5.7
・PHP:7.2→7.4(2024.9.11)
1.実装方法
①まずはこのTCPDFのサイトへアクセス
②左側のタブから「Github」を選択
③「Code」→「Download ZIP」とクリックし、任意の場所にZIPファイルを保存
④ダウンロードしたZIPファイルを解凍し、Webシステム上で参照できる任意の場所にフォルダごとコピペで導入完了
(該当のファイルはPHPファイルで構成された、いわゆるクラスライブラリになっています。なので、インストール作業は不要でコピペのみで完了します。)
⑤PHPから呼び出す際は、下記のように「include」or「include_once」で参照
//PDF出力部品の外部参照 include_once '../tcpdf/tcpdf.php';
⑥TCPDFの作成は、下記のようにインスタンスを生成し、出力文を記述
// TCPDFインスタンスを作成 $orientation = 'Landscape'; // 用紙の向き(用紙方向 (P or PORTRAIT(縦:既定) | L or LANDSCAPE(横))) $unit = 'mm'; // 単位 $format = 'A4'; // 用紙フォーマット $unicode = true; // ドキュメントテキストがUnicodeの場合にTRUEとする $encoding = 'UTF-8'; // 文字コード $diskcache = false; // ディスクキャッシュを使うかどうか $tcpdf = new TCPDF($orientation, $unit, $format, $unicode, $encoding, $diskcache); $tcpdf->setPrintHeader(false); // 印刷ヘッダーを表示しない $tcpdf->setPrintFooter(false); // 印刷フッターを表示しない $tcpdf->SetFont("kozgopromedium", "", 6); // デフォルトで用意されている日本語フォント(他にもフォントは用意されており、任意のフォントとフォントサイズを指定できる) $tcpdf->AddPage(); // 新しいpdfページを追加 //EOFで括った中に、html文をべた書き({$変数}とすることで変数に格納したhtml文を表示可能) $html = <<< EOF {$str_html} EOF; $tcpdf->writeHTML($html); // 表示htmlを設定 //以下3つは、作成したPDFをどう処理するかの書き方 //①pdf出力設定(ディレクトリ保存) $tcpdf->Output($filename, 'F'); //$filename = 出力される際のディレクトリ名(ファイル名込) //②pdf表示設定(画面出力) $tcpdf->Output($pdfname, 'I'); //pdfname = 出力される際のファイル名 //③pdfダウンロード header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename="'.$pdfname.'"'); header("Content-type: application/pdf"); header("Content-Transfer-Encoding: binary"); readfile($dirname); //$dirname = pdfファイルの保存場所(ファイル名込)
ベーシックな記載は以上。
フォントサイズはいちいち「SetFont()」関数のフォントサイズを変えてあげないと適応されないため、HTMLべた書き中では自由に変更できません。
が、HTMLの属性のヘッダー(H1やH2)で大きさをある程度変更できます。
細かくフォントサイズを指定したい場合は、HTMLべた書きで一括出力するのではなく、「SetFont()」関数でフォントサイズをしてした後に「Text()」関数を「$tcpdf->Text(x座標, y座標, テキスト内容);」のように定義することで、細かく指定することが可能です。
ちなみに、フォントは後から「AddFont()」関数で追加も可能です。
各々の関数の使い方は、ここのサイトでまとめてくれている人がいますので、参照するといいと思います。
実際の出力(②)は以下のような感じになります。
①、③では、このPDFファイルが保存されたり、ダウンロードされたりする動きになります。
社内で使う用なので、このような感じで出力できれば十分かな・・・。
注意点として以下2点・・・
①PDF表示させるHTMLべた書き部分について
HTMLのべた書きの中にはCSSも記述できるのですが、CSSファイルの外部参照が不可能なので、CSSの文もべた書きする必要があります。
構文が間違っていたり、TCPDFで利用できないHTML文やCSS文を入れると表示・作成がされません。
HTMLべた書きの部分は一度別ファイルで記述し、表示できるかどうかでデバッグしたほうが分かり易くなると思います。
②G-Mail上での埋め込みフォントの崩れについて
これは私だけの環境がそうなのか不明ですが、G-Mail上でこのPDFの添付を開こうとするとフォントが崩れます・・・(何故かスマホからは問題なく閲覧できる)
それ以外のWebメーラーではこのような現象が起こらないので、何かしらG-Mail側に制約があるのかもしれませんね。
ちなみに、一度PDFファイルをダウンロードし、PDFリーダーで見ると正常に閲覧できます。(要は、G-MailのPDF添付ファイルを直接閲覧したときだけ崩れる。)
2.最後に
自社内のPHPで作られたWebシステムにPDF出力機能を付与するなら、このツールで十分対応できると思います。
DXの波も「電子帳簿保存法」によって更に加速している気がします。
消費税表示もインボイスに合わせるようになど、色々政府からの注文が多いですよね・・・
外注せず、自社内で完結させる際に悩んだら利用されてもいいかと思いますし、また何かの機会でこの記事に触れ参考になりましたら幸いです。
以上。
(不明点あればコメント頂ければ、可能な限りお答えします。)
コメント
Hello would you mind sharing which blog platform
you’re working with? I’m planning to start my own blog in the
near future but I’m having a hard time making a decision between BlogEngine/Wordpress/B2evolution and
Drupal. The reason I ask is because your design seems different then most blogs and I’m looking for something completely unique.
P.S Apologies for being off-topic but I had to ask!
Hello! I chose WordPress because of its ease of editing. Perhaps it felt unique because it was easy to arrange and express individuality.
Undeniably believe that which you stated. Your favorite reason appeared to be at
the internet the simplest thing to be mindful of. I say to
you, I definitely get irked whilst other people think about
worries that they just don’t know about. You managed to hit the
nail upon the highest as neatly as outlined out the entire thing without having side effect , people can take a signal.
Will likely be again to get more. Thanks
This excellent website definitely has all the information I wanted about this subject and didn’t know who to ask.