Postre de Pablo
Recibo el siguiente error cuando intento generar un PDF usando la clase mPDF:
TTF file "C:/wamp/www/inc/mpdf/ttfonts/verdana.ttf": invalid checksum 20f65173c11 table: DSIG (expected 65173c11)
He subido los archivos de fuentes a mi ttfonts
directorio y definió la fuente en config_fonts.php
como esto:
"verdana" => array(
'R' => "verdana.ttf",
'B' => "verdanab.ttf",
'I' => "verdanai.ttf",
'BI' => "verdanaz.ttf",
),
Solo veo el error cuando activo el informe de errores de fuente en los ajustes de configuración. Cuando desactivo el informe de errores, se genera el PDF, pero la fuente que se usa no es Verdana.
¿Alguna idea de lo que estoy haciendo mal?
s3v3n
Basado en la respuesta de @hrvoje-golcic, aquí hay una forma mejorada y menos sucia de agregar fuentes a mPDF sin editar config_fonts.php
. Estoy usando Laravel, instalé mPDF usando composer.
- Como sugiere el autor, defina una constante llamada
_MPDF_TTFONTPATH
antes de inicializarmPDF
con el valor como el camino a suttfonts
carpeta (esta constante existe desde al menos 5.3). - Copia el
vendor/mpdf/mpdf/ttfonts
carpeta a una ubicación que usted controle (fuera de la carpeta del proveedor). - Agregue sus fuentes personalizadas a esa carpeta junto con las demás.
- Agregue su configuración a la
fontdata
propiedad en elmPDF
instancia.
Aviso: Los
ttfonts
La carpeta tiene alrededor de 90 MB, por lo que aún puede haber una mejor manera, pero debe copiar todas las fuentes ya que la configuración original las agrega. Consulte la alternativa del script del compositor al final de esta respuesta.IMPORTANTE: La familia de fuentes CSS se transformará a minúsculas + sin espacios para que “Source Sans Pro” se convierta en sourcesanspro.
Aquí hay un ejemplo:
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 posterior a la instalación de Composer
En lugar de copiar todas las fuentes y agregarlas a git, una solución práctica que usa un script posterior a la instalación del compositor puede hacerlo por usted.
En primer lugar, asegúrese de que existe la carpeta donde desea copiar las fuentes y cree una .gitignore
en él, con los siguientes contenidos:
*
!.gitignore
!SourceSansPro-Regular.ttf
!SourceSansPro-Bold.ttf
Esto ignorará todo excepto el .gitignore
archivo y las fuentes que desea agregar.
A continuación, agregue los siguientes scripts a su composer.json
expediente:
"scripts": {
"post-install-cmd": [
"cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
],
"post-update-cmd": [
"cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
]
}
notas
Esto fue probado para trabajar con 6.1.
En 7.x, el autor implementado una forma elegante de agregar fuentes externas.
-
Esta podría ser la forma correcta de agregar fuentes personalizadas pero… si está usando Laravel y mPDF 7.x la forma más sencilla se menciona aquí agregando fuentes personalizadas en mPDF 7.x
– Ahamed Rashid
8 de febrero de 2019 a las 6:13
-
Bueno, el problema es que está muy mal cambiar cosas manualmente en el
vendor
carpeta– s3v3n
8 de febrero de 2019 a las 12:15
-
Ah ah tan divertido que no pude encontrar la conversión a minúsculas en ninguna parte de los documentos. ¿Por qué lo hicieron y por qué no documentarlo con un gran descargo de responsabilidad parpadeante gigante rojo en la sección de fuentes personalizadas? Gracias @s3v3n.
–Marek Mauricio
21 de noviembre de 2019 a las 10:06
Ajai
Los siguientes son los pasos para agregar una nueva familia de fuentes en la biblioteca mpdf:
- Descarga el zip de la fuente y descomprímelo.
- Agregar nuevo
newFont.ttf
archivo(s) de fuente a esta ubicación/mpdf/ttfonts
carpeta. -
Editar
/mpdf/config_fonts.php
O/mpdf/src/config/FontVariables.php
para agregar una entrada a la$this->fontdata
matriz para los nuevos archivos de fuentes. Me gusta:$this->fontdata = array( "newFont" => array( 'R' => "newFont-Regular.ttf", 'B' => "newFont-Bold.ttf", 'I' => "newFont-Italic.ttf", 'BI' => "newFont-BoldItalic.ttf", ),
-
font-family: 'newFont';
ahora está disponible en las hojas de estilo. -
$mpdfObj = new mPDF('', '', 'newFont');
$mpdfObj->SetFont('newFont'); -
Ahora se agrega su nueva fuente.
-
Recomiendo encarecidamente el método descrito aquí. Bajo ninguna circunstancia debe cambiar los archivos originales; todos los cambios desaparecen con la actualización. Aquí está cómo hacerlo en la documentación original: mpdf.github.io/fonts-languages/fonts-in-mpdf-7-x.html
– Pedro VARGA
17 de julio de 2021 a las 19:44
Hrvoje Golcic
Hay otra forma “sucia” de agregar fuentes dinámicamente en el tiempo de ejecución aparte de los archivos lib. Esta fue mi solución porque no pude modificar config_fonts.pdf
ya que estaba en los archivos del proveedor/y se sobrescribiría en la actualización de la biblioteca.
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;
}
Asegúrese de proporcionar rutas de fuente relativas a mpdf
ttfonts/
directorioIMPORTANTE: La familia de fuentes CSS se transformará a minúsculas + sin espacios, por lo que “Source Sans Pro-Regular” se convertirá en sourcesanspro-regular
Por ejemplo, aquí estoy agregando 2 fuentes y 3 archivos de fuentes porque otra fuente tiene una versión regular y en negrita:
$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);
Esto fue para mpdf 5.x pero espero que también funcione para 6.x. ¿Alguien intentó?
-
Puedo confirmar que esto funcionó para la rama 6.x de mPDF. Gracias por sugerir esto, no tengo idea de por qué toda esa lógica está integrada en la configuración inicial de mpdf y no se puede volver a ejecutar fuera de él ಠ_ಠ ¡Resolvería muchos problemas con las fuentes! 🙂
– jaymz
21 de diciembre de 2016 a las 17:15
simplemente agregue la fuente a FontVariable.php
"pacifico" => [
'R' => "Pacifico.ttf",
'useOTL' => 0xFF,
'useKashida' => 75,
],
asegúrese de que el nombre del archivo ttf comience con una letra mayúscula como pacifico.ttf luego nombre la familia de fuentes con el comienzo de la letra minúscula como lo hago en la parte superior. por ejemplo hacer esto pacifico
y ahora simplemente pruebe esto con crear un archivo php de prueba
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();
No es necesario mostrar errores en la pantalla. Vea todos los errores y advertencias en el archivo de registro como “error.log” de su servidor php + apache(?). Le ayuda a encontrar y resolver el problema según el mensaje en el archivo de registro.
En cualquier caso, debe usar fuentes recomendadas: consulte el manual de mPDF.
Probablemente, necesite convertir las fuentes TrueType al formato MPDF adecuado. (http://mpdf1.com/manual/index.php?tid=409&searchstring=fuentes)
mohd bashir
Mpdf añadir fuente Arial
-
Descargar archivo de fuente: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf
-
Pegue el archivo arial.ttf en mpdf/ttfonts
-
Abra config_fonts.php y el siguiente código con la matriz fontdata
“arial” => matriz( ‘R’ => “arial.ttf”, ),
¿Tuviste algún éxito?
– alexej_d
5 de marzo de 2014 a las 8:08
mira este enlace mpdf1.com/forum/discussion/1139/fonts-not-showing/p1
– Ajit Singh
10 de julio de 2014 a las 13:37