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.
Descargar código o ejemplo
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í.
La librería para combinar PDF con PHP
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í.
Requisitos y recomendaciones
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.
Opcional: crear proyecto con composer
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.
Instalar libmergepdf
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.
Combinar o concatenar múltiples PDF’s con PHP
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.
Combinar PDF y mostrarlo en el navegador
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.
Combinar PDF con PHP y forzar descarga
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:
Escribir PDF combinado en nuevo documento
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í:
Conclusiones
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.
Pingback: Generar y guardar imágenes de códigos de barras con PHP - Parzibyte's blog