Guía 18 – «Merge» de ficheros PDFs

He visto en el Foro de PHPRunner que había cierta necesidad de «mezclar» páginas de ficheros PDF’s y como veía que es tema sencillo de resolver y dado el interés que despertaba, he creado un ejemplo que paso a describir.

Objetivo

Este ejemplo debe servir para hacer «MERGE» de ficheros PDF’s

DEMO:  https://fhumanes.com/pdfMerge/

Solución técnica

Para hacer esta gestión con los ficheros PDF he descargado y utilizado esta librería de GITHUB: https://github.com/clegginabox/pdf-merger

A su vez, esta librería se basa en los productos que he utilizado para generar dinámicamente los ficheros PDF de los múltiples ejemplos que existen en el portal.

 

En la propia documentación de la librería se facilita este ejemplo de uso:

$pdf = new \Clegginabox\PDFMerger\PDFMerger;

$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4');
$pdf->addPDF('samplepdfs/two.pdf', '1-2');
$pdf->addPDF('samplepdfs/three.pdf', 'all');

//You can optionally specify a different orientation for each PDF
$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4', 'L');
$pdf->addPDF('samplepdfs/two.pdf', '1-2', 'P');

$pdf->merge('file', 'samplepdfs/TEST2.pdf', 'P');

// REPLACE 'file' WITH 'browser', 'download', 'string', or 'file' for output options
// Last parameter is for orientation (P for protrait, L for Landscape). 
// This will be used for every PDF that doesn't have an orientation specified

Realmente, es muy sencillo, rápido y práctico, la solución que nos brinda.

Para disponer de un ejemplo funcional, he definido los siguientes requisitos:

  • En el registro se pueden subir todos los ficheros PDF’s que se desee.
  • En el registro existirá un campo «Command», que especificará las operaciones que hay que hacer con los ficheros PDF’s.
  • Se podrá indicar el nombre de fichero de salida (PDF) y por donde lo entregará la aplicación.

El interfaz de la aplicación es:
En el botón «pdfMerge» se ejecutan los comandos que están definidos en el campo «Command».

La sintaxis es muy sencilla y se ajusta todo lo que he podido a los comando de la librería que previamente se ha mostrado. En el ejemplo no he dedicado mucho tiempo al análisis sintáctico de esta nomenclatura, por lo que si no es exacta, es posible que no haga nada o dé error.

Para hacer nuevas pruebas, por favor, crear nuevo registro con vuestro propios ficheros PDF’s.

Lo más importante es la codificación de la utilización de la librería y que es «pdfMerge.php»:

<?php 
/*
library  https://github.com/clegginabox/pdf-merger

Exmple:
$pdf = new \Clegginabox\PDFMerger\PDFMerger;

$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4');
$pdf->addPDF('samplepdfs/two.pdf', '1-2');
$pdf->addPDF('samplepdfs/three.pdf', 'all');

//You can optionally specify a different orientation for each PDF
$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4', 'L');
$pdf->addPDF('samplepdfs/two.pdf', '1-2', 'P');

$pdf->merge('file', 'samplepdfs/TEST2.pdf', 'P');

// REPLACE 'file' WITH 'browser', 'download', 'string', or 'file' for output options
// Last parameter is for orientation (P for protrait, L for Landscape). 
// This will be used for every PDF that doesn't have an orientation specified
*/
@ini_set("display_errors","1");
@ini_set("display_startup_errors","1");

require_once(__DIR__ . "/../include/dbcommon.php");
require_once(__DIR__ . "/analysis_of_files.php");

require_once __DIR__ . '/pdfMerge_1.0/autoload.php';

$rs = DB::Query("select * from pdfmerge where id_pdfMerge =".$_SESSION['id_pdfMerge']);
while( $data = $rs->fetchAssoc() )
{
    $arrayFiles = arrayPDF($data['Files']);
    $arrayCommand = explode("\n", $data['Command']);

    $pdf = new \Clegginabox\PDFMerger\PDFMerger;
    foreach ($arrayCommand as &$Command) {
        $statement = explode(";",$Command);
        if ( count($statement) > 1 ) {
            $part1 = explode(")",$statement[0]);
            $part2 = explode("(",$part1[0]);
            $file =  $part2[1];
            if ( is_numeric($file) ) {
                $part = explode("|",$statement[1]);
                switch (count($part)) {
                 case 1:
                          $pdf->addPDF($arrayFiles[$file], trim($part[0]));
                          break;
                 case 2:
                          $pdf->addPDF($arrayFiles[$file], trim($part[0]), trim($part[1]));
                          break;
                }
            } else {
                $part = explode(" | ",$statement[1]);
                switch (count($part)) {
                 case 2:
                          $pdf->merge(trim($part[0]), trim($part[1]));
                          break;
                 case 3:
                          $pdf->merge(trim($part[0]), trim($part[1]), trim($part[2]) );
                          break;
                }							
            }
        }
    }

}

Para cualquier duda o necesidad, contactar conmigo a través de email [email protected]

Os dejo el proyecto (PHPRunner 10.2) para que lo podáis desplegar en vuestros equipos. Recodar que deberéis actualizar el registro de muestra con vuestros propios ficheros PDF’s.

 

Adjuntos

Archivo Tamaño de archivo Descargas
zip Proyecto PHPRunner 10.2 y backup de base de datos 2 MB 433

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner