web-dev-qa-db-ja.com

mPDFへのフォントの追加

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ではありません。

私が間違っていることについて何か考えはありますか?

18
Paul Dessert

@ hrvoje-golcicの回答に基づいて、config_fonts.phpを編集せずにフォントをmPDFに追加するための改善された、汚れの少ない方法を示します。私はLaravelを使用しています。コンポーザーを使用してmPDFをインストールしました。

  1. 著者が提案したように、mPDFを初期化する前に_MPDF_TTFONTPATHという名前の定数を定義し、その値をttfontsフォルダーへのパスとして使用します(この定数は5.3以降に存在します)。
  2. vendor/mpdf/mpdf/ttfontsフォルダーを、管理する場所(ベンダーフォルダーの外)にコピーします。
  3. 他のユーザーと共にカスタムフォントをそのフォルダに追加します。
  4. fontdataインスタンスのmPDFプロパティに構成を追加します。

Heads upttfontsフォルダーには約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);

Composerポストインストールスクリプト

すべてのフォントをコピーして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では、作成者 実装 外部フォントを追加するエレガントな方法です。

16
s3v3n

Mpdfライブラリに新しいフォントファミリーを追加する手順は次のとおりです。

  1. フォントZipをダウンロードして解凍します。
  2. 新しい_newFont.ttf_フォントファイルをこの場所の_/mpdf/ttfonts_フォルダに追加します。
  3. _/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",
    ),
    _
  4. _font-family: 'newFont';_がスタイルシートで使用できるようになりました。

  5. $mpdfObj = new mPDF('', '', 'newFont'); $mpdfObj->SetFont('newFont');

  6. これで新しいフォントが追加されました。

13
Ajai

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でも同様に機能します。誰かやってみましたか?

5
Hrvoje Golcic

MPDF 7.xでカスタムフォントを追加する最も簡単な方法

使用している場合...

  • LaravelおよびmPDF 7. *

...これを試してください...


  1. フォントZipファイルをダウンロードします。
  2. それを抽出し、xxxxxxxx.ttfまたはxxxxxxxx.otfファイルをコピーします
  3. vendor\mpdf\mpdf\ttfontsに貼り付けます
  4. vendor\mpdf\mpdf\src\Configに移動
  5. FontVariables.phpを開く
  6. 以下のコードを追加

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のフォント

0
Ahamed Rasheed

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();
0
Er Mandeep

Mpdf Arialフォントを追加

  1. フォントファイルをダウンロード: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf

  2. Arial.ttfをmpdf/ttfontsに貼り付けます

  3. Config_fonts.phpと以下のコードをfontdata配列で開きます

    "arial" => array( 'R' => "arial.ttf"、)、

0
Mohd Bashir

画面にエラーを表示する必要はありません。 php + Apache(?)サーバーの「error.log」のようなログファイルですべてのエラーと警告を確認します。ログファイルのメッセージに基づいて問題を見つけて解決するのに役立ちます。

どのような場合でも、推奨フォントを使用する必要があります-mPDFマニュアルを参照してください。

おそらく、TrueTypeフォントを適切なMPDFの形式に変換する必要があります。 ( http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts

0
Intacto