Home / Programmazione / PHP / Estrapolare immagini da HTML con PHP
Mattepuffo

Estrapolare immagini da HTML con PHP

Estrapolare immagini da HTML con PHP

Una cosa che mi è servita molto in questi giorni: estrapolare immagini da un pezzo di HTML.

Questo perchè nel mio db ho un campo dove i dati vengono salvati in HTML; da questo campo ho dovuto estrapolare le immagini per poi passarle ad altre funzioni.

Vediamo qui due esempi; in entrambi i casi useremo DOMDocument e XPath, con i quali possiamo estrapolare facilmente pezzi di contenuto HTML.

Primo esempio:

$doc = new DOMDocument();
    $doc->loadHTML($html);
    $xPath = new DOMXPath($doc);
    $nodo = $xPath->query('//img[@src]');
    foreach ($nodo as $nodo) {
        $imgsrc = $nodo->getAttribute('src');
        echo '<img src="' . $imgsrc . '">';
    }

In molti casi questo già può bastare.

Alla funzione loadHtml passiamo il testo in HTML.

Sotto cerchiamo tutti i tag <img> e nel foreach cerchiamo l'attributo src.

Il problema può nascere nel caso in cui l'immagine sia salvata in base64: se dovete rappresentarla su una pagina nessun problema, ma se dovete passarla ad una libreria esterna (come TCPDF nel mio caso) allora posso sorgere problemi.

 

Quello che possiamo fare è questo (grazie al forum di HTML.it per il suggerimento):

$doc = new DOMDocument();
    $doc->loadHTML($pdfTesto);
    $xPath = new DOMXPath($doc);
    $nodo = $xPath->query('//img[@src]');
    foreach ($nodo as $nodo) {
        $matches = array();
        if (preg_match('/^data:([^;]+);base64(.*)$/', $nodo->getAttribute('src'), $matches)) {
            $imgData = $matches[2];
            $imgType = $matches[1];
            $pdf->Image("@" . base64_decode($imgData)); // TCPDF
        }
    }

Il primo pezzo è uguale; cambia il codice dentro al foreach.

In pratica facciamo un if cercando l'intestazione dell'immagine (che sarà qualcosa del tipo data:image/jpeg;base64....).

Da li estrapoliamo sia l'immagine vera e propria ($imgData) che il tipo di file ($imgType).

A questo punto mi è bastato passare $imgData a TCPDF per mettere l'immagine su PDF creato.

Questo esempio può essere utile anche nel caso in cui volessimo salvare l'immagine sul server; in questo caso però dovremmo prima fare un controllo sul tipo, e poi usare la funzione appropriata (ad esempio imagecreatefromjpeg, imagecreatefrompng, ecc....).