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

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

ただいまの
回答率

88.80%

[PHP]mPDFを使ったことがある方 文字化け防止について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,255

uthio

score 18

前提・実現したいこと

mPDFというツールでPHPでHTMLをPDF化したいと考えています。
ブラウザ表示とダウンロードは問題なくできたのですが、
文字列に保存して表示すると文字化けしてしまいます。(以下添付)

イメージ説明

※文字化けというか、hogehogeみたいな文言入れるだけでもこうなってしまうのですが…。

Googleなどで調べてみたのですが、使われている方が少ないので参考例がなく
もし経験ある方で、解決策をご存知でしたらアドバイスいただければ助かります。

該当のソースコード

<?php

//フォームからhtml文字列を取得
$text = $_POST['text'];

$pdf_html = <<<__EOT

<html>
<head>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="hogehoge">
</head>
<body>
{$test}
</div>
</body>
</html>

__EOT;

// mPDFライブラリ呼び出し
require_once("mpdf.php");

//出力設定
$mpdf=new mPDF('ja+aCJK', 'A4', 12, '', 30, 30, 36, 20, 0, 0, 'P');

//line-height設定
$mpdf->useFixedNormalLineHeight = false;
$mpdf->useFixedTextBaseline = false;
$mpdf->adjustFontDescLineheight = 1.5;

// 文字化け防止
$mpdf->ignore_invalid_utf8 = true;

// PDFタイトル設定
$mpdf->setTitle("test.pdf");

// PDFファイルにHTMLをセット
$html = mb_convert_encoding($pdf_html,"UTF-8","auto");
$mpdf->WriteHTML($pdf_html);

// PDFファイルとして出力
// $mpdf->Output("test.pdf", "I");

// PDFファイルとしてダウンロード
// $mpdf->Output("test.pdf", "D");

// 文字列にして出力
$pdf_file = $mpdf->Output( "", "S");
echo $pdf_file;

?>

試したこと

http://piyopiyocs.blog115.fc2.com/blog-entry-791.html
こちら参考にして「$mpdf->ignore_invalid_utf8 = true;」を追記したり
出力前に「mb_convert_encoding」でエンコードしてみたものの、上手くいかずです。

文字列にする時点で何かしなければいけないことあって、それが足りないのでしょうか。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • CHERRY

    2019/05/28 19:20

    PDFファイルは、バイナリファイルなのですが、文字列で取得したいというのは、どのようなデータを取得したいのでしょうか?

    また、文字列で取得してどのように使いたいのでしょうか?

    キャンセル

  • uthio

    2019/05/28 19:34

    >CHERRY様
    ご質問いただきありがとうございます。
    今回の目的はフォームなどから渡されたHTML文字列をPDFにしてブラウザに表示とダウンロード、ここは出来ているのですが、加えてそのPDFにしたHTML含む文字列をデータベースに送ることも出来るようにしておきたいということになります。

    そのため、文字列での取得が必要かと思っておりました。

    説明下手で意図が伝わりにくく申し訳ないです。

    キャンセル

回答 3

+1

ご自身が書いているように「文字列として出力」しているだけですよ。

// 文字列にして出力
$pdf_file = $mpdf->Output( "", "S");
echo $pdf_file;

$mpdf->Output( "output.pdf", "D");

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/28 19:03

    >Kosuke_Shibuya様
    ご回答ありがとうございます。
    すみません、ご提示いただいたものの場合だとダウンロードになってしまうかと思うのですが、実践したいこととしてはPDFを文字列で取得したいです。
    なのでパラメータに「S」を入れていたのですが、私の認識が間違っておりますでしょうか?

    キャンセル

  • 2019/05/28 22:15 編集

    'S'を指定した結果が、質問の状態です。
    'S'を指定することなんてデバッグの時くらいのはず。

    キャンセル

  • 2019/05/29 11:53

    ご回答ありがとうございました。
    そもそも私にバイナリデータの認識が足りなかったです。
    大変失礼しました。
    今回やりたかったことは無理にSでやる必要はないと判断できました。

    キャンセル

checkベストアンサー

0

提示のものは文字化けではなくファイルのバイナリデータです。
なので「ファイルを文字列で」取得できています。

どのような出力を望まれているかこれだけでは分かりませんが、
マニュアルを読んで出力したい形式にあわせて対応してください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/29 11:57

    「結局どうしたいか」が見えないですが、PDF作ったならそのままサーバに保存して、そのパスだけをDBに保存するというやり方で良いかと(画像とかでも同じ)

    キャンセル

  • 2019/05/29 12:17

    あ、失礼しました。
    最終的にやりたかったのは渡されたHTMLデータ(文字列)を
    ①PDFにしてブラウザ表示
    ②PDFにしてダウンロード
    ③渡されたhtml文字列をデータベースに保存(履歴用)
    でして、①と②は出来てましたが③も同じmPDFライブラリで対応できるのかなと思っていたところバイナリデータになった(というのを認識してなかった)ので今回の質問をあげさせていただいた次第でした。

    色々ご意見いただいた結果、無理にライブラリを使ってバイナリデータを変換したりする必要はないのかな…と。

    キャンセル

  • 2019/05/29 12:45

    なるほど。把握しました。

    キャンセル

0

皆さま、ご意見ありがとうございます。
そもそもバイナリデータへの認識が足りず、的外れな質問になってしまったと思います。
渡されたhtml文字列をPOSTしてデータベースへ保存するなどのやり方もあり、そちらで対応したほうがシンプルかと思いました。
やり方は変えても望んでいた結果にはたどり着けそうですので、こちらクローズさせていただきます。

貴重な時間をいただき感謝いたします。
またよろしくお願いいたします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る