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?
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.
_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).vendor/mpdf/mpdf/ttfonts
dans un emplacement que vous contrôlez (en dehors du dossier du fournisseur).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);
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/"
]
}
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.
Voici les étapes à suivre pour ajouter une nouvelle famille de polices à la bibliothèque mpdf:
newFont.ttf
à ce dossier /mpdf/ttfonts
.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",
),
font-family: 'newFont';
est maintenant disponible dans les feuilles de style.
$mpdfObj = new mPDF('', '', 'newFont');
$mpdfObj->SetFont('newFont');
Maintenant, votre nouvelle police est ajoutée.
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 mpdfIMPORTANT: 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é?
_ {Si vous utilisez ... _
- Laravel et mPDF 7. *
... essayez ceci ...
xxxxxxxx.ttf
ou xxxxxxxx.otf
vendor\mpdf\mpdf\ttfonts
vendor\mpdf\mpdf\src\Config
FontVariables.php
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
Mpdf ajoute la police Arial
Télécharger le fichier de polices: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf
Coller le fichier arial.ttf dans mpdf/ttfonts
Ouvrez config_fonts.php et le code ci-dessous avec le tableau fontdata
"arial" => tableau ( 'R' => "arial.ttf", ),
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 )