распечатать кодированное изображение BASE64 в документ FPDF

У меня есть некоторые изображения, хранящиеся в базе данных base64. Можно ли распечатать эти данные непосредственно в документе PDF с помощью FPDF?

Структура данных изображения

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

Я думаю, что $pdf->imagepng() должна быть правильной функцией в FPDF.


person Thomas1703    schedule 28.08.2013    source источник
comment
У меня такая же проблема. Вы нашли ответ?   -  person Ronald Araújo    schedule 11.01.2014
comment
Да, я перешел на библиотеку TCPDF. Вы можете добавить знак @ перед строкой base64 для преобразования. См.: tcpdf.org/examples/example_009.phps   -  person Thomas1703    schedule 16.01.2014


Ответы (7)


Хотя в комментариях предлагалось решение TCPDF, я хотел заявить, что есть способ сделать это полностью с помощью FPDF. Ход мысли такой:

  1. Удалите data:image/png;base64, из 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);
    }
}
person Muhammad Abdul-Rahim    schedule 14.05.2015
comment
Возможно, однажды кто-то столкнется с той же проблемой и найдет ее полезной. ^о^ - person Muhammad Abdul-Rahim; 14.05.2015
comment
@MariM Я столкнулся с этим и считаю это полезным +1. - person The Humble Rat; 22.03.2016

Я знаю, что это старая тема, но есть более простой способ решить эту проблему. Просто попробуйте эти простые шаги:

  1. Удалите data:image/png;base64 из URI, используя explode
  2. Объединить data://text/plain;base64, с тем, что осталось от очищенный URI
  3. Используйте строку результата (base64) в качестве аргумента FPDF Image()

Пример:

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

$img = explode(',',$dataURI,2)[1];
$pic = 'data://text/plain;base64,'. $img;

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

Не забудьте выбрать правильный тип изображения для вызова метода Image().

person Pedro Soares    schedule 16.06.2017
comment
Это здорово. Как вы это поняли? - person Gregory Bologna; 18.07.2019

Чтобы изображения работали с 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;
}

Поскольку FPDF допускает только эти три типа файлов, важно убедиться, что он действителен. Использовать:

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

Чтобы добавить немного больше к ответу Мари М, я просто добавил несколько строк для работы с любыми типами изображений. (у меня FPDF ругается, если изображение в формате jpeg и я пытаюсь загрузить 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];

Я уверен, что есть лучший способ сделать это с помощью регулярных выражений, но, честно говоря, регулярные выражения - не моя чашка чая...

person 195436    schedule 05.05.2016

Хорошо, я потратил полдня на тест с этой проблемой. Я должен сказать, что это решение предназначено для печати изображений из строки базы данных напрямую, без сохранения их во временных файлах.

Я собираюсь написать некоторые моменты для рассмотрения:

  • Я использую тип blob в БД для хранения человеческой подписи для печати в pdf-документе.
  • Я отправляю подпись для хранения в базу данных по почтовому методу с узла холста.
  • Когда я печатаю строку из BLOB-объекта БД, она приходит без плюсового символа «+», который не позволяет мне правильно печатать подпись. Чтобы решить эту проблему, я делаю «str_replace», чтобы удалить пробелы и вставить символ «плюс».

Тогда единственное, что вам нужно сделать, это:

$pdf->Image(str_replace(' ','+',$dbRow['blobImage']),160,150,20,10,'png');

Если вам нужно, как и мне, распечатать несколько изображений из базы данных, вы должны посмотреть, придут они или нет, потому что, если изображение придет пустым, у вас будет ошибка.

Я просто добавляю это к последнему коду:

if( $dbRow['blobImage'] ){
                 $pdf->Image(str_replace(' ','+',$dbRow['blobImage']),160,150,20,10,'png');
            }

ПРИМЕЧАНИЕ:

  • 160 -> X положение изображения
  • 150 -> Y положение изображения
  • 20 -> X Масштаб изображения
  • 10 -> Y Масштаб изображения
  • 'png' -> Базовый формат моего типа изображения Base64.
person Antonio    schedule 24.04.2019

Новое решение с imagecreatefromstring() лето 2019

  • удалить временный .png, если он существует
  • создать временный файл .png
  • используйте $pdf->Изображение (fpdf)

Мой API возвращает мне матрицу данных 1234 в виде массива байтов. В следующем коде показано, как использовать этот массив байтов как Png в Fpdf.

Мой ответ $ = "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs + 9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABJSURBVChTjYwBCgAgCAP9 / 6dNreVUgg7Gps3EUOfD5Q4Au6YdAGcH8ygyVKrFnhmbc9FL7qRxWRxEkXWW4Q691UsGpZPzt7dEFyY47RMW + x2LAAAAAElFTkSuQmCC"

$filename = '/lk_Reptool/printing/tmp/tmppng.png';

if (file_exists($filename)) {
    unlink($filename);
}
$response = file_get_contents('https://myapi.com/TwoDCode/GetDatamatrixAsPngByteArray?datamatrixText=' . $RepID . '&pixelSize=100');
$response = base64_decode($response);
$img = imagecreatefromstring($response);
imagepng($img, $filename);

код для пдф

$pdf = new PDF('P', 'mm', 'A4');
$pdf->AddPage();
$pdf->Image('/lk_Reptool/printing/tmp/tmppng.png', 180, 20, 10, 10);
person Ivan Rakitin    schedule 23.07.2019

Просто расширьте Fpdf (проверено на 1.8.1) с помощью этой функции:

protected function _parsepngdata($data) {
    $f = tmpfile();
    fwrite($f, base64_decode(substr($data, strpos($data,",")+1)));
    fseek($f, 0);
    $info = $this->_parsepngstream($f,"pngdata");
    fclose($f);
    return $info;
}

и используйте его следующим образом: (укажите данные base64 вместо имени файла и установите тип pngdata вместо png)

$pdf->Image("data:image/png;base64,iVBORw0KGgo...", $x, $y, $w, $h, "pngdata");

Он создаст временный файл, запишет / прочитает данные в / из и затем удалит его.

person snoarf    schedule 06.10.2020