Los documentos PDF son parte importante en el mundo digital. Gracias a ellos podemos tener acceso a la información en un formato unificado y entendible por la mayoría de sistemas operativos.
Hoy veremos cómo unir muchos documentos PDF con PHP. Es decir, podemos unir 2 o más PDF’s con PHP. Esta operación también se conoce como merge o como combinar múltiples PDF.
Aparte de ver cómo combinar o unir PDFs con PHP veremos 3 maneras de mostrar el documento final combinado: mostrar en el navegador, forzar su descarga o escribirlo en un nuevo archivo PDF.
El código fuente está en mi Github: Ejemplo de cómo combinar PDF’s con PHP y libmergepdf.
Si quieres descargar el ejemplo haz click aquí.
El paquete o librería que usaremos para unir algunos documentos PDF con PHP será la llamada libmergepdf; la cual tiene un uso muy sencillo. Me parece que internamente utiliza FPDI pero eso es otra historia.
Puedes visitar el repositorio oficial aquí.
Lo que tenemos que hacer primero es instalar Composer, el gestor de dependencias de PHP. Te animo a que lo instales y configures, pues ahora todo buen programador de PHP gestiona sus dependencias con composer.
Antes de que te quejes por composer, lee por qué usarlo.
Por cierto, recuerda instalar PHP.
Si únicamente estás probando esto y no tienes un proyecto ya iniciado, entonces navega hasta el directorio en donde vas a crear tu proyecto (recomiendo una carpeta nueva) y ejecuta:
composer init
Rellena los datos que piden. En mi caso queda así:
Recuerda que esto es opcional.
Nota: si ya tienes un proyecto iniciado, mira cómo adaptar tu proyecto a composer.
En tu proyecto en donde esté ubicado tu archivo composer.json (es decir, en tu proyecto) ejecuta lo siguiente para instalar la librería:
composer require iio/libmergepdf:^4.0
Después de eso espera a que se instale. Debe verse parecido a lo siguiente:
Ahora sí ya podemos comenzar.
Debemos requerir el autoload de composer y luego de ello definir que usaremos el Merger, así:
<?php
require_once "./vendor/autoload.php";
use iio\libmergepdf\Merger;
Los PDF que voy a unir los pondré en un arreglo para efectos de simplicidad. Dichos documentos existen en la misma carpeta en donde está mi index.php.
<?php
/*
Combinar documentos PDF con PHP
y libmergepdf
@author parzibyte
*/# Cargar librerías
require_once "vendor/autoload.php";
use iio\libmergepdf\Merger;
# Ruta de los documentos
$documentos = ["cotizacion.pdf", "parzibyte.pdf", "documento.pdf"];
# Crear el "combinador"
$combinador = new Merger;
# Agregar archivo en cada iteración
foreach ($documentos as $documento) {
$combinador->addFile($documento);
}
# Y combinar o unir
$salida = $combinador->merge();
La salida tiene los datos del documento ya creado. Podemos escribirla en un documento PDF nuevo, mandarla al navegador o mandarla y forzar la descarga del mismo.
Sigue leyendo para ver las 3 maneras de mostrarlo o enviarlo al usuario final.
Para ello solamente se necesitan enviar algunos encabezados HTTP al navegador para que el mismo entienda que debe intentar mostrar el PDF con su visor.
<?php
/*
Combinar documentos PDF con PHP
y libmergepdf
Método 1: mostrar PDF en navegador
@author parzibyte
*/# Cargar librerías
require_once "vendor/autoload.php";
use iio\libmergepdf\Merger;
# Ruta de los documentos
$documentos = ["cotizacion.pdf", "parzibyte.pdf", "documento.pdf"];
# Crear el "combinador"
$combinador = new Merger;
# Agregar archivo en cada iteración
foreach ($documentos as $documento) {
$combinador->addFile($documento);
}
# Y combinar o unir
$salida = $combinador->merge();
/*
Ahora la salida la mostramos directamente en la petición,
y enviamos unos encabezados para que el navegador
lo interprete
*/# Este nombre se pondrá como título o nombre del documento
$nombreArchivo = "combinado.pdf";
header("Content-type:application/pdf");
header("Content-disposition: inline; filename=$nombreArchivo");
header("content-Transfer-Encoding:binary");
header("Accept-Ranges:bytes");
# Imprimir salida luego de encabezados
echo $salida;
/*
Aquí puedes hacer más cosas pero asegúrate
de no imprimir absolutamente nada; en este caso
pongo exit para terminar el script inmediatamente
*/exit;
Después de enviar los encabezados imprimimos lo que devolvió el combinador. Es importante notar que después de eso no debemos hacer ningún echo
ni printf
, es decir, no imprimir nada, porque podría “contaminar” a la salida.
Recuerda que sí puedes hacer otras cosas pero no algo que imprima algo, también ten cuidado con los errores porque a veces los mismos pueden contaminar la salida.
Con el método anterior, el usuario ve el documento PDF en el visor del navegador y opcionalmente puede descargarlo, ahora veamos cómo forzar a que se descargue.
Para ello agregamos unos encabezados extra e igualmente imprimimos la salida. Queda así:
<?php
/*
Combinar documentos PDF con PHP
y libmergepdf
Método 2: Forzar descarga de PDF
@author parzibyte
*/# Cargar librerías
require_once "vendor/autoload.php";
use iio\libmergepdf\Merger;
# Ruta de los documentos
$documentos = ["cotizacion.pdf", "parzibyte.pdf", "documento.pdf"];
# Crear el "combinador"
$combinador = new Merger;
# Agregar archivo en cada iteración
foreach ($documentos as $documento) {
$combinador->addFile($documento);
}
# Y combinar o unir
$salida = $combinador->merge();
/*
Ahora la salida la mostramos directamente en la petición,
y enviamos unos encabezados para que el navegador
lo interprete
*/# Este nombre se pondrá como título o nombre del documento
$nombreArchivo = "combinado.pdf";
# Encabezados para forzar descarga y especificar tipo de documento
header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename=$nombreArchivo");
# Imprimir salida luego de los encabezados
echo $salida;
/*
Aquí puedes hacer más cosas pero asegúrate
de no imprimir absolutamente nada; en este caso
pongo exit para terminar el script inmediatamente
*/exit;
De esa manera, cuando el usuario visite la página se descargará el archivo como en la captura:
Para terminar este tutorial veremos cómo escribir la salida en un nuevo documento, es decir, crear un nuevo PDF a partir de los demás.
En este caso usaremos file_put_contents
(pásate por este tutorial para aprender más) y queda así:
<?php
/*
Combinar documentos PDF con PHP
y libmergepdf
Método 3: Escribir en archivo
@author parzibyte
*/# Cargar librerías
require_once "vendor/autoload.php";
use iio\libmergepdf\Merger;
# Ruta de los documentos
$documentos = ["cotizacion.pdf", "parzibyte.pdf", "documento.pdf"];
# Crear el "combinador"
$combinador = new Merger;
# Agregar archivo en cada iteración
foreach ($documentos as $documento) {
$combinador->addFile($documento);
}
# Y combinar o unir
$salida = $combinador->merge();
/*
Ahora la salida la mostramos directamente en la petición,
y enviamos unos encabezados para que el navegador
lo interprete
*/# Este nombre se pondrá como título o nombre del documento
$nombreArchivo = "combinado.pdf";
# Escribir salida en el nombre del archivo
# Recomiendo: https://parzibyte.me/blog/2018/07/10/trabajando-con-archivos-y-carpetas-en-php-crud/
$bytesEscritos = file_put_contents($nombreArchivo, $salida);
if ($bytesEscritos !== false) {
echo "Correcto. Se escribieron $bytesEscritos bytes en $nombreArchivo";
} else {
echo "Error escribiendo archivo";
}
No es obligatorio que imprimas el mensaje, yo lo puse para informar. En mi caso se ve así:
De esta manera, a partir de una lista de documentos, podemos crear uno nuevo. En los ejemplos utilicé un foreach pero tú puedes adaptarlo como quieras.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios