MPDFクラスを使用してPDFを生成しようとすると、次のエラーが発生します。
TTF file "C:/wamp/www/inc/mpdf/ttfonts/verdana.ttf": invalid checksum 20f65173c11 table: DSIG (expected 65173c11)
フォントファイルをttfonts
ディレクトリにアップロードし、次のようにconfig_fonts.php
でフォントを定義しました。
"verdana" => array(
'R' => "verdana.ttf",
'B' => "verdanab.ttf",
'I' => "verdanai.ttf",
'BI' => "verdanaz.ttf",
),
構成設定でフォントエラーレポートをオンにすると、エラーが表示されます。エラー報告をオフにすると、PDFが生成されますが、使用されているフォントはVerdanaではありません。
私が間違っていることについて何か考えはありますか?
@ hrvoje-golcicの回答に基づいて、config_fonts.php
を編集せずにフォントをmPDFに追加するための改善された、汚れの少ない方法を示します。私はLaravelを使用しています。コンポーザーを使用してmPDFをインストールしました。
mPDF
を初期化する前に_MPDF_TTFONTPATH
という名前の定数を定義し、その値をttfonts
フォルダーへのパスとして使用します(この定数は5.3以降に存在します)。vendor/mpdf/mpdf/ttfonts
フォルダーを、管理する場所(ベンダーフォルダーの外)にコピーします。fontdata
インスタンスのmPDF
プロパティに構成を追加します。Heads up:
ttfonts
フォルダーには約90MBがあるので、まだ良い方法があるかもしれませんが、それ以降すべてのフォントをコピーする必要があります元の構成はそれらを追加します。この回答の下部にあるcomposerスクリプトの代替案を参照してください。重要:CSS font-familyは変換されます 小文字+ nospacesになり、「Source Sans Pro」はsourcesansproになります。
次に例を示します。
if (!defined('_MPDF_TTFONTPATH')) {
// an absolute path is preferred, trailing slash required:
define('_MPDF_TTFONTPATH', realpath('fonts/'));
// example using Laravel's resource_path function:
// define('_MPDF_TTFONTPATH', resource_path('fonts/'));
}
function add_custom_fonts_to_mpdf($mpdf, $fonts_list) {
$fontdata = [
'sourcesanspro' => [
'R' => 'SourceSansPro-Regular.ttf',
'B' => 'SourceSansPro-Bold.ttf',
],
];
foreach ($fontdata as $f => $fs) {
// add to fontdata array
$mpdf->fontdata[$f] = $fs;
// add to available fonts array
foreach (['R', 'B', 'I', 'BI'] as $style) {
if (isset($fs[$style]) && $fs[$style]) {
// warning: no suffix for regular style! hours wasted: 2
$mpdf->available_unifonts[] = $f . trim($style, 'R');
}
}
}
$mpdf->default_available_fonts = $mpdf->available_unifonts;
}
$mpdf = new mPDF('UTF-8', 'A4');
add_custom_fonts_to_mpdf($mpdf);
$mpdf->WriteHTML($html);
すべてのフォントをコピーしてgitに追加する代わりに、composerポストインストールスクリプトを使用して、便利な回避策を実行できます。
まず、フォントをコピーするフォルダが存在することを確認し、その中に.gitignore
を作成します。その内容は次のとおりです。
*
!.gitignore
!SourceSansPro-Regular.ttf
!SourceSansPro-Bold.ttf
これにより、.gitignore
ファイルと追加するフォントを除くすべてが無視されます。
次に、次のスクリプトをcomposer.json
ファイルに追加します。
"scripts": {
"post-install-cmd": [
"cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
],
"post-update-cmd": [
"cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
]
}
これは6.1で動作するようにテストされています。
7.xでは、作成者 実装 外部フォントを追加するエレガントな方法です。
Mpdfライブラリに新しいフォントファミリーを追加する手順は次のとおりです。
newFont.ttf
_フォントファイルをこの場所の_/mpdf/ttfonts
_フォルダに追加します。_/mpdf/config_fonts.php
_ OR _/mpdf/src/config/FontVariables.php
_を編集して、新しいフォントファイルの_$this->fontdata
_配列にエントリを追加します。
_$this->fontdata = array(
"newFont" => array(
'R' => "newFont-Regular.ttf",
'B' => "newFont-Bold.ttf",
'I' => "newFont-Italic.ttf",
'BI' => "newFont-BoldItalic.ttf",
),
_
_font-family: 'newFont';
_がスタイルシートで使用できるようになりました。
$mpdfObj = new mPDF('', '', 'newFont'); $mpdfObj->SetFont('newFont');
これで新しいフォントが追加されました。
Libファイルに加えて、ランタイムで動的にフォントを追加する別の「汚い」方法があります。これは私の解決策でした。config_fonts.pdf
ファイルはベンダー/ファイルにあり、ライブラリの更新時に上書きされるため、変更することができませんでした。
function add_custom_fonts_to_mpdf($mpdf, $fonts_list) {
// Logic from line 1146 mpdf.pdf - $this->available_unifonts = array()...
foreach ($fonts_list as $f => $fs) {
// add to fontdata array
$mpdf->fontdata[$f] = $fs;
// add to available fonts array
if (isset($fs['R']) && $fs['R']) { $mpdf->available_unifonts[] = $f; }
if (isset($fs['B']) && $fs['B']) { $mpdf->available_unifonts[] = $f.'B'; }
if (isset($fs['I']) && $fs['I']) { $mpdf->available_unifonts[] = $f.'I'; }
if (isset($fs['BI']) && $fs['BI']) { $mpdf->available_unifonts[] = $f.'BI'; }
}
$mpdf->default_available_fonts = $mpdf->available_unifonts;
}
Mpdfの
ttfonts/
dirに関連するフォントパスを指定してください重要: CSS font-familyは小文字+ nospacesに変換されるため、「Source Sans Pro-Regular」はsourcesanspro-regularになります
たとえば、他のフォントには通常の太字バージョンがあるため、ここでは2つのフォントと3つのフォントファイルを追加しています。
$mpdf = new mPDF('utf-8', 'A4', '', '', 20, 15, 50, 25, 10, 10);
$custom_fontdata = array(
'sourcesanspro-regular' => array(
'R' => "../../../../wms/hr_frontend/job/internet/fonts/SourceSansPro-Regular/SourceSansPro-Regular.ttf"
// use 'R' to support CSS font-weight: normal
// use 'B', 'I', 'BI' and etc. to support CSS font-weight: bold, font-style: italic, and both...
),
'someotherfont' => array(
'R' => "../../../../wms/hr_frontend/job/internet/fonts/someotherfont.ttf", // In CSS font-weight: normal
'B' => "../../../../wms/hr_frontend/job/internet/fonts/someotherfont-bold.ttf" // In CSS font-weight: bold
)
);
add_custom_font_to_mpdf($mpdf, $custom_fontdata);
$mpdf->WriteHTML($html);
これはmpdf 5.x向けでしたが、うまくいけば6.xでも同様に機能します。誰かやってみましたか?
使用している場合...
- LaravelおよびmPDF 7. *
...これを試してください...
xxxxxxxx.ttf
またはxxxxxxxx.otf
ファイルをコピーしますvendor\mpdf\mpdf\ttfonts
に貼り付けますvendor\mpdf\mpdf\src\Config
に移動FontVariables.php
を開くXxxxxxxx。ttfの場合
"name_xxxxxxxx" => [
'R' => "xxxxxxxx.ttf",
],
Xxxxxxxx。otfの場合
"name_xxxxxxxx" => [
'R' => "xxxxxxxx.otf",
'useOTL' => 0xFF,
],
注:ただし、一部の。otfファイルは、。ttf
これで、名前を呼び出してフォントを使用できるようになりました。
フォントをデフォルトのフォントとして設定する必要がある場合。
$mpdf = new Mpdf(['default_font' => 'name_xxxxxxxx']);
それ以外の場合は、名前で呼び出すことにより、CSSのように追加できます。
<style>
p{
font-family: name_xxxxxxxx;
}
</style>
リファレンス mPDF 7.xのフォント
fontVariable.phpにフォントを追加するだけです
"pacifico" => [
'R' => "Pacifico.ttf",
'useOTL' => 0xFF,
'useKashida' => 75,
],
ttfファイル名がPacifico.ttfのように大文字で始まっていることを確認してから、フォントファミリーの名前を小文字の最初から始めます。たとえば、これを作成pacificoにして、テスト用のphpファイルを作成するだけでこれをテストできます
require_once __DIR__ . '/autoload.php';
$defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];
$defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4'.('orientation' == 'L' ? '-L' : ''),
'orientation' => 0,
'margin_left' => 3,
'margin_right' => 3,
'margin_top' => 3,
'margin_bottom' => 0,
'margin_header' => 0,
'margin_footer' => 0,
]);
$texttt= '
<html>
<p style="font-family: dejavusanscondensed;"> Text in Frutiger </p>
<p style="font-family: freeserif;"> Text in Frutiger </p>
<p style="font-family: freemono;"> Text in Frutiger </p>
<p style="font-family: freeserif;"> مرحبا بالعالم </p>
<p style="font-family: unbatang;"> 하는 바에 의하여 영장제도 </p>
<p style="font-family: centurygothic;"> Text in Frutiger </p>
<p style="font-family: pacifico;"> Text in Frutiger </p>
<p style="font-family: windsong;"> Text in Frutiger </p>
</html>';
$mpdf->WriteHTML($texttt,\Mpdf\HTMLParserMode::HTML_BODY);
$mpdf->Output();
Mpdf Arialフォントを追加
フォントファイルをダウンロード: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf
Arial.ttfをmpdf/ttfontsに貼り付けます
Config_fonts.phpと以下のコードをfontdata配列で開きます
"arial" => array( 'R' => "arial.ttf"、)、
画面にエラーを表示する必要はありません。 php + Apache(?)サーバーの「error.log」のようなログファイルですべてのエラーと警告を確認します。ログファイルのメッセージに基づいて問題を見つけて解決するのに役立ちます。
どのような場合でも、推奨フォントを使用する必要があります-mPDFマニュアルを参照してください。
おそらく、TrueTypeフォントを適切なMPDFの形式に変換する必要があります。 ( http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts )