Hinzufügen von Schriftarten zu mPDF

Lesezeit: 8 Minuten

Benutzeravatar von Paul Dessert
Paul Nachtisch

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, eine PDF-Datei mit der mPDF-Klasse zu generieren:

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

Ich habe die Schriftartdateien auf meine hochgeladen ttfonts Verzeichnis und definierte die Schriftart darin config_fonts.php so was:

"verdana" => array(
    'R' => "verdana.ttf",
    'B' => "verdanab.ttf",
    'I' => "verdanai.ttf",
    'BI' => "verdanaz.ttf",
    ),

Ich sehe den Fehler nur, wenn ich die Meldung von Schriftartfehlern in den Konfigurationseinstellungen einschalte. Wenn ich die Fehlerberichterstattung ausschalte, wird das PDF generiert, aber die verwendete Schriftart ist nicht Verdana.

Irgendeine Idee, was ich falsch mache?

Benutzeravatar von s3v3n
s3v3n

Basierend auf der Antwort von @hrvoje-golcic finden Sie hier eine verbesserte und weniger schmutzige Methode zum Hinzufügen von Schriftarten zu mPDF ohne Bearbeitung config_fonts.php. Ich verwende Laravel, ich habe mPDF mit Composer installiert.

  1. Definieren Sie, wie vom Autor vorgeschlagen, eine Konstante namens _MPDF_TTFONTPATH vor dem Initialisieren mPDF mit dem Wert als Pfad zu Ihrem ttfonts Ordner (diese Konstante existiert seit mindestens 5.3).
  2. Kopiere das vendor/mpdf/mpdf/ttfonts Ordner an einen Speicherort, den Sie kontrollieren (außerhalb des Vendor-Ordners).
  3. Fügen Sie Ihre benutzerdefinierten Schriftarten zusammen mit den anderen zu diesem Ordner hinzu.
  4. Fügen Sie Ihre Konfiguration der hinzu fontdata Eigentum auf der mPDF Beispiel.

Kopf hoch: Das ttfonts Der Ordner hat ungefähr 90 MB, also gibt es vielleicht noch einen besseren Weg, aber Sie müssen alle Schriftarten kopieren, da die ursprüngliche Konfiguration sie hinzufügt. Siehe Composer-Skript-Alternative am Ende dieser Antwort.

WICHTIG: CSS-Schriftfamilie wird transformiert in Kleinbuchstaben + Leerzeichen, sodass “Source Sans Pro” zu sourcesanspro wird.

Hier ist ein Beispiel:

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);

Composer-Nachinstallationsskript

Anstatt alle Schriftarten zu kopieren und sie zu Git hinzuzufügen, kann eine praktische Problemumgehung mit einem Composer-Nachinstallationsskript dies für Sie erledigen.

Stellen Sie zunächst sicher, dass der Ordner, in den Sie die Schriftarten kopieren möchten, vorhanden ist, und erstellen Sie eine .gitignore darin, mit folgendem Inhalt:

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

Dadurch wird alles außer der ignoriert .gitignore Datei und die Schriftarten, die Sie hinzufügen möchten.

Fügen Sie als Nächstes die folgenden Skripts zu Ihrer hinzu composer.json Datei:

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

Anmerkungen

Dies wurde getestet, um mit 6.1 zu arbeiten.
In 7.x hat der Autor umgesetzt eine elegante Möglichkeit, externe Schriftarten hinzuzufügen.

  • Dies ist möglicherweise die richtige Methode zum Hinzufügen benutzerdefinierter Schriftarten, aber … wenn Sie verwenden Laravel und mPDF 7.x Der einfachste Weg wird hier erwähnt, indem benutzerdefinierte Schriftarten in mPDF 7.x hinzugefügt werden

    – Ahamed Raschid

    8. Februar 2019 um 6:13 Uhr


  • Nun, das Problem ist, dass es sehr falsch ist, Dinge in der manuell zu ändern vendor Mappe

    – s3v3n

    8. Februar 2019 um 12:15 Uhr

  • Ah ah, so lustig, dass ich die Kleinbuchstabenumwandlung nirgendwo in den Dokumenten finden konnte. Warum haben sie es getan und warum warum nicht mit einem großen roten riesigen blinkenden Haftungsausschluss im Abschnitt für benutzerdefinierte Schriftarten dokumentieren? Danke @s3v3n.

    – Marek Maurizio

    21. November 2019 um 10:06 Uhr

Benutzeravatar von Ajai
Ajai

Im Folgenden sind die Schritte zum Hinzufügen einer neuen Schriftfamilie in der mpdf-Bibliothek aufgeführt:

  1. Laden Sie die Schriftart-Zip herunter und entpacken Sie sie.
  2. Neue hinzufügen newFont.ttf Schriftartdatei(en) an diesen Speicherort /mpdf/ttfonts Mappe.
  3. Bearbeiten /mpdf/config_fonts.php ODER /mpdf/src/config/FontVariables.php um einen Eintrag hinzuzufügen $this->fontdata Array für die neue(n) Schriftartdatei(en). Wie:

    $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'; ist jetzt in den Stylesheets verfügbar.

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

  6. Jetzt wird Ihre neue Schriftart hinzugefügt.

  • Ich rate dringend von der hier beschriebenen Methode ab. Auf keinen Fall sollten Sie die Originaldateien verändern – alle Änderungen sind mit dem Update weg. So geht’s in der Originaldokumentation: mpdf.github.io/fonts-languages/fonts-in-mpdf-7-x.html

    – Peter VARGA

    17. Juli 2021 um 19:44 Uhr

Benutzeravatar von Hrvoje Golcic
Hrvoje Golcic

Es gibt eine andere “schmutzige” Möglichkeit, Schriftarten dynamisch zur Laufzeit neben den lib-Dateien hinzuzufügen. Dies war meine Lösung, weil ich nicht ändern konnte config_fonts.pdf Datei, da sie sich in der Datei „Vendor/Dateien“ befand und bei einer Bibliotheksaktualisierung überschrieben würde.

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;
}

Stellen Sie sicher, dass Sie Schriftartpfade relativ zu mpdfs angeben ttfonts/ dir

WICHTIG: Die CSS-Schriftfamilie wird in Kleinbuchstaben + Leerzeichen umgewandelt, sodass “Source Sans Pro-Regular” zu sourcesanspro-regular wird

Zum Beispiel füge ich hier 2 Schriftarten und 3 Schriftartdateien hinzu, weil andere Schriftarten eine normale und eine fette Version haben:

$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);

Dies war für mpdf 5.x, aber hoffentlich funktioniert es auch für 6.x. Hat jemand versucht?

  • Ich kann bestätigen, dass dies für den 6.x-Zweig von mPDF funktioniert hat. Danke für diesen Vorschlag, ich habe keine Ahnung, warum all diese Logik in die anfängliche Einrichtung von mpdf eingebacken ist und außerhalb davon nicht erneut ausgeführt werden kann ಠ_ಠ Es würde viele Probleme mit Schriftarten lösen! 🙂

    – Jaymz

    21. Dezember 2016 um 17:15 Uhr

Fügen Sie einfach eine Schriftart zu FontVariable.php hinzu

                "pacifico" => [
                'R' => "Pacifico.ttf",
                'useOTL' => 0xFF,
                'useKashida' => 75,
            ],

Stellen Sie sicher, dass der ttf-Dateiname mit Großbuchstaben wie beginnt Pacifico.ttf Benennen Sie dann die Schriftfamilie mit dem Beginn des Kleinbuchstabens, wie ich es oben mache. mach das zB Pazifik
und testen Sie dies jetzt einfach mit create testing php file

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();

Keine Notwendigkeit, Fehler auf dem Bildschirm anzuzeigen. Sehen Sie alle Fehler und Warnungen in der Protokolldatei wie “error.log” Ihres PHP- + Apache(?)-Servers. Es hilft Ihnen, das Problem anhand der Meldung in der Protokolldatei zu finden und zu lösen.

In jedem Fall sollten Sie empfohlene Schriftarten verwenden – siehe mPDF-Handbuch.

Wahrscheinlich müssen Sie TrueType-Schriftarten in das richtige MPDF-Format konvertieren. (http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts)

Benutzeravatar von Mohd Bashir
Mohd Bashir

Mpdf fügen Sie die Schriftart Arial hinzu

  1. Schriftdatei herunterladen: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf

  2. Fügen Sie arial.ttf in mpdf/ttfonts ein

  3. Öffnen Sie config_fonts.php und den folgenden Code mit dem Fontdata-Array

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

1430350cookie-checkHinzufügen von Schriftarten zu mPDF

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy