内容が古いのですが、下記記事の内容で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
1<button id="pdfBtn"> 2<script> 3$(function() { 4 $("#pdfBtn").click(function(e) { 5 e.preventDefault(); 6 $.ajax({ 7 url: 'create_pdf.php', 8 datatype: "json" 9 }).done(function(res) { 10 res = JSON.parse(res); 11 console.log(res); 12 if (res.isSuccess) { 13 var a = document.createElement('a'); 14 a.setAttribute('href',res.url); 15 a.setAttribute('download', res.filename); 16 a.setAttribute('style','display:block;position:absolute;top:-999px;'); 17 document.querySelector('body').appendChild(a); 18 a.click(); 19 a.parentNode.removeChild(a); 20 } else { 21 alert('ダウンロードに失敗しました。') 22 } 23 }).fail(function() { 24 alert("通信エラーが発生しました。\n再度実行してください。"); 25 }); 26 }) 27}); 28</script>
create_pdf.php
1<?php 2require '../vendor/autoload.php'; 3use mikehaertl\wkhtmlto\Pdf; 4 5$html = <<<EOF 6<!doctype html> 7<html lang="ja"> 8<head> 9 <meta name="robots" content="noindex, nofollow"> 10 <meta charset="UTF-8"> 11 <title>test</title> 12 <style> 13 @charset "UTF-8"; 14 body { 15 font-family: "IPAexGothic"; 16 } 17 </style> 18</head> 19<body> 20~ 21+ 22& 23$ 24# 25( 26_ 27? 28</body> 29</html> 30EOF; 31 32$pdf = new Pdf([ 33 'binary' => '/usr/local/bin/wkhtmltopdf', 34 'encoding' => 'utf-8', 35 'commandOptions' => array( 36 'procEnv' => array( 37 'LANG' => 'ja_jp.utf-8', 38 ), 39 ), 40]); 41 42$pdf->addPage($html); 43 44$fileName = uniqid('test', false) . '.pdf'; 45$savePath = SAVE_DIR . $fileName; 46$isSuccess = $pdf->saveAs($savePath); 47if ($isSuccess) { 48 if (file_exists($savePath)) { 49 $url = URL . '/' . SAVE_DIR . '/' . $fileName; 50 $return = ['isSuccess' => true, 'url' => $url, 'filename' => $fileName]; 51 } 52} else { 53 $return = ['isSuccess' => false]; 54} 55 56echo json_encode($return);
この状態でPDFをダウンロードして開くと、全角記号は出力されず中身が真っ白の状態になります。実際組んでいるのは帳票のPDFなのですが、全角記号の箇所(¥, (, ), ~など)のみ出力されない状態になります。
なお、サーバー側のフォントに関しても記載しておきます。
CentOS8_Stream
1# pwd 2/usr/share/fonts/IPAexfont00401 3# ll 4total 13644 5-rwx------ 1 root root 6099900 Apr 26 2019 ipaexg.ttf 6-rwx------ 1 root root 7835672 Apr 26 2019 ipaexm.ttf 7-rw-r--r-- 1 root root 20564 Apr 26 2019 IPA_Font_License_Agreement_v1.0.txt 8-rwx------ 1 root root 1834 Apr 26 2019 Readme_IPAexfont00401.txt
2022.04.06 追記
まだ解決には至ってないのですが、
追加の検証結果が出ましたので、追記させていただきます。
wkhtmltopdf自体をコマンドラインで実行
結論:全角記号が出力されました。
検証内容:
html
1<!doctype html> 2<html lang="ja"> 3<head> 4 <meta name="robots" content="noindex, nofollow"> 5 <meta charset="UTF-8"> 6 <title>test</title> 7 <style> 8 @charset "UTF-8"; 9 body { 10 font-family: "IPAexGothic"; 11 } 12 </style> 13</head> 14<body> 15~ 16+ 17& 18$ 19# 20( 21_ 22? 23</body> 24</html>
上記のHTMLファイルを(test.html)を用意して、
$ wkhtmltopdf test.html test.pdf
を実行し、生成されたtest.pdfを確認すると、全角記号が出力されていました。
PHPをコマンドラインから実行
結論:こちらでも全角記号が出力されました。
検証内容:
php
1<?php 2require '../vendor/autoload.php'; 3use mikehaertl\wkhtmlto\Pdf; 4 5$html = <<<EOF 6<!doctype html> 7<html lang="ja"> 8<head> 9 <meta name="robots" content="noindex, nofollow"> 10 <meta charset="UTF-8"> 11 <title>test</title> 12 <style> 13 @charset "UTF-8"; 14 body { 15 font-family: "IPAexGothic"; 16 } 17 </style> 18</head> 19<body> 20~ 21+ 22& 23$ 24# 25( 26_ 27? 28</body> 29</html> 30EOF; 31 32$pdf = new Pdf([ 33 'binary' => '/usr/local/bin/wkhtmltopdf', 34 'encoding' => 'utf-8', 35 'commandOptions' => array( 36 'procEnv' => array( 37 'LANG' => 'ja_jp.utf-8', 38 ), 39 ), 40]); 41 42$pdf->addPage($html); 43 44$fileName = uniqid('test', false) . '.pdf'; 45$savePath = SAVE_DIR . $fileName; 46$isSuccess = $pdf->saveAs($savePath);
最初に記載したcreate_pdf.phpからjsonを返す部分のみを省いたもの(create_pdf_test.php)を用意し、
$ php create_pdf_test.php
を実行し、保存ディレクトリに生成されたPDFファイルを確認すると、全角記号が出力されていました。
なので、画面上のボタンをクリックしAjaxで処理させた場合(Webサーバーから実行?)させた場合のみ、生成されたPDFに全角記号が出ないということは分かりました。
とはいえ、それに対してどう対応すべきものか分からず、引き続き何かヒントでもいただければと思います…
回答2件
あなたの回答
tips
プレビュー