Etiqueta: PDF

  • Cuál es la mejor librería para hacer PDF desde PHP

    Cuál es la mejor librería para hacer PDF desde PHP

    Apuesto que te habrás topado con la necesidad de emitir reportes en PDF alguna vez, ¿cierto?

    Por ejemplo para generar facturas electrónicas.

    De por sí es un tema integrarte con los webservices del fisco (Léase AFIP, SUNAT, DGI, DIAN, etc…) y cuando pensás que todo está resuelto, te encontrás con que falta subir otra colina más: generar los benditos pdfs.

    Seguro habrás pensado:

    «Tiene que haber una librería que permita hacer pdfs con PHP»

    Y tenés razón… y a la vez no.

    ¿Cómo?

    Pues… es que no existe una librería si no unas cuantas… y las diferencias entre una y otra no siempre están disponibles a simple vista.

    Casi podríamos decir que elegir la librería para generar pdfs es un proyecto en sí mismo.

    Así que, para ayudarte a tomar esta decisión te voy a presentar un cuadro con las opciones más conocidas y sus características principales para que puedas analizarlas en conjunto y elegir la más conveniente para tus circunstancias particulares.

    Código abiertoBasado en HTMLOrientada a ObjetosInstalación vía composerDocumentaciónDependencias
    domPDFBuenaPHP 7.1+
    DOM
    MBString
    php-font-lib
    php-svg-lib
    fPDFNoNoRegular??
    html2pdfBuenaPHP 5.6+
    gd
    MBString
    mPDFBuenaPHP 5.6 a 7.4
    gd
    MBString
    tcpdfNoRegularPHP 5.3+
    PDFLibNoNoNoMuy buena
    setaPDFNoNoMuy buenaPHP 5.6+
    DOM
    iconv o MBString
    OpenSSL
    SPL
    Zlib
    Comparativa entre librerías para hacer PDF con PHP

    Si estás en un ambiente de hosting compartido lo principal es verificar si la versión qué versión de php tienes y qué extensiones están disponibles.

    Luego debes entender qué buscas priorizar: la facilidad de implementar la librería o la eficiencia en el uso de los recursos.

    La mejor librería para generar PDFs de alto contenido gráfico

    Si necesitas generar PDFs con grandes detalles gráficos (Inclusión de imágenes de fondo por ejemplo), lo más probable es que te convenga inclinarte por una librería simple como domPDF, mPDF o html2pdf.

    El problema que tienen estas librerías es que se vuelven poco eficientes cuando se trata de generar muchos archivos en poco tiempo.

    La librería más rápida para generar PDFs con PHP

    Si el principal requisito de tu aplicación es la velocidad de procesamiento tu mejor opción es PDFLib.

    Dado que se trata de una extensión de php, su velocidad difícilmente pueda ser superada por algún competidor escrito en PHP.

    Claro que esta velocidad viene con un precio: se trata de una librería paga y, si estás en un ambiente de hosting compartido, puede ser complejo instalarla.

    Otras herramientas para generar PDF desde PHP

    Algunas otras herramientas que, si bien no son exactamente librerías de php, pueden servirte para generar PDFs en tus aplicaciones:

    Como puedes ver, la elección de la herramienta ideal no es sencilla pero vale la pena hacer un poco de investigación y, sobre todo, comprender la necesidad específica para determinar cuál es la opción más conveniente.

    Coméntame cómo ha sido tu experiencia y qué tuviste en cuenta para elegir la librería que usaste 😉

  • 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);

  • Cómo hacer un PDF con PHP

    Cómo hacer un PDF con PHP

    Una necesidad bastante común en el desarrollo de aplicaciones basadas en web (Especialmente las que se usan dentro de ambientes corporativos) es la de emitir reportes.

    Una forma simple de resolver este problema es la generación de páginas html cuyo único objeto es ser impresas y dejar al usuario la decisión de guardarlas en lugar de imprimirlas.

    Si bien esta solución puede ser suficiente cuando se trata de emitir un reporte a un usuario, ciertamente no es lo ideal cuando se trata de intercambiarlo con algún otro sistema.

    Particularmente en este artículo voy a mostrarte algunas formas de generar archivos pdf usando PHP.

    Librería PDF de PHP

    Existe una extensión de PHP llamada PDF, la cual está basada en la librería PDFlib (Desafortunadamente, una librería propietaria).

    Esta librería debe ser instalada como una extensión PECL y su uso no es particularmente cómodo.

    Veamos un ejemplo:

    <?php 
    
    $pdf = pdf_new(); 
    pdf_open_file($pdf); 
    pdf_begin_page($pdf, 300, 300); 
    pdf_save($pdf); 
    pdf_translate($pdf, 100, 100); 
    pdf_rotate($pdf, 45); 
    pdf_rect($pdf, 0, 0, 20, 20); 
    pdf_stroke($pdf);
    pdf_end_page($pdf); 
    pdf_close($pdf);

    La librería provee un conjunto de funciones (no agrupadas en clases) y define un nuevo tipo de recurso (Similar a un archivo, sólo que específico para PDFs).

    A pesar de su aspecto rústico, PDF es probablemente la librería más versátil en cuanto a manejo de archivos de este tipo (y, a su vez, la de más bajo nivel).

    FPDF

    FPDF es un paquete sencillo. Se trata de una clase y una serie de archivos de fuentes (fonts) que pueden usarse para generar archivos pdf.

    Un ejemplo de su utilización es este:

    <?php
    require('fpdf.php');
    
    $pdf = new FPDF();
    $pdf->AddPage();
    $pdf->SetFont('Arial','B',16);
    $pdf->Cell(40,10,'¡Hola, Mundo!');
    $pdf->Output();
    

    El constructor de la clase recibe los parámetros para crear el marco de trabajo:

    • Orientación de la hoja (Portrait o Landscape)
    • Unidad de medida (mm para milímetros)
    • Tamaño de la página (A3, A4, A5)

    El método Output es el que efectivamente produce el pdf. Si no se aclara nada, la salida se envía al navegador, aunque puede ser redirigida a un archivo local para ser enviado a otro servidor (entre otras posibilidades):

    $pdf->Output('F', 'salida.pdf');

    El método Cell tiene que ver con el modo en que FPDF genera la salida: las páginas están divididas en celdas rectangulares contiguas.

    En todo momento existe un puntero a la posición actual dentro de la hoja y es esa posición la que se tomará como inicio de la celda sobre la que se quiera trabajar.

    En este ejemplo se está creando una nueva celda de 40 mm de ancho por 10 de alto y en ella se está escribiendo el texto «¡Hola, Mundo!» (Usando la tipografía Arial de 16 puntos y en negrita).

    Puedes consultar más información en FPDF

    mPDF

    mPDF es una librería algo más moderna. Su objetivo es presentarse como una opción de más alto nivel que FPDF.

    La principal diferencia es que mPDF toma textos HTML y los convierte en PDF, haciendo la tarea mucho más sencilla para el desarrollador (Aunque puede resultar bastante menos eficiente).

    Su instalación se realiza usando composer:

    composer require mpdf/mpdf

    Su uso puede ser tan sencillo como:

    <?php
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    $mpdf = new \Mpdf\Mpdf();
    $mpdf->WriteHTML('<h1>¡Hola, Mundo!</h1>');
    $mpdf->Output();

    También es posible realizar ciertas configuraciones (como en FPDF) para, por ejemplo, definir que la hoja estará apaizada:

    $mpdf = new \Mpdf\Mpdf(['orientation' => 'L']);

    Puedes consultar la información completa en el manual de uso de mPDF.

    ¿Cuál es la mejor opción para generar PDFs con PHP?

    Las opciones son varias y, como de costumbre, dependerá del caso particular al que te enfrentes (y los recursos que tengas disponibles) cuál sea la más conveniente (¡Hasta podrías hacer tu propia implementación!).

    Lo importante es que conozcas estas posibilidades para no tener que re-inventar la rueda :).