agregar fuente a mPDF

8 minutos de lectura

Avatar de usuario de Paul Dessert
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?

avatar de usuario de s3v3n
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.

  1. Como sugiere el autor, defina una constante llamada _MPDF_TTFONTPATH antes de inicializar mPDF con el valor como el camino a su ttfonts carpeta (esta constante existe desde al menos 5.3).
  2. Copia el vendor/mpdf/mpdf/ttfonts carpeta a una ubicación que usted controle (fuera de la carpeta del proveedor).
  3. Agregue sus fuentes personalizadas a esa carpeta junto con las demás.
  4. Agregue su configuración a la fontdata propiedad en el mPDF 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

Avatar de usuario de Ajai
Ajai

Los siguientes son los pasos para agregar una nueva familia de fuentes en la biblioteca mpdf:

  1. Descarga el zip de la fuente y descomprímelo.
  2. Agregar nuevo newFont.ttf archivo(s) de fuente a esta ubicación /mpdf/ttfonts carpeta.
  3. 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",
    ),
    
  4. font-family: 'newFont'; ahora está disponible en las hojas de estilo.

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

  6. 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

Avatar de usuario de Hrvoje Golcic
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/ directorio

IMPORTANTE: 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)

Avatar de usuario de Mohd Bashir
mohd bashir

Mpdf añadir fuente Arial

  1. Descargar archivo de fuente: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf

  2. Pegue el archivo arial.ttf en mpdf/ttfonts

  3. Abra config_fonts.php y el siguiente código con la matriz fontdata

    “arial” => matriz( ‘R’ => “arial.ttf”, ),

¿Ha sido útil esta solución?