developer's diary

最近はc#のエントリが多いです

PHPでPDF出力 ~ tcpdfを利用した「ええ感じ」のサンプル(htmlを利用)

tcpdfの準備

プロジェクト用ディレクトリ作成

mkdir pdf-example

ディレクトリに移動

mkdir pdf-example

composer初期化

composer init

tcpdfインストール

composer require tecnickcom/tcpdf

IPAフォントダウンロード、解凍

curl https://ipafont.ipa.go.jp/IPAfont/IPAfont00303.zip --output IPAfont00303.zip
unzip IPAfont00303.zip 

tcpdfに日本語用フォント追加

php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipag -f 32 -i ./IPAfont00303/ipag.ttf 
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipagp -f 32 -i ./IPAfont00303/ipagp.ttf 
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipam -f 32 -i ./IPAfont00303/ipam.ttf 
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipamp -f 32 -i ./IPAfont00303/ipamp.ttf

画像埋め込みの確認用に猫の画像を検索してダウンロードしておく

ここで猫の画像を検索 visualhunt.com

f:id:mitsugi-bb:20200907230618p:plain
この猫の画像にしよう

名前はcat.phpにしよう。

phpファイル作成

それなりに、HTMLは色々と盛り込んでみました。

<?php

// composerでインストールしたライブラリを参照する
require_once('./vendor/tecnickcom/tcpdf/tcpdf.php');

// 用紙の方向、用紙サイズを指定する
$tcpdf = new TCPDF('P', "pt",'A4');
$tcpdf->SetMargins(5, 5, 5); //マージン無効
$tcpdf->SetFont('ipag', '', 10);
$tcpdf->setPrintHeader(false);
$tcpdf->setPrintFooter(false);
$tcpdf->AddPage();

$html = <<< EOF
<style>
.td {
    border: solid 1px black;
}
.td2 {
    border: solid 1px black;
    height:100px;
}
.td3 {
    font-size:20px;
    border: solid 1px black;
    height:100px;
}
.table{
    border-collapse: collapse;
    border-spacing: 0px;
}
.left{
    text-align: left;
    border: solid 1px black;
    height:30px;
}
.right{
    text-align: right;
    border: solid 1px black;
    height:30px;
}
.center{
    text-align: center;
    border: solid 1px black;
    height:30px;
}
.decoration{
    text-decoration: line-through;
    border: solid 1px black;
}

.sample1 {text-decoration: none;}
.sample2 {text-decoration: underline;}
.sample3 {text-decoration: overline;}
.sample4 {text-decoration: line-through;}
.sample5 {text-decoration: underline dotted red;}

.color{
    background-color:black;
    color:white;
}
</style>


<table class="table">
<tr>
    <td class="left">text-align: left;</td>
    <td class="center">text-align: center;</td>
    <td class="right">text-align: right;</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">日本語</td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td"><table class="table">
        <tr>
            <td class="td" >test</td>
        </tr>
        <tr>
            <td class="td" >test</td>
        </tr>
    </table></td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td" colspan="2">colspan="2"</td>
    <td class="td" rowspan="2">rowspan="2"</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">fuga</td>
</tr>
<tr>
    <td class="td2" colspan="3">height:100px; colspan="3"</td>
</tr>
<tr>
    <td class="td2 color" colspan="3">改行<br>
brタグ<br>
で改行<br>
背景色変更<br>
フォントカラー変更<br>
</td>
</tr>
<tr>
    <td class="td3" colspan="3">改行<br>
brタグ<br>
で改行<br>
</td>
</tr>
<tr>
<td class="td2" colspan="3">

<div><span class="sample1">none</span> text-decoration: none;</div>
<div><span class="sample2">underline</span> text-decoration: underline;</div>
<div><span class="sample3">overline</span> text-decoration: overline;</div>
<div><span class="sample4">line-through</span> text-decoration: line-through;</div>
<div><span class="sample5">underline dotted red</span> text-decoration: underline dotted red;</div>


</td>
</tr>
<tr>
<td class="td2" colspan="3">
画像挿入
<br>
<div>
 <img src="cat.jpg" width="300px"/> 
</div>
<br>

</td>
</tr>
</table>


EOF;

$tcpdf->WriteHTML($html, true, 0, false, true, 'L');
// 出力用バッファの内容を消去
ob_end_clean();
$tcpdf->Output("test.pdf", "D");

結果

URLを開くとファイルがダウンロードされます。

f:id:mitsugi-bb:20200907231027p:plain
ダウンロードの様子

ファイルを開くとこんな感じに。

f:id:mitsugi-bb:20200907231211p:plain
PDFの読み込み結果

参考

qiita.com

その他

dompdfはこちら

dompdfバージョンのエントリは以下より。

mitsugeek.net

wkhtmltopdfはこちら

wkhtmltopdfバージョンのエントリは以下より。

mitsugeek.net