ajouter une police à mPDF

j'obtiens l'erreur suivante quand j'essaie de générer un PDF en utilisant la classe mPDF:

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

j'ai téléchargé les fichiers de police pour mon ttfonts répertoire et défini la police 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'allume le rapport d'erreur de police dans les paramètres de configuration. Lorsque j'éteins le rapport d'erreur, le PDF est généré, mais la police utilisée n'est pas Verdana.

une idée de ce que je fais de mal?

16
demandé sur Paul Dessert 2013-07-11 10:23:30

5 réponses

basé sur la réponse de @ hrvoje-golcic, voici une façon améliorée et moins sale d'ajouter des polices à mPDF sans éditer config_fonts.php. J'utilise Laravel, j'ai installé mPDF avec 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 vers votre ttfonts dossier (cette constante existe depuis au moins 5.3).
  2. Copier vendor/mpdf/mpdf/ttfonts dossier à un emplacement que vous contrôlez (à l'extérieur du vendeur dossier.)
  3. Ajouter vos polices personnalisées à ce dossier avec les autres.
  4. ajouter votre configuration à la fontdata propriété sur l' mPDF instance.

Heads up:ttfonts le dossier a environ 90MB donc il y a peut-être encore un meilleur moyen, mais vous devez copier toutes les polices puisque la configuration d'origine les ajoute. Voir compositeur script alternative au bas de cette réponse.

IMPORTANT:CSS font-family sera transformée minuscules + nospaces donc "Source Sans Pro" va devenir 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);

Compositeur post-installation script

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

tout d'Abord, assurez-vous que le dossier où vous souhaitez copiez les polices existantes, et créez un .gitignore, avec le contenu suivant:

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

C'ignore tout, sauf de l' .gitignore le fichier et les polices que vous souhaitez ajouter.

Ensuite, ajoutez les scripts suivants à votre composer.json fichier:

"scripts": {
    "post-install-cmd": [
        "cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
    ],
    "post-update-cmd": [
        "cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
    ]
}

Notes

Cela a été testé pour fonctionner avec 6.1.

Dans 7.x, l'auteur mise en œuvre une façon élégante d'ajouter des polices externes.

12
répondu s3v3n 2017-01-09 01:58:26

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

  1. Téléchargez la police zip et décompressez-la.
  2. Ajouter un nouveau newFont.ttf fichier de police(s) à cet emplacement /mpdf/ttfonts dossier.
  3. Modifier /mpdf/config_fonts.php OR /mpdf/src/config/FontVariables.php pour ajouter une entrée à l' $this->fontdata array pour le nouveau fichier de police(s). 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 le les feuilles de style.

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

  6. Maintenant votre nouvelle police est ajouté.

10
répondu Ajai 2017-09-25 08:33:10

il y a une autre façon "sale" d'ajouter des polices de caractères dynamiquement dans le temps d'exécution mis à part dans les fichiers lib. C'était ma solution car je n'ai pas pu modifier config_fonts.pdf fichier puisqu'il se trouvait dans les fichiers du fournisseur et qu'il serait réécrit 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 police relatifs aux mpdf ttfonts/ dir

IMPORTANT: CSS font-family seront transformés en minuscules + nospaces donc "Source Sans Pro-Ordinaire" sera devenez sourcesanspro-régulier

par exemple ici j'ajoute 2 polices et 3 fichiers de polices parce que l'autre police a une version régulière 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);

ceci était pour mpdf 5.x mais espérons qu'il fonctionne pour 6.x ainsi. Quelqu'un at-il essayer?

4
répondu Hrvoje Golcic 2016-05-17 13:04:35

Pas besoin de montrer les erreurs à l'écran. Voir toutes les erreurs et d'avertissements dans le fichier journal comme "erreur.log" de votre php + apache(?) serveur. Il vous aidera à trouver et résoudre le problème basé sur de message dans le fichier journal.

I dans tous les cas, vous devriez utiliser les polices de caractères recommandées - voir le manuel mPDF.

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

0
répondu Intacto 2014-07-15 18:43:16

Mpdf ajouter de la police Arial

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

  2. coller l'arial.ttf à mpdf/ttfonts

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

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

0
répondu Mohd Bashir 2017-03-03 08:50:47