web-dev-qa-db-fra.com

ajout de police à mPDF

Je reçois le message d'erreur suivant lorsque j'essaie de générer un PDF à l'aide de la classe mPDF:

TTF file "C:/wamp/www/inc/mpdf/ttfonts/verdana.ttf": invalid checksum 20f65173c11 table: DSIG (expected 65173c11)

J'ai chargé les fichiers de police dans mon répertoire ttfonts et défini la police dans config_fonts.php comme ceci:

"verdana" => array(
    'R' => "verdana.ttf",
    'B' => "verdanab.ttf",
    'I' => "verdanai.ttf",
    'BI' => "verdanaz.ttf",
    ),

Je ne vois l'erreur que lorsque j'active le rapport d'erreurs de police dans les paramètres de configuration. Lorsque je désactive le signalement des erreurs, le PDF est généré, mais la police utilisée n'est pas Verdana. 

Une idée sur ce que je fais mal?

17
Paul Dessert

Sur la base de la réponse @ hrvoje-golcic, voici un moyen amélioré et moins compliqué d’ajouter des polices à mPDF sans modifier config_fonts.php. J'utilise Laravel, j'ai installé mPDF en utilisant composer.

  1. Comme suggéré par l'auteur, définissez une constante nommée _MPDF_TTFONTPATH avant d'initialiser mPDF avec la valeur comme chemin d'accès à votre dossier ttfonts (cette constante existe depuis au moins 5,3).
  2. Copiez le dossier vendor/mpdf/mpdf/ttfonts dans un emplacement que vous contrôlez (en dehors du dossier du fournisseur).
  3. Ajoutez vos polices personnalisées à ce dossier avec les autres.
  4. Ajoutez votre configuration à la propriété fontdata sur l'instance mPDF.

Heads up: le dossier ttfonts a environ 90 Mo. Il existe donc peut-être un meilleur moyen, mais vous devez copier toutes les polices car la configuration d'origine les ajoute. Voir Variante de script de composition au bas de cette réponse.

IMPORTANT:La famille de polices CSS sera transformée en minuscules + nospaces afin que "Source Sans Pro" devienne sourcesanspro.

Voici un exemple:

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);

Script post-installation du compositeur

Au lieu de copier toutes les polices et de les ajouter à git, une solution de contournement pratique utilisant un script de post-installation de compositeur peut le faire pour vous.

Tout d’abord, assurez-vous que le dossier dans lequel vous souhaitez copier les polices existe et créez-y un .gitignore avec le contenu suivant:

*
!.gitignore
!SourceSansPro-Regular.ttf
!SourceSansPro-Bold.ttf

Cela ignorera tout sauf le fichier .gitignore et les polices que vous souhaitez ajouter.

Ensuite, ajoutez les scripts suivants à votre fichier 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/"
    ]
}

Remarques

Cela a été testé pour fonctionner avec 6.1.
Dans 7.x, l'auteur a mis en œuvre une manière élégante d'ajouter des polices externes.

15
s3v3n

Voici les étapes à suivre pour ajouter une nouvelle famille de polices à la bibliothèque mpdf:

  1. Téléchargez la police Zip et décompressez-la.
  2. Ajoutez un/des fichier (s) de police newFont.ttf à ce dossier /mpdf/ttfonts.
  3. Modifiez /mpdf/config_fonts.php OR /mpdf/src/config/FontVariables.php pour ajouter une entrée dans le tableau $this->fontdata pour le ou les nouveaux fichiers de police. Comme:

    $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'; est maintenant disponible dans les feuilles de style.

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

  6. Maintenant, votre nouvelle police est ajoutée.

12
Ajai

Il existe une autre méthode "incorrecte" pour ajouter des polices de manière dynamique au moment de l'exécution, en dehors des fichiers lib. C'était ma solution car je ne pouvais pas modifier le fichier config_fonts.pdf car il se trouvait dans le fichier fournisseur et serait écrasé lors de la mise à jour de la bibliothèque.

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;
}

Assurez-vous de fournir les chemins de polices relatifs au ttfonts/ dir de mpdf

IMPORTANT: La famille de polices CSS sera transformée en minuscule + nospaces, ainsi "Source Sans Pro-Regular" deviendra sourcesanspro-regular

Par exemple ici, j'ajoute 2 polices et 3 fichiers de police, car les autres polices ont une version normale et en gras:

$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);

C'était pour mpdf 5.x mais j'espère que ça marche aussi pour 6.x. Est-ce que quelqu'un a essayé?

5
Hrvoje Golcic

Le moyen le plus simple d’ajouter des polices personnalisées dans mPDF 7.x

_ {Si vous utilisez ... _

  • Laravel et mPDF 7. *

... essayez ceci ...


  1. Téléchargez le fichier de police Zip.
  2. Extrayez-le et copiez les fichiers xxxxxxxx.ttf ou xxxxxxxx.otf
  3. Collez-le dans vendor\mpdf\mpdf\ttfonts
  4. Aller au vendor\mpdf\mpdf\src\Config
  5. Ouvrez FontVariables.php
  6. Ajouter le code ci-dessous

Si xxxxxxxx .ttf

"name_xxxxxxxx" => [
                    'R' => "xxxxxxxx.ttf",
                   ],

Si xxxxxxxx .otf

"name_xxxxxxxx" => [
                    'R' => "xxxxxxxx.otf",
                    'useOTL' => 0xFF,
                   ],

Remarque: Cependant, certains fichiers .otf ne sont pas pris en charge par newwer Il est préférable d’utiliser .ttf

Voilà, vous pouvez utiliser la police en appelant son nom.

Si vous devez définir la police comme police par défaut.

$mpdf = new Mpdf(['default_font' => 'name_xxxxxxxx']);

Sinon, vous pouvez l'ajouter comme en CSS en appelant par son nom

<style>
    p{
       font-family: name_xxxxxxxx;
    }
</style>

Référence Polices dans mPDF 7.x

0
Ahamed Rasheed

Mpdf ajoute la police Arial

  1. Télécharger le fichier de polices: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf

  2. Coller le fichier arial.ttf dans mpdf/ttfonts

  3. Ouvrez config_fonts.php et le code ci-dessous avec le tableau fontdata

    "arial" => tableau ( 'R' => "arial.ttf", ),

0
Mohd Bashir

Pas besoin d'afficher les erreurs à l'écran . Voir toutes les erreurs et les avertissements dans le fichier journal comme "error.log" de votre serveur php + Apache (?) . Il vous aide à trouver et à résoudre le problème en fonction message dans le fichier journal.

Dans tous les cas, vous devriez utiliser des polices recommandées - voir le manuel mPDF.

Probablement, vous devez convertir les polices TrueType au format approprié de MPDF. ( http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts )

0
Intacto