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?
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.
- comme suggéré par l'auteur, définissez une constante nommée
_MPDF_TTFONTPATH
avant d'initialisermPDF
avec la valeur comme chemin vers votrettfonts
dossier (cette constante existe depuis au moins 5.3). - Copier
vendor/mpdf/mpdf/ttfonts
dossier à un emplacement que vous contrôlez (à l'extérieur du vendeur dossier.) - Ajouter vos polices personnalisées à ce dossier avec les autres.
- 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.
Voici les étapes à suivre pour ajouter une nouvelle famille de polices dans la bibliothèque mpdf:
- Téléchargez la police zip et décompressez-la.
- Ajouter un nouveau
newFont.ttf
fichier de police(s) à cet emplacement/mpdf/ttfonts
dossier. 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", ),
font-family: 'newFont';
est maintenant disponible dans le les feuilles de style.$mpdfObj = new mPDF('', '', 'newFont'); $mpdfObj->SetFont('newFont');
Maintenant votre nouvelle police est ajouté.
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/
dirIMPORTANT: 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?
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)
Mpdf ajouter de la police Arial
télécharger le fichier de police: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf
coller l'arial.ttf à mpdf/ttfonts
Ouvrir config_fonts.php et le code ci-dessous avec le tableau fontdata
"arial" => array( 'R' = > "arial.ttf", ),