2013-08-28 78 views
6

我在數據庫中有一些作爲base64存儲的圖像。是否可以使用FPDF直接在PDF文檔中打印這些數據?圖像將BASE64編碼圖像打印到FPDF文檔中

data:image/png;base64,iVBORw0KGgoAAAANSUhEUg7AAAfQAAACWCAYAAAAonXpvAAAfgUlEQVR4Ae2dC9BuVVnHuSN3QaBENA9h5A2IcJxMj8hUkymoQDfClIkmrQZr1EydMqapnKRMc8JmHLBBHadJJaV0lKQDZCmCQiqQ2KERUFARDhcFDpx /33W tznPe/ 3ttaa9/ a2Z9/32Xvt5nvVbl2evtdfee9dtS27bt4mACJmACJm8ACJtBvArv123xbbwImYAImYAImIAJ26K4HJmACJmACJjAAAnboAyhEZ8EETMAETMAE7NBdB0zABEzABExgAATs0AdQiM6CCZiACZiACdihuw6YgAmYgAmYwAAI2KEPoBCdBRMwARMwAROwQ3cdMAETMAETMIEBELBDH0AhOgsmYAImYAImYIfuOmACJm 

數據sctructure我覺得$pdf->imagepng()應該在FPDF正確的函數。

+0

我也有同樣的問題。你找到答案了嗎? –

+0

是的,我改爲TCPDF庫。您可以在base64字符串之前添加@符號進行轉換。請參閱:http://www.tcpdf.org/examples/example_009.phps – Thomas1703

回答

17

儘管評論提出了一個TCPDF解決方案,但我確實想說明有一種方法可以完全用FPDF來完成。的思維過程是這樣的:

  1. 地帶data:image/png;base64,從URI使用explode
  2. 解碼URI與base64_decode
  3. 保存解碼後的數據與file_put_contents
  4. PNG文件生成一個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); 
    } 
} 
+2

好的答案!太糟糕OP可能早已不復存在...... –

+2

也許有一天有人會遇到同樣的問題,並發現它有用。^o^ –

+0

@MariM我遇到了這個,我覺得它有用+1。 –

1

爲了給Mari M添加更多答案,我只添加了幾行以處理任何類型的圖像。

$this->tempImgLoc = 'tempimg'; // Here I just remove the file extension 
$dataPieces = explode(',',$dataURI); 
$encodedImg = $dataPieces[1]; 
$decodedImg = base64_decode($encodedImg); 

// extract the image type from data:image/png;base64 
$extension = explode('/', $dataPieces[0]); 
$extension = explode(';', $extension[1]); 

$this->tempImgLoc .= '.' . $extension[0]; 

我肯定有一個更好的方式來做到這一點與正則表達式,但說實話,(對我來說,如果圖像是JPEG和我嘗試加載tempimg.png FPDF抱怨),正則表達式是不是我的一杯茶...

0

我知道這是一個老話題,但有一個更簡單的方法來解決這個問題。使用explode

  • Concatenatedata://text/plain;base64,什麼從剝離URI
  • 使用結果字符串左邊的base64從URI;圖像/ PNG:只要試試這個簡單的步驟:

    1. 地帶數據(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(); 
    

    請記住在Image()函數上選擇正確的圖像類型。

  • 0

    爲了保證影像與FPDF工作,並避免錯誤,這裏是@佩德羅 - 蘇亞雷斯代碼修改後的版本:

    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; 
    } 
    

    因爲FPDF只允許這三種類型的文件,以檢查是很重要的它是有效的。 使用方法:

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