代码之家  ›  专栏  ›  技术社区  ›  itajackass

TCPDF并插入一个基于64编码的图像

  •  8
  • itajackass  · 技术社区  · 7 年前

    我从Mysql数据库中获得了以下字符串:

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

    它在图像中显示“HI”。 现在,我想将这个直接编码的图像嵌入到使用TCPDF插件生成的PDF中,但总是会出现错误:

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

    下面是如何插入它:

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

    我还尝试了:

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

    同样的错误。

    6 回复  |  直到 7 年前
        1
  •  38
  •   Gianluca    6 年前

    实际上,您可以查看需要在base64编码字符串之前添加“@”的代码:

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

    使用最新版本的TCPDF进行测试

        2
  •  8
  •   Vinay    7 年前

    您不能在src中使用base64流,而是先将流保存到文件中,然后再使用它

    $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, '');
    
        3
  •  3
  •   sdespont    5 年前

    无需以HTML格式编写

        $img = base64_decode(preg_replace('#^data:image/[^;]+;base64,#', '', $img_base64_encoded));
        $this->tcpdf->Image("@".$img, 68, 208, 46, 46);
    
        4
  •  0
  •   Hendrik van der Merwe    4 年前

    对于那些为输出生成HTML变量的人,我是这样让它工作的: 请注意,我正在使用找到的tc lib条形码库生成条形码 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">';
    
        5
  •  0
  •   Dharman Aman Gojariya    4 年前

    这个代码对我有用。唯一需要关注的是删除“data:image/;base64”,这是数据库中图片值的开头:

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

    注意:我使用setImageScale来减小图片大小

        6
  •  0
  •   Orison Almeida    3 年前

    成功地将此代码用于TCPDF以显示保存在mysql数据库上的图像。从DB读取后无需保存。 更礼貌一点,从标题数据中提取imagetype,将其提供给Image API方法。

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