php

Unir o combinar archivos PDF con PHP y libmergepdf

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.

Combinar múltiples documentos PDF con PHP y libmergepdf

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í:

Crear proyecto con Composer

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:

Instalar librería para combinar PDF con PHP – libmergepdf

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.

Mostrar PDF en navegador

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:

Descargando PDF combinado con PHP

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í:

Guardar PDF combinado con PHP

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.

Lee más sobre PHP aquí.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.