質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

htmlをpdfで出力しようとしたときに、アルファベットが記号に文字化けする。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,122

carotene4035

score 25

 概要

帳票をpdfで出力するシステムを作っております。

htmlで作成した文書をpdfとして出力するために、
googleのwkhtmltopdfというツールを使用しております。

また、wkhtmltopdfを使用する際はphpから以下のラッパークラスを用いて呼び出しております。
mikehaertl/phpwkhtmltopdf

これらを用いてpdfを出力したところ、以下のようにアルファベットだけ文字化けしました。

こちらの文字化けを解消するにはどうしたらよろしいでしょうか。

教えていただければ幸いです。

イメージ説明

↑ pdfというアルファベットが文字化けしている。

 環境

CentOS release 6.8
php 5.6.23
wkhtmltopdf 0.12.4
mikehaertl/phpwkhtmltopdf 2.2.1

 実際に行った手順

  • wkhtmltopdfの導入
$ yum install -y libXrender libXext
$ cd /usr/local/bin
$ wget http://download.gna.org/wkhtmltopdf/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
$ xz -dv wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
$ tar -xf wkhtmltox-0.12.4_linux-generic-amd64.tar
  • 日本語フォントのインストール
$ wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip
$ unzip IPAexfont00301.zip
$ mv IPAexfont00301 /usr/share/fonts
  • pdf化するスクリプトを作成
require './vendor/autoload.php';

$html = <<<EOF
<!DOCTYPE html>
<html>
    <style>
    body {
        padding: 7px;
        background-color: black;
    }
    .red {
        color: red;
        font-size: 50px;
    }
    .opacity {
        opacity: 0.3;
    }
    </style>

    <body>
        <div class="red">
            <p>PDF化してください!</p>
            <p class="opacity">何でもしますから!</p>
        </div>
    </body>
</html>
EOF;

use mikehaertl\wkhtmlto\Pdf;


$pdf = new Pdf([

     // バイナリの位置とエンコード形式
    'binary'   => '/usr/local/bin/wkhtmltox/bin/wkhtmltopdf',
    'encoding' => 'utf-8',

    // 以下の指定があるとPDFをページ端まで利用できる
    'margin-top'    => 0,
    'margin-right'  => 0,
    'margin-bottom' => 0,
    'margin-left'   => 0,
    'no-outline',

]);

// ページを追加
$pdf->addPage($html);

// ブラウザにPDFを表示
$pdf->send();
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2017/07/31 14:33

    他の半角英数はどうですか?「PDF」と全角にするとどうなりますか?

    キャンセル

  • carotene4035

    2017/07/31 16:37

    他の半角英字も文字化けします。半角数字も文字化けしますね。。。全角のPDFは文字化けしませんでした。

    キャンセル

  • coba-coba

    2017/08/01 16:23

    フォントはきちんとインストールされているのでしょうか。 fc-listを実行するとIPAのフォントはリストに表示されますか?fc-cacheは実行しましたか?

    キャンセル

  • carotene4035

    2017/08/01 16:55

    ありがとうございます。 fc-listを実行してみたところ、IPAexGothic,IPAexゴシック:style=Regular, IPAexMincho,IPAex明朝:style=Regularが表示されておりました。また、fc-cacheを実行してみたところ、半角文字の文字化けは変わらずでした。

    キャンセル

回答 1

+1

phpの$pdfを呼ぶところで、こんなふうに変更してみたらどうなるでしょうか?

変更前:

$pdf = new Pdf([

     // バイナリの位置とエンコード形式
    'binary'   => '/usr/local/bin/wkhtmltox/bin/wkhtmltopdf',
    'encoding' => 'utf-8',


変更後:

$pdf = new Pdf([

     // バイナリの位置とエンコード形式
    'binary'   => '/usr/local/bin/wkhtmltox/bin/wkhtmltopdf',
    'commandOptions' => array(
        'useExec' => true, // エラーメッセージが出てこない場合のための記述
        'procEnv' => array(
         // 出力のロケールチェック
            'LANG' => 'ja_JP.utf-8',
        ),
    ),

PHP WkHtmlToPdf | README.md

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 16:50 編集

    同じ現象だったのですが、'commandOptions' のuseExec記載せず、
    htmlに<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    を追加したところ文字化けしなくなりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる