2013-08-28 99 views
6

Tôi đã lưu trữ một số ảnh dưới dạng base64 trong cơ sở dữ liệu. Có thể in các dữ liệu đó trực tiếp trong tài liệu PDF, sử dụng FPDF không?in hình ảnh được mã hóa BASE64 vào tài liệu FPDF

sctructure dữ liệu của hình ảnh

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

Tôi nghĩ $pdf->imagepng() nên chức năng ngay trong FPDF.

+0

Tôi cũng gặp vấn đề tương tự. Bạn có tìm thấy câu trả lời không? –

+0

Có, tôi đã thay đổi thành thư viện TCPDF. Bạn có thể thêm ký hiệu @ trước chuỗi base64 để chuyển đổi. Xem: http://www.tcpdf.org/examples/example_009.phps – Thomas1703

Trả lời

17

Trong khi các ý kiến ​​đề xuất một giải pháp TCPDF, tôi đã muốn nói rằng có một cách để làm điều này hoàn toàn với FPDF. Quá trình suy nghĩ là như thế này:

  1. Strip data:image/png;base64, từ URI sử dụng explode
  2. Giải mã URI với base64_decode
  3. Lưu dữ liệu được giải mã vào một tập tin PNG với file_put_contents
  4. Tạo một PDF và thêm tập tin với Image
  5. PNG Xóa các tập tin PNG với unlink

Luôn nhớ kiểm tra lỗi. Nếu hình ảnh không lưu được vào máy chủ, bạn rõ ràng không muốn tiếp tục thực hiện. Đảm bảo luôn kiểm tra chặt chẽ xem các hàm có trả về false không!

Đây là giải pháp của tôi. Tôi đã sử dụng một hình ảnh nhỏ cho một URI nhỏ trong ví dụ này.

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

Câu trả lời hay! Quá xấu OP có lẽ đã qua lâu rồi ... –

+2

Có lẽ một ngày nào đó ai đó sẽ gặp phải vấn đề tương tự và thấy nó hữu ích.^o^ –

+0

@MariM Tôi đã gặp phải điều này và tôi thấy nó hữu ích +1. –

1

Để thêm một chút nữa vào câu trả lời của Mari M, tôi chỉ thêm vài dòng để làm việc với mọi loại hình ảnh. (Như đối với tôi FPDF phàn nàn nếu hình ảnh là jpeg và tôi cố gắng để tải tempimg.png)

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

tôi chắc chắn có một cách tốt hơn để làm điều đó với biểu hiện thường xuyên, nhưng phải trung thực, không phải là regexp tách trà của tôi ...

0

Tôi biết đây là một chủ đề cũ, nhưng có một cách dễ dàng hơn để giải quyết vấn đề này. Chỉ cần cố gắng bước đơn giản này:

  1. Strip dữ liệu: image/png; base64 từ URI sử dụng explode
  2. Concatenatedata://text/plain;base64, với những gì còn lại từ URI tước
  3. Sử dụng chuỗi kết quả (base64) làm đối số của FPDF Image()

Ví dụ:

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

Nhớ chọn đúng loại hình ảnh trên chức năng Image().

0

Để đảm bảo những hình ảnh làm việc với FPDF và để tránh sai sót, đây là một phiên bản sửa đổi của mã @ 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; 
} 

Vì FPDF chỉ cho phép ba loại tập tin, điều quan trọng là để kiểm tra rằng nó hợp lệ. Để sử dụng:

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