Aprende a fusionar (unir o combinar) varios archivos PDF en uno solo en Symfony 3.

Cómo combinar varios archivos PDF en Symfony 3

¿Quiere enviar todos los dibujos, informes e información sobre los diferentes departamentos a su jefe, pero todos son PDF diferentes que contienen información relacionada? Muchos usuarios simplemente fusionarían los archivos PDF y eso es todo. Combinar archivos en un PDF común es extremadamente útil y necesario hoy en día, por lo que si ofrece algún tipo de aplicación administrativa para alguna empresa, agregar dicha función a su sistema puede ser útil para que no necesiten instalar un programa externo o hacerlo en línea. utilizando un servicio de terceros.

En este artículo, le mostraremos cómo combinar varios archivos PDF en uno solo utilizando la biblioteca PDFMerger.

1. Instalar pdfmerger

PDFMerger se basa en las clases fpdf y fpdi (instaladas automáticamente como dependencias) de Setasign. Hay otras versiones de la biblioteca original , trasladadas a PHP5 ya que la biblioteca original estaba alojada en codeplex , sin embargo, no tienen un nivel mínimo de estabilidad (funcionan, pero no con composer). La bifurcación de la biblioteca que trabaja con composer es la creada por @rguedes , ya que para Symfony, cualquier dependencia que quieras usar requiere un nivel mínimo de estabilidad (no dev-master). El tenedor también funciona incluso para Laravel. Para continuar con la instalación del paquete en tu proyecto Symfony, abre una terminal, cambia al directorio de tu proyecto e instala la biblioteca usando Composer: 

composer require rguedes/pdfmerger

Después de la instalación, podrá utilizar la clase PDFMerger y sus métodos. Para obtener más información sobre la bifurcación de esta biblioteca, visite el repositorio en Github aquí .

2. Usando la biblioteca

El uso de la biblioteca es muy simple y directo, crea una instancia de la fusión de PDF. Esta clase le permite fusionar muchos archivos como desee usando el método addPDF y finalmente generar el resultado combinado usando el método merge. Puede elegir qué páginas de los PDF se deben agregar al final, decidir cómo y dónde se generará también el PDF final.

Especificar qué páginas fusionar

La clase PDFMerger le permite fusionar muchos PDF como desee y necesite utilizando el addPDFmétodo, solo necesita proporcionar la ruta como primer argumento e indicar qué páginas del archivo deben fusionarse en el archivo final utilizando el segundo argumento que espera una cadena . Por ejemplo, puede combinar todas las páginas de un PDF:

$pdf = new PDFMerger();

// Agregue todas las páginas del PDF para fusionar
$pdf->addPDF("somePdfToMerge.pdf", 'all');

Especifique específicamente qué páginas desea proporcionando su número separado por una coma:

$pdf = new PDFMerger();

// Sume solo las páginas 1, 3 y 5
$pdf->addPDF("somePdfToMerge.pdf", '1, 3, 5');

O usando un rango, por ejemplo, de la página 5 a la 10:

$pdf = new PDFMerger();

// Agregue solo las páginas de 5 a 10
$pdf->addPDF("somePdfToMerge.pdf", '5-10');

Modelo de fusión

Usando el método de combinación, generará un PDF que contiene los archivos agregados (las páginas especificadas de cada PDF). Este archivo puede almacenarse o devolverse como respuesta según sus necesidades. El método para procesar las necesidades de PDF que se proporciona como primer argumento de la fusión método, los valores posibles para este argumento son: browserdownloadstringfile. Como segundo argumento, la ruta donde se guardará el PDF (si se usa archivo como método) o el nombre del PDF que se usará para devolverlo (con browserdownload):

Generar descarga directa

Si no necesita guardar el PDF en ningún lugar, solo generarlo y devolverlo como respuesta, puede forzar la descarga directa del PDF generado utilizando el identificador de descarga:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

// Requiere clase PDF de la biblioteca
use PDFMerger;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // ruta absoluta de los PDF para fusionar
        $pdfFile1Path = $this->get('kernel')->getRootDir() . '/../web/file1.pdf';
        $pdfFile2Path = $this->get('kernel')->getRootDir() . '/../web/file2.pdf';
        $pdfFile3Path = $this->get('kernel')->getRootDir() . '/../web/file3.pdf';

        // Crea una instancia de PDFMerger
        $pdf = new PDFMerger();

        // Agregue 2 archivos PDF al PDF final
        $pdf->addPDF($pdfFile1Path, 'all');
        $pdf->addPDF($pdfFile3Path, '1, 3, 5');

        // Generar descarga de "mergedpdf.pdf"
        $pdf->merge('download', "mergedpdf.pdf");
    }
}

Guardar en un archivo

Puede almacenar el resultado combinado en un archivo en su servidor:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

// Usa la clase de respuesta normal
use Symfony\Component\HttpFoundation\Response;
// Requiere clase PDF de la biblioteca
use PDFMerger;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // ruta absoluta de los PDF para fusionar
        $pdfFile1Path = $this->get('kernel')->getRootDir() . '/../web/file1.pdf';
        $pdfFile2Path = $this->get('kernel')->getRootDir() . '/../web/file2.pdf';

        // Crea una instancia de PDFMerger
        $pdf = new PDFMerger();

        // Agregue 2 archivos PDF al PDF final
        $pdf->addPDF($pdfFile1Path, 'all');
        $pdf->addPDF($pdfFile2Path, 'all');

        // Fusionar los archivos en un archivo en algún directorio
        $pathForTheMergedPdf = $this->get('kernel')->getRootDir(). '/../web/result.pdf';
        $pdf->merge('file', $pathForTheMergedPdf);

        return new Response(
            "¡Archivos combinados con éxito!"
        );
    }
}

Recuperar contenido binario del resultado pdf

En caso de que necesite recuperar el contenido del archivo generado (datos binarios) sin guardarlo en ningún lugar, puede utilizar el método de salida de cadena para recuperar el contenido como una variable. En este caso, devolveremos el contenido binario como respuesta con los encabezados del PDF (para ver en el navegador). También puede utilizar el tipo de navegador si lo desea:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

// Usar la clase Response de Symfony
use Symfony\Component\HttpFoundation\Response;
// Requiere clase PDF de la biblioteca
use PDFMerger;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // ruta absoluta de los PDF para fusionar
        $pdfFile1Path = $this->get('kernel')->getRootDir() . '/../web/file1.pdf';
        $pdfFile2Path = $this->get('kernel')->getRootDir() . '/../web/file2.pdf';
        $pdfFile3Path = $this->get('kernel')->getRootDir() . '/../web/file3.pdf';

        // Crea una instancia de PDFMerger
        $pdf = new PDFMerger();

        // Agregue 2 PDF al PDF final agregando todas sus páginas
        $pdf->addPDF($pdfFile1Path, 'all');
        $pdf->addPDF($pdfFile2Path, 'all');

        // Fusionar los archivos y recuperar su contenido binario PDF
        $binaryContent = $pdf->merge('string', "mergedpdf.pdf");

        // Envíelo como respuesta al navegador
        // (ver también en el navegador)
        // que es lo mismo que
        // $pdf->merge('browser', "mergedpdf.pdf");
        $response = new Response($binaryContent);
        $response->headers->set('Content-type' , 'application/pdf');
        return $response;
    }
}

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores