【问题标题】:TCPDF and insert an image base64 encodedTCPDF 并插入 base64 编码的图像
【发布时间】:2018-06-11 03:11:11
【问题描述】:

我有这个来自 Mysql db 的字符串:

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

同样的错误。

【问题讨论】:

    标签: php tcpdf


    【解决方案1】:

    您不能在 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, '');
    

    【讨论】:

      【解决方案2】:

      实际上,您可以查看代码,只需在 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 测试

      【讨论】:

      • 在这个问题上苦苦挣扎了 5 天。关于如何让 TCPDF 处理从 MYSQL 提取的图像的 IMG 标记的许多相互矛盾的信息,但你的解决方案是唯一有效的解决方案。
      • 谢谢,真的很有帮助
      • 获取 TCPDF 错误([Image] 无法获取图像大小)....
      • 你是我的英雄!诀窍是 preg_replace 的东西。不知道它做了什么,但它有效! :)
      • 对于任何来到这里并遇到与我相同问题的人(这两种方法都不会在 PDF 中生成图像),请确保您的 HTML 属性用双引号引起来,而不是在您传递的 HTML 中用单引号引起来到 writeHTML 方法。
      【解决方案3】:

      无需写成 HTML

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

      【讨论】:

        【解决方案4】:

        对于那些为输出生成 HTML 变量的人,这就是我的工作方式: 请注意,我正在使用找到的 tc-lib-barcode 库生成条形码 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">';
        

        【讨论】:

        • 您在第一行添加 'data:image/png;base64',然后在第二行将其剥离。
        【解决方案5】:

        此代码对我有用。唯一需要关注的是删除“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 来缩小图片尺寸

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-17
          • 1970-01-01
          • 2019-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-26
          相关资源
          最近更新 更多