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

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

新規登録して質問してみよう
ただいま回答率
87.20%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

解決済

htmlファイルをPDFで出力した際、全角記号が出力されない

avantgarden
avantgarden

総合スコア118

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

2回答

-2評価

0クリップ

233閲覧

投稿2022/03/30 09:55

編集2022/04/06 20:45

内容が古いのですが、下記記事の内容でPDF出力を実装しました。

https://www.konosumi.net/entry/2018/06/22/015223

日本語などは文字化けなく出ているのですが、全角記号が出ません。
$%&*+¥)など、色々ためしましたがどれも出ないです。

フォントに関しては、記事にもあるIPAexフォントをCentOSにインストールし、HTML側でもフォントをしています。

これはIPAexフォントに全角記号が含まれていないという理解でいいのでしょうか?

ざっくりな質問になりますが、ご教示ください。

【追記】
参考記事にも記載はあるのですが、
ライブラリはphpwkhtmltopdfを使用しています。

【追記2】実際のコードを追記いたします。
ボタンクリックでPDFをダウンロードする仕様なので、画面側のコードも記載しておきます。※実際はボタンのデータ属性のidを処理側へ送信して、処理側ではデータを取得して変数を埋め込んだ帳票のHTMLをPDFにしていますが、その辺りは省いています。

下記のコードで、実際にこちらでは全角記号が出ない状態です。
PHPのバージョンは7.4です。

download.html

<button id="pdfBtn"> <script> $(function() { $("#pdfBtn").click(function(e) { e.preventDefault(); $.ajax({ url: 'create_pdf.php', datatype: "json" }).done(function(res) { res = JSON.parse(res); console.log(res); if (res.isSuccess) { var a = document.createElement('a'); a.setAttribute('href',res.url); a.setAttribute('download', res.filename); a.setAttribute('style','display:block;position:absolute;top:-999px;'); document.querySelector('body').appendChild(a); a.click(); a.parentNode.removeChild(a); } else { alert('ダウンロードに失敗しました。') } }).fail(function() { alert("通信エラーが発生しました。\n再度実行してください。"); }); }) }); </script>

create_pdf.php

<?php require '../vendor/autoload.php'; use mikehaertl\wkhtmlto\Pdf; $html = <<<EOF <!doctype html> <html lang="ja"> <head> <meta name="robots" content="noindex, nofollow"> <meta charset="UTF-8"> <title>test</title> <style> @charset "UTF-8"; body { font-family: "IPAexGothic"; } </style> </head> <body> _ </body> </html> EOF; $pdf = new Pdf([ 'binary' => '/usr/local/bin/wkhtmltopdf', 'encoding' => 'utf-8', 'commandOptions' => array( 'procEnv' => array( 'LANG' => 'ja_jp.utf-8', ), ), ]); $pdf->addPage($html); $fileName = uniqid('test', false) . '.pdf'; $savePath = SAVE_DIR . $fileName; $isSuccess = $pdf->saveAs($savePath); if ($isSuccess) { if (file_exists($savePath)) { $url = URL . '/' . SAVE_DIR . '/' . $fileName; $return = ['isSuccess' => true, 'url' => $url, 'filename' => $fileName]; } } else { $return = ['isSuccess' => false]; } echo json_encode($return);

この状態でPDFをダウンロードして開くと、全角記号は出力されず中身が真っ白の状態になります。実際組んでいるのは帳票のPDFなのですが、全角記号の箇所(¥, (, ), ~など)のみ出力されない状態になります。

なお、サーバー側のフォントに関しても記載しておきます。

CentOS8_Stream

# pwd /usr/share/fonts/IPAexfont00401 # ll total 13644 -rwx------ 1 root root 6099900 Apr 26 2019 ipaexg.ttf -rwx------ 1 root root 7835672 Apr 26 2019 ipaexm.ttf -rw-r--r-- 1 root root 20564 Apr 26 2019 IPA_Font_License_Agreement_v1.0.txt -rwx------ 1 root root 1834 Apr 26 2019 Readme_IPAexfont00401.txt

2022.04.06 追記

まだ解決には至ってないのですが、
追加の検証結果が出ましたので、追記させていただきます。

wkhtmltopdf自体をコマンドラインで実行

結論:全角記号が出力されました。
検証内容:

html

<!doctype html> <html lang="ja"> <head> <meta name="robots" content="noindex, nofollow"> <meta charset="UTF-8"> <title>test</title> <style> @charset "UTF-8"; body { font-family: "IPAexGothic"; } </style> </head> <body> _ </body> </html>

上記のHTMLファイルを(test.html)を用意して、
$ wkhtmltopdf test.html test.pdf
を実行し、生成されたtest.pdfを確認すると、全角記号が出力されていました。

PHPをコマンドラインから実行

結論:こちらでも全角記号が出力されました。
検証内容:

php

<?php require '../vendor/autoload.php'; use mikehaertl\wkhtmlto\Pdf; $html = <<<EOF <!doctype html> <html lang="ja"> <head> <meta name="robots" content="noindex, nofollow"> <meta charset="UTF-8"> <title>test</title> <style> @charset "UTF-8"; body { font-family: "IPAexGothic"; } </style> </head> <body> _ </body> </html> EOF; $pdf = new Pdf([ 'binary' => '/usr/local/bin/wkhtmltopdf', 'encoding' => 'utf-8', 'commandOptions' => array( 'procEnv' => array( 'LANG' => 'ja_jp.utf-8', ), ), ]); $pdf->addPage($html); $fileName = uniqid('test', false) . '.pdf'; $savePath = SAVE_DIR . $fileName; $isSuccess = $pdf->saveAs($savePath);

最初に記載したcreate_pdf.phpからjsonを返す部分のみを省いたもの(create_pdf_test.php)を用意し、
$ php create_pdf_test.php
を実行し、保存ディレクトリに生成されたPDFファイルを確認すると、全角記号が出力されていました。

なので、画面上のボタンをクリックしAjaxで処理させた場合(Webサーバーから実行?)させた場合のみ、生成されたPDFに全角記号が出ないということは分かりました。

とはいえ、それに対してどう対応すべきものか分からず、引き続き何かヒントでもいただければと思います…

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

m.ts10806

2022/03/30 11:11 編集

実際のご自身のコードと結果が分かるキャプチャなどを提示してください。 ただ、記事が4年前と古いので、今のご自身の環境に当てはめられるかどうかと言うと微妙かもしれません。
avantgarden

2022/03/31 02:33

すみません。再現コードを追加いたしました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。