TCPDFを利用してWordPressのページを動的にPDF出力してみよう⑤【ページ出力編】

こんにちは、webエンジニアのゾノ( @ozonosho )です。
さて、昨日のブログに続いて今回もTCPDFを利用してWordPressのページを動的にPDF出力する方法をご紹介いたします。全5回に分けて紹介していきますのでどうぞお付き合いください。
第5回目となる今回はWordPressのページを動的にPDF出力する方法をご紹介します!
まずは基本的なPDF出力コードをおさらい
TCPDFの機能を利用するためには、テーマ直下に置いた『print.php』ファイル内に下記のようなコードを貼りつけます。
<?php
//設置したPHPライブラリを読み込み
include (dirname(__FILE__).'/tcpdf/tcpdf.php');
//TCPDFインスタンスを作成
$tcpdf = new TCPDF();
//日本語フォントのセット
$tcpdf->SetFont('kozminproregular', "", 10);
//ヘッダー表示制御(非表示)
$tcpdf->setPrintHeader(false);
//ヘッダー表示制御(非表示)
$tcpdf->setPrintFooter(false);
//余白を設定
$tcpdf->SetMargins(15, 15, 15);
//PDFファイルのタイトルを設定
$tcpdf->SetTitle('PDFタイトル');
//PDFファイルの作成者を設定
$tcpdf->SetAuthor('ゾノ');
//1ページ目を作成
$tcpdf->AddPage();
//自動改ページをONにする
$margin = 15;
$tcpdf->SetAutoPageBreak(true, $margin);
//表示させるHTMLコード
$content = <<< EOF
<h1>タイトル</h1>
<table>
<tr>
<td>
<p>
ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。
</p>
<p>
ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。ここに文章がならびます。
</p>
</td>
</tr>
</table>
EOF;
//適用するCSS
$css = <<< EOF
<style>
h1 {
font-size: 22px;
color: #18c1c4;
text-align: center;
}
table td {
line-height: 1.8;
}
</style>
EOF;
$html = $css . $content;
//HTMLコードをセット
$tcpdf->writeHTML($html);
//PDFとして出力
$name = 'sample.pdf'; //ファイル名称
$tcpdf->Output($name, 'I');
//上記の「I」は出力の型。↓の4パターンがある
//I: ブラウザに出力する(既定)、保存時のファイル名が$nameで指定した名前になる。
//D: ブラウザで(強制的に)ダウンロードする。
//F: ローカルファイルとして保存する。
//S: PDFドキュメントの内容を文字列として出力する。
?>
このphpファイルを実際に実行してみると下記のサンプルPDFが開きます。
上記コードのとおり、「writeHTML」関数に出力したいHTMLを渡してあげればその内容をPDFに出力できるので、WordPressの関数「get_post」や「get_the_content」を利用してページのコンテンツを渡せばOKだと思ったのですが、、、
WordPressの関数を外部ファイルで利用するために必要な下記コードをprint.phpに読み込ませると、TCPDF側でPDFを出力するときにエラーが出ます。
<?php require_once ('./wp-blog-header.php'); //相対パスで指定 ?>
(WordPressの設定を読み込もうとするとエラーが出る!)
そんなわけで、PDFに表示させたいページのデータはフォームを経由してPOSTやGETで渡してあげる必要があります。PDFの中身を丸っと渡すので、現実的にはPOST一択だと思います。
WordPressページ内にprint.phpにページデータを渡すフォームを用意する
僕が運営するサイト『未来地図』で現在実施している「不登校生の親の気持ちアンケート」のPDFダウンロードを例に見ていきましょう。
ページを開いたら、下図の赤矢印の箇所にある「PDF版ダウンロード」ボタンをクリックしてみてください。

「PDF版ダウンロード」ボタンをクリックすると、ページの表示内容がPDFで出力されるのを確認できると思います。
この実装では、「PDF版ダウンロード」ボタン箇所をフォームで作っており、非表示にしたtextarea項目にページの情報を入れたうえでPOSTで送信しています。
ボタン部分のコードはこんな感じです。
<form class="pdf" method="post" action="<?php echo get_stylesheet_directory_uri(); ?>/print.php"> <textarea style="display: none;" name="page_content"><?php the_content(); ?></textarea> <input type="submit" value="PDF版ダウンロードはこちら"> </form>
inputタグをtype:hiddenで隠して送信するほうがスマートかなと思ったのですが、inputタグのvalueにaタグのダブルクオーテーションなどが入ると送信先でHTMLコードを正しく拾えなかったのでtextarea項目に入れて送信しています。
こんな感じで作れば、WordPressのページ内から好きな情報をprint.php(=TCPDFの出力用ファイル)に渡すことができます。
受け取ったデータを使ってTCPDFでPDF出力する
ここまで出来れば、あとはprint.php内でPOSTされたデータを受け取って出力すればOKです。
最終的には下記のようなコードになります。
<?php
//TCPDFのライブラリを読み込み
include (dirname(__FILE__).'/lib/pdf/tcpdf.php');
class MYPDF extends TCPDF {
//フッターにコピーライト情報を入れる
public function Footer() {
$font = new TCPDF_FONTS();
$myFont = $font->addTTFfont(dirname(__FILE__).'/font/rounded-mplus-1c-regular.ttf');
$this->SetY(-15);
$this->SetFont($myFont, 'I', 8);
$this->Cell(0, 10, 'Copyright©Cree 2020 All rights reserved. https://tsukuriba.co.jp', 0, false, 'C', 0, '', 0, false, 'T', 'M');
}
}
//送信されたページ情報を受け取る
$content = $_POST['content'];
//TCPDFインスタンスを作成
$tcpdf = new MYPDF();
//日本語フォントのセット
$font = new TCPDF_FONTS();
$myFont = $font->addTTFfont(dirname(__FILE__).'/font/rounded-mplus-1c-regular.ttf');
$tcpdf->SetFont($myFont, "", 12);
//ヘッダー:表示しない
$tcpdf->setPrintHeader(false);
//フッター:表示しない
//$tcpdf->setPrintFooter(false);
//余白を設定
$tcpdf->SetMargins(15, 15, 15);
//PDFファイルのタイトルを設定
$tcpdf->SetTitle('PDFタイトル');
//PDFファイルの作成者を設定
$tcpdf->SetAuthor('ゾノ');
//1ページ目を作成
$tcpdf->AddPage();
//自動改ページをONにする
$margin = 15;
$tcpdf->SetAutoPageBreak(true, $margin);
//表示させるHTMLコード
$content = <<< EOF
<div class="pdf-page">
受け取った情報の前に何か足したければここに追加
$content
受け取った情報の後に何か足したければここに追加
</div>
EOF;
//適用するCSS
$css = <<< EOF
<style>
pdf-page {
line-height: 1.8;
}
.pdf-page h1 {
font-size: 22px;
color: #f58282;
text-align: center;
}
</style>
EOF;
$html = $css . $content;
//HTMLコードをセット
$tcpdf->writeHTML($html);
//PDFとして出力
$name = 'sample.pdf'; //ファイル名称
$tcpdf->Output($name, 'I');
//上記の「I」は出力の型。↓の4パターンがある
//I: ブラウザに出力する(既定)、保存時のファイル名が$nameで指定した名前になる。
//D: ブラウザで(強制的に)ダウンロードする。
//F: ローカルファイルとして保存する。
//S: PDFドキュメントの内容を文字列として出力する。
?>
PDF側ではサイトと同じCSSプロパティは使えないため、こっちはこっちで定義してあげてください。
また余白などを作るにはtableレイアウトにする必要があるので、実際には受け取ったPOSTデータを「str_replace」などでtableタグに置換してあげるとよりPDFのデザインを調整することができます。
先ほど例として挙げたサイトの実装コードをそのまま載せるとこんな感じです。
<?php
include (dirname(__FILE__).'/lib/pdf/tcpdf.php');
class MYPDF extends TCPDF {
//フッターにコピーライト情報を入れる
public function Footer() {
$font = new TCPDF_FONTS();
$myFont = $font->addTTFfont(dirname(__FILE__).'/font/rounded-mplus-1c-regular.ttf');
$this->SetY(-15);
$this->SetFont($myFont, 'I', 8);
$this->Cell(0, 10, 'Copyright©未来地図 2020 All rights reserved. https://miraitizu.com', 0, false, 'C', 0, '', 0, false, 'T', 'M');
}
}
//送信されたページ情報を受け取る
$content = $_POST['content'];
$content = str_replace('<div class="qa-box">', '<table cellspacing="10" cellpadding="15">', $content);
$content = str_replace('</div>', '</table>', $content);
$content = str_replace('<p>', '<tr><td>', $content);
$content = str_replace('</p>', '</td></tr>', $content);
//TCPDFインスタンスを作成
$tcpdf = new MYPDF();
//日本語フォントのセット
$font = new TCPDF_FONTS();
$myFont = $font->addTTFfont(dirname(__FILE__).'/font/rounded-mplus-1c-regular.ttf');
$tcpdf->SetFont($myFont, "", 12);
//ヘッダー:表示しない
$tcpdf->setPrintHeader(false);
//フッター:表示しない
//$tcpdf->setPrintFooter(false);
//余白を設定
$tcpdf->SetMargins(15, 15, 15);
//PDFファイルのタイトルを設定
$tcpdf->SetTitle('不登校生の親の気持ちアンケート');
//PDFファイルの作成者を設定
$tcpdf->SetAuthor('miraitizu.com');
//1ページ目を作成
$tcpdf->AddPage();
//自動改ページをONにする
$margin = 15;
$tcpdf->SetAutoPageBreak(true, $margin);
//表示させるHTMLコード
$content = <<< EOF
<div class="page-results">
<h1>不登校生の親の気持ちアンケート<br>【回答結果】</h1>
$content
<table class="message" cellspacing="10" cellpadding="15">
<tr>
<td>
<h2 id="ex" class="ex">当アンケートについて</h2>
<p>
当アンケートは、不登校生のママたちが運営するサイト『未来地図』のスタッフ「Kun」さんが自身のブログで企画&募集してまとめてくれたものをベースにして、未来地図サイトで全国の保護者より回答を集めた内容になります。
</p>
<p>
経験者の声は、深く重みがあり愛に溢れています。
ご自身で読んでいただくことに加えて、家族との話し合い、学校との話し合いなどで自由に役立てていただけたら嬉しいです。
</p>
<p>
また、数多くの保護者の方々の声を知るため、不登校生の保護者の方は未来地図サイトより『不登校生の親の気持ちアンケート』に回答ご協力いただけますと幸いです。
</p>
<p>
※未来地図HP
<br><a href="https://miraitizu.com">https://miraitizu.com</a>
</p>
</td>
</tr>
</table>
</div>
EOF;
//適用するCSS
$css = <<< EOF
<style>
.page-results h1 {
font-size: 22px;
color: #f58282;
text-align: center;
}
.page-results h2 {
font-size: 17px;
color: #333;
text-align: center;
}
.page-results h3 {
font-size: 15px;
color: #f58282;
text-align: center;
}
.page-results table {
}
.page-results table tr {
background-color: #fff;
page-break-inside: avoid;
}
.page-results table td {
font-size: 11px;
line-height: 1.8;
color: #311;
background-color: #fffef5;
page-break-inside: avoid;
}
.page-results .message td {
background-color: #fff;
}
.page-results a {
color: #f58282;
}
</style>
EOF;
$html = $css . $content;
//HTMLコードをセット
$tcpdf->writeHTML($html);
//PDFとして出力
$tcpdf->Output('results.pdf', 'I');
?>
(メチャメチャ頑張ってサイトの表示に近づけました…!)
おわりに
以上、全5回に渡ってTCPDFを利用してWordPressのページを動的にPDF出力する方法をご紹介させていただきました。
この連載ブログは、しばらくしたら1つの記事にまとめてしまおうと考えています。
そのときには今回掲載しきれなかったヘッダーのカスタマイズ方法なんかも掲載する予定なので、興味ある方は是非またサイトを訪れていただけると嬉しいです(*´`)
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。









