Lenguaje PHP

Crear PDF dinámico y enviar como archivo adjunto por Email

Crear PDF dinámico y enviar como archivo adjunto por Email. La creación de un archivo PDF se puede crear usando diversas librerías existentes en la red, usando el lenguaje matriz el PHP para generar un fichero dinámico. Sin embargo, en este artículo le agregaremos la opción de crear y enviar el PDF mediante un correo electrónico.

Recordemos que esta característica es muy común en la mayoría de las aplicaciones Web de tipo empresarial y que trabajan online.

Crear PDF dinámico y enviar como archivo adjunto por Email

Crear PDF y enviar por email Adjunto
Crear PDF y enviar por email Adjunto

¿Cómo funciona el script?

El script funciona usando el lenguaje PHP y una librería llamado «html2pdf» que será el encargado de crear el PDF y con la ayuda de PHP lograremos enviarlo mediante archivo adjunto en un correo electrónico.

Hemos dividido el proceso en dos pasos importantes.

Crear reportes será muy sencillo si usamos esta librería. Sin embargo, en este artículo detallaremos el funcionamiento del script.

Crear PDF dinámico y enviar como archivo adjunto por Email
Crear PDF dinámico y enviar como archivo adjunto por Email

¿Cuantas librerías existen para crear PDF?

FPDF  .- La librería está escrita en el lenguaje PHP para crear archivos formato PDF, también se puede visualizar en el navegador, la librería usa (PDO) y funciona bajo la licencia GPL. Sin embargo, se puede utilizar con fines de ejemplo y comercial.

MPDF .- Una biblioteca para crear reportes en el formato PDF, también se ejecuta bajo la licencia GPL. Además, esta biblioteca está basada en FPDF, HTML2PDF y UPDF por consecuente algunas características  se han mejorado considerablemente en esta versión.

TCPDF .-Es una librería muy buena para generar informes en PHP, genera formato de archivo PDF, esta librería es de código abierto y se ejecuta bajo la licencia GNU-LGPL.

FPDI  .- Biblioteca que permite generar y además leer páginas de formato PDF. Sin embargo, esta liberado bajo la licencia MIT, esta librería tiene como núcleo FPDF y por ende se realizó ciertas mejoras y ventajas en esta nueva versión.

Después de analizar hemos optado por la librería «html2pdf» para este ejemplo práctico. Además, mediante el uso de las bibliotecas tenemos que hacer nuestra tarea como crear un archivo PDF dinámico y enviar correo electrónico como datos adjuntos.

Descripción del script pasó a paso

Con la ayuda de este código puede enviar su formulario y generar PDF y enviarlo a través de gmail como archivo adjunto.

Primer paso: Crear un formulario

El fichero principal llamado «INDEX.PHP»  mostrara un formulario en su página y/o sistema web  y será el encargado de generar el archivo PDF y enviar por Email.

<div class="container">
<div class="page-header">
<h1>Crear PDF dinámico y enviar adjunto por Email</h1>      
</div>
<?php
if ($msgerror) {
?>
<div class="alert alert-danger"><?php echo $msgerror; ?></div>
<?php } else if ($msgsuccess) { ?>
<div class="alert alert-success"><?php echo $msgsuccess; ?></div>
<?php } ?>

<div class="form"> 
<form class="form-horizontal" action="" method="post">

<div class="form-group">
  <label class="control-label col-sm-2" for="mailto">Email A:</label>
  <div class="col-sm-10">
      <input type="email" class="form-control" id="mailto" placeholder="Ingrese Email A" name="mailto" value="<?php echo $_POST['mailto']; ?>">
  </div>
</div>

<div class="form-group">
  <label class="control-label col-sm-2" for="mailfrom">Mail De:</label>
  <div class="col-sm-10">
      <input type="email" class="form-control" id="mailfrom" placeholder="Ingrese Email De" name="mailfrom" value="<?php echo $_POST['mailfrom']; ?>">
  </div>
</div>

<div class="form-group">
  <label class="control-label col-sm-2" for="">Asunto Email:</label>
  <div class="col-sm-10">
      <input type="text" class="form-control" id="mailsubject" placeholder="Ingrese Asunto Email" name="mailsubject" value="<?php echo $_POST['mailsubject']; ?>">
  </div>
</div>

<div class="form-group">
  <label class="control-label col-sm-2" for="firstname">Nombres:</label>
  <div class="col-sm-10">
      <input type="text" class="form-control" id="firstname" placeholder="Ingrese Nombres" name="firstname" value="<?php echo $_POST['firstname']; ?>">
  </div>
</div>

<div class="form-group">
  <label class="control-label col-sm-2" for="lastname">Apellidos:</label>
  <div class="col-sm-10">
      <input type="text" class="form-control" id="lastname" placeholder="Ingrese Apellidos" name="lastname" value="<?php echo $_POST['lastname']; ?>">
  </div>
</div> 


<div class="form-group">
  <label class="control-label col-sm-2" for="description">Descripcion:</label>
  <div class="col-sm-10">
      <textarea placeholder="Ingrese Descripcion" class="form-control" id="description"  name="description" style=" height: 268px;"><?php echo $_POST['description']; ?></textarea>
  </div>
</div> 

<div class="form-group">        
  <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-success">Crear y Enviar PDF</button>
  </div>
</div>
</form>
</div>

</div>

Segundo paso: Declarar la biblioteca

Podemos obtener la biblioteca de forma gratuita por internet e incluir «HTML2PDF”. Veamos el ejemplo de declaración. Sin embargo, esta declaración es muy importante ya que con esta biblioteca podemos crear el PDF requerido en este ejemplo.

// LLamamos a la biblioteca para la creacion del PDF
require_once('html2pdf/html2pdf.class.php');

Tercer paso: Enviar por correo electronico

Aquí mostraremos todo referente al envío por correo electrónico del PDF generado. Es decir, la información enviada por el formulario y también no olvidarnos de la tabla para mostrar la información en el documento PDF. Veamos el siguiente ejemplo.

/*Envio de email y adjunto el PDF creado*/
$mailto = $_POST['mailto'];
$mailfrom = $_POST['mailfrom'];
$mailsubject = $_POST['mailsubject'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$description = $_POST['description'];

$description = wordwrap($description, 100, "<br />");
/* rompe el contenido de la descripción cada 100 caracteres después. */

$content = '';
$content .= '
<style>
table {
border-collapse: collapse;
}
table{
width:800px;
 margin:0 auto;
}
td{
border: 1px solid #e2e2e2;
padding: 10px; 
max-width:520px;
word-wrap: break-word;
}
</style>';

/* Tu css */
$content .= '<table>';

$content .= '<tr><td>Email A</td> <td>' . $mailto . '</td> </tr>';
$content .= '<tr><td>Mail De</td>   <td>' . $mailfrom . '</td> </tr>';
$content .= '<tr><td>Asunto Email</td>   <td>' . $mailsubject . '</td> </tr>';
$content .= '<tr><td>Nombres</td>   <td>' . $firstname . '</td> </tr>';
$content .= '<tr><td>Apellidos</td>   <td>' . $lastname . '</td> </tr>';
$content .= '<tr><td>Descripcion</td>   <td>' . $description . '</td> </tr>';

$content .= '</table>';

// LLmamos a la biblioteca para la creacion del PDF
require_once('html2pdf/html2pdf.class.php');

// Declaramos el formato del documento PDF
$html2pdf = new HTML2PDF('P', 'A4', 'fr');

$html2pdf->setDefaultFont('Arial');
$html2pdf->writeHTML($content, isset($_GET['vuehtml']));

$html2pdf = new HTML2PDF('P', 'A4', 'fr');
$html2pdf->WriteHTML($content);


$to = $mailto;
$from = $mailfrom;
$subject = $mailsubject;

$message = "<p>Consulte el archivo adjunto.</p>";
$separator = md5(time());
$eol = PHP_EOL;
$filename = "pdf-documento.pdf";
$pdfdoc = $html2pdf->Output('', 'S');
$attachment = chunk_split(base64_encode($pdfdoc));

$headers = "From: " . $from . $eol;
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol . $eol;

$body = '';

$body .= "Content-Transfer-Encoding: 7bit" . $eol;
$body .= "This is a MIME encoded message." . $eol; //had one more .$eol


$body .= "--" . $separator . $eol;
$body .= "Content-Type: text/html; charset=\"iso-8859-1\"" . $eol;
$body .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;
$body .= $message . $eol;


$body .= "--" . $separator . $eol;
$body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
$body .= "Content-Transfer-Encoding: base64" . $eol;
$body .= "Content-Disposition: attachment" . $eol . $eol;
$body .= $attachment . $eol;
$body .= "--" . $separator . "--";

if (mail($to, $subject, $body, $headers)) {

	$msgsuccess = 'Email enviado Correctamente';
} else {

	$msgerror = 'Email no ha sido enviado';
}

}
}

Proceso paso a paso de crear y enviar PDF Adjunto

a) Paso 01: Llenar el formulario

En esta sección tenemos que colocar los email en el lugar correcto, por ejemplo el de «Mail De«. Aquí, tiene que colocar el correo creado en el servidor.

Llenar el formulario
Llenar el formulario

b) Paso 02: Mensaje de enviado correctamente

Si el proceso resulto exitoso mostrara un mensaje de envío correcto, caso contrario mostrara mensaje de error.

Email adjunto PDF enviado correctamente
Email adjunto PDF enviado correctamente

c) Paso 03: Recepción del Email con el PDF Adjunto

Este esté paso solo verificamos si el correo llego a destino y lo revisamos en la bandeja de entrada. Cabe resaltar, que este correo debe de ser del campo llamado «Email A«. En nuestro formulario.

Recepcion del email adjunto PDF PHP
Recepcion del email adjunto PDF PHP

d) Paso 04: Visualizar en PDF adjunto

El último paso es verificar si el PDF llego en perfectas condiciones y si es posible visualizarlo sin ningún tipo de problemas en varias aplicaciones o vía online.

PDF recibido por Email PHP
PDF recibido por Email PHP

CONCLUSIÓN DE CREAR PDF DINÁMICO

Hemos aprendido que para generar un PDF mediante PHP podemos hacerlo usando varias librerías que cumplen el mismo fin.

Además, haciendo uso de un formulario podemos crear un PDF paso a paso y enviarlo por correo electrónico. Sin embargo, también podemos probar otras librerías para crear PDFs.

Tenemos que crear un ID de correo en tu servidor y utilízalo como correo electrónico de «Envío(de)«. Si se envía el formulario y no recibe ningún correo electrónico puede comprobar en la carpeta spam y crear ID de correo en el servidor.

[sociallocker id=5099] [/sociallocker]

 

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

10 comentarios

  1. Hola
    Muchas gracias por el post, fue de mucha ayuda.
    Quisiera saber cómo puedo agregar una imagen al documento PDF y enviarlo por email.

    Muchas gracias por tu ayuda

  2. hola, deseo crear un documento desde un formulario web y a partir de este generar un documento PDF y enviarlo como archivo adjunto por mail, con tu explicación no me quedó claro como llamar la librería, y buscando información solo encuentro que debo instalarla en un servidor local, pero yo uso un servidor web, las preguntas son:
    – todo este codigo del ejemplo va en un solo documento?
    – como agrego los archivos dependientes de la librería en mi servidor web?

  3. men estaba checando pero sabes que cuando estoy haciendo la prueba de enviar el correo, no me envia el correo mas que solo con los correos que correspondan a mi dominio,

    1. Esto es por que tu envio de correo lo estas haciendo con al mailto, puedes usar alguna libreria o ver como enviarlo como SMTP. Puedes buscar por ejemplo PHPMailer con SMTP.

  4. hola pregunta por que cuando lo pongo localmente en mi equipo usando xampp me sale lo siguiente y no se envia el correo me sale esto.

    to = veronet08@gmail.com
    subject = prueba
    body = Content-Transfer-Encoding: 7bit This is a MIME encoded message. –562f4b61536402beac4d5bd85b91ad93 Content-Type: text/html; charset=»iso-8859-1″ Content-Transfer-Encoding: 8bit
    Consulte el archivo adjunto.

    –562f4b61536402beac4d5bd85b91ad93 Content-Type: application/octet-stream; name=»pdf-documento.pdf» Content-Transfer-Encoding: base64 Content-Disposition: attachment JVBERi0xLjcKMyAwIG9iago8PC9UeXBlIC9QYWdlIC9QYXJlbnQgMSAwIFIgL01lZGlhQm94IFsw IDAgNTk1LjI4IDg0MS44OV0gL0dyb3VwIDw8IC9UeXBlIC9Hcm91cCAvUyAvVHJhbnNwYXJlbmN5 IC9DUyAvRGV2aWNlUkdCID4+IC9SZXNvdXJjZXMgMiAwIFIKL0NvbnRlbnRzIDQgMCBSPj4gZW5k b2JqCjQgMCBvYmoKPDwvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDEwNTk+PiBzdHJlYW0K eJztmk1P3DAQhu/7K3xsL66Tdb5upYJWQmolpL2hHhayrBYSFnah/P0m8cx4bJK4AjaiEofSPgye D4/fF5CqZJKJJxGLU6HEtTj/3fxVNn9+iEgqpcR69m0hvnyPRKQaFosrcbKYqZcdakOLp77YyLGP 0EfoI/QRGg0pmeep4B9361mkZaRFrpSc56ImjGRUiAoxTmWhGWYySwwWiRNt0TtrMld+5qvRdkyF mipAwTyXecSwkGn8POq2E+gdcKAdp0JNCCkBcSREGBjaoajbnd+7m3m8HVwWVrA33N2/d+Fe1G0n 0Dvglf2+NPxdrbfje2FO8o+7tWheaZNt132iyXayaD8Tx1I3PURdiUUpzj+d1MtNJY4+/xaL0/aL zt7y5TcjJ6mzW4vVLFa6/QfjRCZJT9zuszvuoV0vx4H1ujVqy5AUGZdGDGvCnmzc7fH5DG7+QFv4 7KgMPhYzXAC9noIzTPr0ikyqwnl6f1a77e3qQeVf1+0jlJfb+tXP8M1tO8vmUlnbbjF3pa91L4JP MPTOQubKzxw0piZl7SKaC+WwqKzX2ChZj+Ye24+j7dDt2AoqdwZW/QPz6/C7G+pdTe2TWa6lisxj /dna5PHqMD7JFNot12VSMF0RY8UUzeKkcK1dB+jlcVeiJbMyyvpOGPP+HgdnmHDRxpX4ov8PV9KJ zDLrSjqViSu0aN6LoDuO3lmTufIzB22gSVm7SFLGHIhQAZRNURI6PzuA4+3g7WAFO1I3sDehF3Xb CfQOOKkrJanM4LEe7R9vH7ai+yHuoNZEG3bZyhjviRhuBmVt4yRz5/wQB6wJN01lcD/GfALo9RSc YdJtgzWxbd/tHlcXy3foRlEuNXOjqJCxK7B83ougRo7eWZO58jMH5Z8zN8IKgJgDESqAoilKAudn B3C8HbwdrGBH6gb2JvSibjuB3gEndaO4kFqZ9/lrW1/sVvvDGhEu12UrWrwiYrgUFLGNk6id80Mc MCJcMpXB1RirCaDXU3CGSRcNRsQWfV3ub96fDaVF8wtvSjbUYuEqK4l7EWTI0DsLmSs/c1D3Tcra RdQu5bDYVTBStlFSNjs7hKPt0O3YCjgSDOxN6EVZO+HeO5zUhlTcPlLzQ9Hdqqo25fbARoTrdZlE S5fEuLsWEDGLk6j5+UEeNyJaMytjltNZTRh5T/8yw4SrBiNiq17uy+vle7SitPktN7FWlGqZuuqK 414EsXH0zprMlZ85qP3YWhFVAMQciFAB5ExRUnfs2lgfjreDt4MV7EjdwN6EXtRtJ9A74JRWlGaN NuB9Hq/2l7vN3eVme3tQM6IFu2yFi9dEDBeDQrZxEnbsmVkvB8wIF01lcD3GbgLo9RScYdJlGzPi y17W+/KmWpbV8qZ8/W/jI6HZ7L4vfPay/w8x+wtH09qoCmVuZHN0cmVhbSBlbmRvYmoKMSAwIG9i aiA8PC9UeXBlIC9QYWdlcyAgL0tpZHMgWyAzIDAgUiBdIC9Db3VudCAxID4+ICBlbmRvYmoKNSAw IG9iago8PCAvVHlwZSAvT0NHIC9OYW1lICj+/wBwAHIAaQBuAHQpIC9Vc2FnZSA8PCAvUHJpbnQg PDwvUHJpbnRTdGF0ZSAvT04+PiAvVmlldyA8PC9WaWV3U3RhdGUgL09GRj4+ID4+ID4+IGVuZG9i ago2IDAgb2JqCjw8IC9UeXBlIC9PQ0cgL05hbWUgKP7/AHYAaQBlAHcpIC9Vc2FnZSA8PCAvUHJp bnQgPDwvUHJpbnRTdGF0ZSAvT0ZGPj4gL1ZpZXcgPDwvVmlld1N0YXRlIC9PTj4+ID4+ID4+IGVu ZG9iago3IDAgb2JqCjw8L1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5cGUxIC9CYXNlRm9udCAvSGVs dmV0aWNhIC9OYW1lIC9GMSAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZyA+PiBlbmRvYmoKMiAw IG9iaiA8PCAvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0gL0Zv bnQgPDwgL0YxIDcgMCBSID4+IC9YT2JqZWN0IDw8ID4+IC9Qcm9wZXJ0aWVzIDw8L09DMSA1IDAg UiAvT0MyIDYgMCBSPj4gL0V4dEdTdGF0ZSA8PCA+PiA+PiBlbmRvYmoKOCAwIG9iago8PCAvQ3Jl YXRvciAo/v8ASABUAE0ATAAyAFAARABGACAALQAgAFQAQwBQAEQARikgL1Byb2R1Y2VyICj+/wBU AEMAUABEAEYAIAA1AC4AMAAuADAAMAAyACAAXCgAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAYwBw AGQAZgAuAG8AcgBnAFwpACAAXCgAVABDAFAARABGAFwpKSAvQ3JlYXRpb25EYXRlIChEOjIwMTkx MDAzMTMyODM5LTA1JzAwJykgL01vZERhdGUgKEQ6MjAxOTEwMDMxMzI4MzktMDUnMDAnKSA+PiBl bmRvYmoKOSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMSAwIFIgL09wZW5BY3Rpb24g WzMgMCBSIC9GaXRIIG51bGxdIC9QYWdlTGF5b3V0IC9TaW5nbGVQYWdlIC9QYWdlTW9kZSAvVXNl Tm9uZSAvTmFtZXMgPDwgPj4gL1ZpZXdlclByZWZlcmVuY2VzIDw8IC9EaXJlY3Rpb24gL0wyUiA+ PiAvT0NQcm9wZXJ0aWVzIDw8L09DR3MgWzUgMCBSIDYgMCBSXSAvRCA8PC9PTiBbNSAwIFJdIC9P RkYgWzYgMCBSXSAvQVMgWzw8L0V2ZW50IC9QcmludCAvT0NHcyBbNSAwIFIgNiAwIFJdIC9DYXRl Z29yeSBbL1ByaW50XT4+IDw8L0V2ZW50IC9WaWV3IC9PQ0dzIFs1IDAgUiA2IDAgUl0gL0NhdGVn b3J5IFsvVmlld10+Pl0+Pj4+ID4+IGVuZG9iagp4cmVmCjAgMTAKMDAwMDAwMDAwMCA2NTUzNSBm IAowMDAwMDAxMzA1IDAwMDAwIG4gCjAwMDAwMDE3MDcgMDAwMDAgbiAKMDAwMDAwMDAwOSAwMDAw MCBuIAowMDAwMDAwMTc1IDAwMDAwIG4gCjAwMDAwMDEzNjUgMDAwMDAgbiAKMDAwMDAwMTQ4NCAw MDAwMCBuIAowMDAwMDAxNjAxIDAwMDAwIG4gCjAwMDAwMDE4NjYgMDAwMDAgbiAKMDAwMDAwMjEx NSAwMDAwMCBuIAp0cmFpbGVyIDw8IC9TaXplIDEwIC9Sb290IDkgMCBSIC9JbmZvIDggMCBSID4+ CnN0YXJ0eHJlZgoyNDgwCiUlRU9GCg== –562f4b61536402beac4d5bd85b91ad93–
    headers = From: veronet08@gmail.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=»562f4b61536402beac4d5bd85b91ad93″
    Crear PDF dinámico y enviar adjunto por Email
    Email no ha sido enviado

    1. Hola Veronica,

      Para poder apreciar el ejemplo completo, tienes que probarlo en un servidor real y usando un correo corporativo del dominio, en el localhost no envia el Email.

      Saludos Veronica, espero haberte ayudado en tu duda.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba