TCPDF und fügen Sie ein base64-codiertes Bild ein

Lesezeit: 4 Minuten

Ich habe diese Zeichenfolge von Mysql db:

$img_base64_encoded = 

'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB3aWR0aD0iMzgiIGhlaWdodD0iNTIiPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigxMjEsIDEyMSwgMTIxKSIgZmlsbD0ibm9uZSIgZD0iTSA5IDggYyAtMC4wMyAwLjM1IC0xLjE5IDEzLjIzIC0yIDIwIGMgLTAuMjEgMS43MiAtMC40MSAzLjQ4IC0xIDUgYyAtMS4wMyAyLjY3IC0zLjI2IDUuMzMgLTQgOCBjIC0wLjgzIDMgLTEgMTAgLTEgMTAiLz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJyZ2IoMTIxLCAxMjEsIDEyMSkiIGZpbGw9Im5vbmUiIGQ9Ik0gOSAyOSBsIDExIC01Ii8+PHBhdGggc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0icmdiKDEyMSwgMTIxLCAxMjEpIiBmaWxsPSJub25lIiBkPSJNIDIxIDYgYyAwIDAuNjEgMC41MiAyNS4wNiAwIDM1IGMgLTAuMDUgMS4wMiAtMiAzIC0yIDMiLz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJyZ2IoMTIxLCAxMjEsIDEyMSkiIGZpbGw9Im5vbmUiIGQ9Ik0gMzUgMSBjIDAuMDQgMC4wNSAxLjg5IDEuOTggMiAzIGMgMC40OCA0LjUzIDAuNzUgMTEuMTQgMCAxNiBjIC0wLjUgMy4yNyAtMy4zOCA2Ljc1IC00IDEwIGMgLTAuNjMgMy4zMiAwIDExIDAgMTEiLz48L3N2Zz4='

Es zeigt “HI” in einem Bild. Jetzt möchte ich dieses Bild direkt in ein mit dem TCPDF-Plugin generiertes PDF einbetten, bekomme aber immer einen Fehler:

TCPDF ERROR: [Image] Unable to get the size of the image: 

Und so wird es eingefügt:

$img = '<img src="'%20.%20$img_base64_encoded%20.%20'">';
$pdf->writeHTML($img, true, false, true, false, '');

Ich habe es auch versucht mit:

  $pdf->Image("https://stackoverflow.com/questions/48043581/@" . $img_base64_encoded);

mit dem gleichen Fehler.

Nun, Sie können tatsächlich, wenn Sie sich den Code ansehen, müssen Sie nur ein “https://stackoverflow.com/questions/48043581/@” vor der base64-codierten Zeichenfolge hinzufügen:

$img_base64_encoded = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0gA...';

$img = '<img src="https://stackoverflow.com/questions/48043581/@" . preg_replace('#^data:image/[^;]+;base64,#', '', $img_base64_encoded) . '">';

$pdf->writeHTML($img, true, false, true, false, '');

Getestet mit der letzten Version von TCPDF

  • Kämpfe seit 5 Tagen mit diesem Problem. Viele widersprüchliche Informationen darüber, wie TCPDF dazu gebracht wird, IMG-Tags für Bilder zu verarbeiten, die aus MYSQL extrahiert wurden, aber Ihre Lösung war die einzige, die funktioniert hat.

    – TenG

    4. Juni 2020 um 13:27 Uhr

  • Danke, hat wirklich geholfen

    – Benutzer1037607

    6. Juni 2020 um 20:59 Uhr

  • Erhalten Sie einen TCPDF-Fehler ( [Image] Die Größe des Bildes kann nicht ermittelt werden)….

    – Petrus

    12. Juni 2020 um 14:29 Uhr

  • SIE SIND MEIN HELD! Der Trick ist das preg_replace-Zeug. Keine Ahnung, was es tut, aber es funktioniert! 🙂

    – Coderama

    10. Dezember 2020 um 16:04 Uhr

  • Für alle, die hierher kommen und das gleiche Problem haben wie ich (kein Ansatz erzeugt Bilder im PDF), stellen Sie sicher, dass Ihre HTML-Eigenschaften in doppelten Anführungszeichen und nicht in einfachen Anführungszeichen im HTML-Code stehen, den Sie an die writeHTML-Methode übergeben.

    – Josch

    25. Juni 2021 um 16:49 Uhr

Sie können den base64-Stream nicht in src verwenden, sondern speichern Sie den Stream zuerst in einer Datei und verwenden Sie ihn dann

$img_base64_encoded = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0gA...';
$imageContent = file_get_contents($img_base64_encoded);
$path = tempnam(sys_get_temp_dir(), 'prefix');

file_put_contents ($path, $imageContent);

$img = '<img src="'%20.%20$path%20.%20'">';
$pdf->writeHTML($img, true, false, true, false, '');

Keine Notwendigkeit, als HTML zu schreiben

    $img = base64_decode(preg_replace('#^data:image/[^;]+;base64,#', '', $img_base64_encoded));
    $this->tcpdf->Image("https://stackoverflow.com/questions/48043581/@".$img, 68, 208, 46, 46);

Für diejenigen, die eine HTML-Variable für die Ausgabe generieren, habe ich es folgendermaßen zum Laufen gebracht: Beachten Sie, dass ich einen Barcode mit der gefundenen tc-lib-barcode-Bibliothek generiere hier

$img_base64_encoded = 'data:image/png;base64,' . base64_encode($bobj->getPngData());
$text.= '<img src="@'%20.%20preg_replace('#^data:image/[^;]+;base64,#',%20'',%20$img_base64_encoded)%20.%20'" width="200" height="30">';

Benutzer-Avatar
NicoESIEA

Dieser Code funktioniert bei mir. Der einzige Punkt, auf den man sich konzentrieren muss, ist das Entfernen von „data:image/;base64“, das der Anfang meines Bildwerts in der Datenbank ist:

$img_base64_encoded = str_replace("data:image/;base64,", "", $logo);

// Image from data stream ('PHP rules')
$imgLogo = base64_decode($img_base64_encoded);

$this->setImageScale(7);
$this->Image("https://stackoverflow.com/questions/48043581/@".$imgLogo);

Hinweis: Ich verwende setImageScale, um die Bildgröße zu reduzieren

Benutzer-Avatar
Orison Almeida

Dieser Code wurde erfolgreich für TCPDF verwendet, um das in der MySQL-Datenbank gespeicherte Bild anzuzeigen. Nach dem Lesen aus DB muss nicht gespeichert werden. Ein bisschen höflicher, Extrahieren des Bildtyps aus Header-Daten, um ihn der Image-API-Methode bereitzustellen.

            // check if there is a database image set
            if ($f_photo==""){
                $f_photoshow="/home/customer/www/mysite/public_html/images/default.png";
            }else{
                //define type (png/jpg) extracted from header - ex: data:image/jpeg;base64,/9j/4AAQS.....
                $datasegments = explode(',',$f_photo);
                $extension    = explode("https://stackoverflow.com/", $datasegments[0]);
                $imagetype    = explode(';', $extension[1]);        
                $f_photoshow  = "https://stackoverflow.com/questions/48043581/@" . base64_decode($datasegments[1]);                  
            }   
            $mypositionY=$pdf->GetY()+7;
            $mypositionX=$pdf->GetX()+7;
            // Image([image], x, y, w, h, imagetype, link, align_after);
            $pdf->Image($f_photoshow,$mypositionX,$mypositionY,11,null,$imagetype[0],null,'N');

1011800cookie-checkTCPDF und fügen Sie ein base64-codiertes Bild ein

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

Privacy policy