PHP 2016年08月22日 12:19   編集
ローカル環境で、PHPで表示したHTMLからPDFを出力するためにmpdfモジュールを使用しているが、「﨑」、「髙」など特定の文字が文字化けしてしまう。
それを回避するためのメモ。

まずhttp://www.mpdf1.com/mpdf/index.php?page=Downloadから最新版のmpdfをダウンロード。
xamppにPHPのモジュールとしてインストールすることも出来るが、webサーバーにはmpdfがインストールされてない場合もあるので、
そういう場合でも使用できるよう、ほかのPHPファイルなどと同様にhtdocs内に保存した。
mpdfを使用するPHPで使用する前にmpdfをインクルードして使用することになる。

たとえば、実行するPHPファイルと同じディレクトリ内に./includeディレクトリを作り、その中にmpdfを入れた場合、以下のような関数でmpdfが利用できる。

function mpdf_preview($url,$file) {
require_once('./include/mpdf/mpdf.php'); // ①mpdf.phpを読み込む
$html = file_get_contents($url); // ②URLが$urlのhtmlの内容を取得する。
$html = mb_convert_encoding($html,"SJIS-win","EUC-JP");
// ③なぜかEUC-JPからUTF-8に直接変換すると「﨑」などが文字化けするので、いったんSJIS-winに変換する。
$html = mb_convert_encoding($html,"UTF-8","SJIS-win");
// ④mpdfを使う前にUTF-8に変換しておかないとエラーが出る場合があるので、UTF-8に変換する。
$mpdf = new mpdf('ja+aCJK');
$mpdf->WriteHTML($html);
if ($file) {
$mpdf->Output($file,'F'); // ⑦ファイル名$fileを指定してPDFファイルを保存する。
} else {
$mpdf->Output(); // ⑧$fileを指定しない場合は、ブラウザに表示するのみ
}
}

となる。
  1. まず、①でmpdfが使えるように mpdf.php を読み込む。
  2. file_get_contents($url) で、$url(フルパス)で表示されるhtmlの文字列を取得して$htmlに保存する。
  3. その文字列$htmlをmpdfに渡してPDFに変換するわけだが、そのまま渡すとエラーになる場合があるので、$htmlはUTF-8に変換する必要がある。
    mb_convert_encodingで文字コードを変換する。
    PHPをEUC-JPで書いている場合、
    $html = mb_convert_encoding($html,"UTF-8","EUC-JP");
    としたくなるが、こうすると例の「﨑」とか「髙」が文字化けする。
    PHPをSJISで書いている場合は
    $html = mb_convert_encoding($html,"UTF-8","SJIS");
    としたくなるが、これも﨑」、「髙」が文字化けする。
    これは
    $html = mb_convert_encoding($html,"UTF-8","SJIS-win");
    としなければならないらしい。EUC-JPも文字化けしない指定名があればいいのだが、わからなかったので、EUC-JPの場合は、
    $html = mb_convert_encoding($html,"SJIS-win","EUC-JP");
    $html = mb_convert_encoding($html,"UTF-8","SJIS-win");
    のように、いったんSJIS-winに変換して2段階でUTF-8に変換すると、文字化けを解消できた。
ちなみにHTMLで表示する場合は、文字コードを変換した場合、charsetなどを変換した文字コードに変更してやる必要があるが、PDFにする場合、そのままでUTF-8に変換しても問題ないようだ。このへんはどうなっているのかよくわからない。
counter:6,215