将BASE64编码图像打印到FPDF文档中

Tho*_*703 9 php base64 fpdf

我在数据库中有一些base64存储的图像.是否可以使用FPDF直接在PDF文档中打印这些数据?

图像的数据结构

data:image/png;base64,iVBORw0KGgoAAAANSUhEUg7AAAfQAAACWCAYAAAAonXpvAAAfgUlEQVR4Ae2dC9BuVVnHuSN3QaBENA9h5A2IcJxMj8hUkymoQDfClIkmrQZr1EydMqapnKRMc8JmHLBBHadJJaV0lKQDZCmCQiqQ2KERUFARDhcFDpx /33W tznPe/ 3ttaa9/ a2Z9/32Xvt5nvVbl2evtdfee9dtS27bt4mACJmACJm8ACJtBvArv123xbbwImYAImYAImIAJ26K4HJmACJmACJjAAAnboAyhEZ8EETMAETMAE7NBdB0zABEzABExgAATs0AdQiM6CCZiACZiACdihuw6YgAmYgAmYwAAI2KEPoBCdBRMwARMwAROwQ3cdMAETMAETMIEBELBDH0AhOgsmYAImYAImYIfuOmACJm
Run Code Online (Sandbox Code Playgroud)

我认为$pdf->imagepng()应该是FPDF中的正确功能.

Muh*_*him 20

虽然评论提出了TCPDF解决方案,但我确实想说明有一种方法可以完全用FPDF完成.思考过程是这样的:

  1. data:image/png;base64,使用URI从URI中剥离explode
  2. 使用解码URI base64_decode
  3. 使用解码数据保存到PNG文件 file_put_contents
  4. 生成PDF并添加PNG文件 Image
  5. 删除PNG文件 unlink

永远记住错误检查.如果图像无法保存到服务器,您显然不想继续执行.确保始终严格检查函数是否返回false!

这是我的解决方案.在这个例子中,我使用一个小图像作为一个小URI.

const TEMPIMGLOC = 'tempimg.png';

$dataURI    = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAMAAADarb8dAAAABlBMVEUAAADtHCTeKUOwAAAAF0lEQVR4AWOgAWBE4zISkMbDZQRyaQkABl4ADHmgWUYAAAAASUVORK5CYII=";
$dataPieces = explode(',',$dataURI);
$encodedImg = $dataPieces[1];
$decodedImg = base64_decode($encodedImg);

//  Check if image was properly decoded
if( $decodedImg!==false )
{
    //  Save image to a temporary location
    if( file_put_contents(TEMPIMGLOC,$decodedImg)!==false )
    {
        //  Open new PDF document and print image
        $pdf = new FPDF();
        $pdf->AddPage();
        $pdf->Image(TEMPIMGLOC);
        $pdf->Output();

        //  Delete image from server
        unlink(TEMPIMGLOC);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也许有一天,有人会遇到同样的问题并发现它很有用.^ O ^ (2认同)
  • @MariM 我遇到了这个问题,我觉得它很有用 +1。 (2认同)

小智 6

为了确保图像与 FPDF 兼容并避免错误,这里是@pedro-soares 代码的修改版本:

function getImage($dataURI){
  $img = explode(',',$dataURI,2);
  $pic = 'data://text/plain;base64,'.$img[1];
  $type = explode("/", explode(':', substr($dataURI, 0, strpos($dataURI, ';')))[1])[1]; // get the image type
  if ($type=="png"||$type=="jpeg"||$type=="gif") return array($pic, $type);
  return false;
}
Run Code Online (Sandbox Code Playgroud)

因为 FPDF 只允许这三种文件类型,所以检查它是否有效很重要。使用:

$pic = getImage($Base64StringGoesHere);
if ($pic!==false) $pdf->Image($pic[0], 10,30,0,0, $pic[1]);
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道这是一个古老的话题,但是有解决此问题的简便方法。只需尝试以下简单步骤:

  1. 使用爆炸从URI 剥离数据:image / png; base64
  2. data://text/plain;base64,与剥离的URI剩下的内容连接
  3. 使用结果字符串(base64)作为FPDF的参数 Image()

例:

$dataURI= "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAMAAADarb8dAAAABlBMVEUAAADtHCTeKUOwAAAAF0lEQVR4AWOgAWBE4zISkMbDZQRyaQkABl4ADHmgWUYAAAAASUVORK5CYII=";

$img = explode(',',$logo,2);
$pic = 'data://text/plain;base64,'. $img;

$pdf = new FPDF();
$pdf->AddPage();
$pdf->Image($pic, 10,30,0,0,'png');
$pdf->Output();
Run Code Online (Sandbox Code Playgroud)

记住在Image()功能上选择正确的图像类型。