developer's diary

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

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

wkhtmltopdfをインストール(Homebrew-cask利用)

wkhtmltopdfはバイナリ。バイナリな分速度は早いのですが、 環境に依存しますので、サーバによっては使えない場合が有ります。 (共有サーバとかだとインストールできない場合が多い、または難易度が上がります。)

brew cask install wkhtmltopdf

knplabs/knp-snappyの準備

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

mkdir pdf-example3

ディレクトリに移動

cd pdf-example3

composerの準備

composer init

knplabs/knp-snappyのインストール

composer require knplabs/knp-snappy

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

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

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

名前はcat.jpgにしよう。

phpファイル作成

base64で事前に読み込んでおく。

<?php<?php

require './vendor/autoload.php';

$img = base64_encode(file_get_contents("cat.jpg"));
$html = <<< EOF
<style>
body {
    font-family: ipag;
    }
.td {
    border: solid 1px black;
}
.td2 {
    border: solid 1px black;
    height:100px;
}
.td3 {
    font-size:20px;
    border: solid 1px black;
    height:100px;
}
.table{
    width:100%;
    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="data:image/jpeg;base64,{$img}" width="300px"/> 
</div>
<br>

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


EOF;

// wkhtmltopdfの位置をコンストラクタに渡す
$pdf = new Knp\Snappy\Pdf('/usr/local/bin/wkhtmltopdf');

// encoding = utf-8をセット
$pdf->setOption('encoding', 'utf-8');

// PDFをブラウザに出力
header("Content-Type: application/pdf");
echo $pdf->getOutputFromHtml($html);

結果

f:id:mitsugi-bb:20201010145546p:plain

その他

tcpdfはこちら

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

mitsugeek.net

dompdfはこちら

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

mitsugeek.net