Cómo extraer las imágenes de un PDF usando PHP

Trabajar con pdfs no es lo más cómodo del mundo.. especialmente cuando se trata de extraer información de ellos.

Cuando se requiere realizar una misma tarea muchas veces es sumamente útil crear scripts para automatizar estas tareas.

En este ejemplo te mostraré cómo extraer una imagen guardada en un documento como este:

Por supuesto que no partiremos desde 0 habiendo tantas librerías disponibles.

Qué librería PHP permite leer archivos PDF

Existen diversas librerías para leer archivos PDF en PHP. Para este caso, una buena es https://github.com/smalot/pdfparser.

Utilizarla es bastante simple.

Comenzamos por instalarla usando Composer:

composer require smalot/pdfparser

Con esto tendremos acceso a objetos de tipo Smalot\PdfParser\Parser con los que podremos interpretar el contenido del archivo sin problemas.

Lo próximo entonces es abrir el archivo utilizando las capacidades de la librería:

<?php

require_once 'vendor/autoload.php';
use Smalot\PdfParser\XObject\Image;

$parser = new \Smalot\PdfParser\Parser();
$pdf    = $parser->parseFile($argv[1]);

En este caso estoy usando un script que recibirá el nombre del archivo .pdf por la línea de comandos

Cómo identificar una imagen dentro de un PDF

Las imágenes dentro de los archivos pdf constituyen un tipo de objeto especial llamado XObject.

Para identificarlos tenemos un método especial del parser: getObjectsByType que podemos utilizar de esta forma:

foreach ($pdf->getObjectsByType('XObject') as $xobject) {
    ...
}

Ahora entonces tenemos en la variable $xobject la referencia a la imagen.

Lo que nos falta es guardar ese contenido en algún archivo, enviarlo por email o cualquier otra cosa que queramos hacer.

Simplemente se trata de utilizar el método getContent del objeto, por ejemplo:

$images = array_filter($pdf->getObjectsByType('XObject'), fn($o) => $o InstanceOf Image );
foreach ( $images as $image ) {
    file_put_contents( 'image_'.$i, $image->getContent());
}

Y luego, si quisiéramos conocer el número de imágenes que había podríamos hacer un echo count($images);

mchojrin

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: