TCPDF and insert an image base64 encoded

I’ve this string from Mysql db:

$img_base64_encoded = 

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

It show “HI” in a image.
Now i want to embed this image encoded directly inside a PDF generated with TCPDF plugin but always get error:

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

And this is how to insert it:

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

I’ve also tried with:

  $pdf->Image('@' . $img_base64_encoded);

with the same error.

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

Well, you can actually, looking at the code you just neet to add a ‘@’ before the base64 encoded string:

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

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

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

Tested with the last version of TCPDF

Solution 2

You cannot use base64 stream in src rather first save the stream to a file then use it

$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="' . $path . '">';
$pdf->writeHTML($img, true, false, true, false, '');

Solution 3

No need to write as HTML

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

Solution 4

For those who generate an HTML variable for output, this is how I got it working:
Note that I am generating a barcode using the tc-lib-barcode library found here

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

Solution 5

This code works for me. The only point to focus is the remove of "data:image/;base64," which is the beginning of my picture value in the database:

$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('@'.$imgLogo);

Note: I use setImageScale to reduce the picture size

Solution 6

Used this code with success for TCPDF to show image saved on mysql database. No need to save after reading from DB.
A little bit more polite, extracting imagetype from header data to provide it to Image API method.

            // 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('/', $datasegments[0]);
                $imagetype    = explode(';', $extension[1]);        
                $f_photoshow  = '@' . 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');

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply