Introducción

Siempre vamos a necesitar imprimir en la mayoría de aplicaciones que desarrollemos, independientemente del lenguaje en el que lo hagamos. En este caso veremos cómo imprimir con HTML y Javascript, conservando los estilos y obteniendo una impresión que es exactamente igual a lo que vemos en pantalla.

Precisamente esta mañana tuve que investigar un método fácil, rápido y viable para imprimir contenedores, y aquí traigo los resultados.

Nota: para investigar la mayoría de lo que expongo aquí tomé como referencia la maravillosa respuesta a esta pregunta de StackOverflow

Actualización: he quitado los plunkers y he puesto enlaces directos; ya que que plnkr.co ha estado fallando y los estilos no se estaban cargando; por eso ahora mejor alojo los ejemplos en vivo en mi servidor. Abajo de cada explicación está el link. Sólo te contaba; porque esto no afectará tu experiencia de usuario ni el código expuesto; todo funciona como un encanto.

Función

Aquí pondré la función pero un poco modificada. Primero, eliminé el encabezado, ya que si queremos incluir un encabezado lo ponemos en el mismo div, y si no, no lo incluimos.

En segundo lugar hice que reciba un elemento, no el id de un elemento. Es decir, la función recibe un elemento del DOM (obtenido con document.querySelector o con document.getElementById) en lugar de una cadena.

Así que queda así:

Imprimiendo el hola mundo

Para este ejemplo vamos a crear 2 divs con diferente contenido y sólo imprimiremos uno de ellos. En el script ya puse la función que definimos arriba. Pondré un botón y cuando hagan click en él se imprimirá el contenido de un div.

El código para escuchar al botón es el siguiente:

Mira el ejemplo en acción aquí.

Ya imprimimos el hola mundo, podemos pasar a cosas más avanzadas

Añadiendo estilo al imprimir

El documento, sin estilos, a mi parecer se ve bonito; pero siempre tendremos la necesidad de cambiar alguna u otra cosa. Así que voy a agregar unos estilos sólo para demostrar el concepto. Para ello, le pondré al párrafo un padding de 18 px y un color de fondo color rosa.

Al encabezado le pondré el color azul. El estilo queda así:

Ahora vemos los cambios, pero si intentamos imprimir no se ve ningún estilo. Esto es porque al imprimir se crea un documento nuevo que no lleva los estilos css. Pero para cargarlos, podemos añadir lo siguiente a nuestra función para imprimir:

Nota: esta vez necesitamos modificar la función para imprimir y poner una función en el evento onload de la ventana, para que primero cargue los estilos y luego imprima. Esto no es necesario si tu documento no lleva estilos.

Y ahora sí, si imprimimos veremos algo así:

Si deseas probarlo en vivo haz click aquí.

Ahora sí podemos añadir cualquier estilo, e incluso podemos agregar 2, 3 o infinitas hojas de estilo. Para ello fue que esperamos al window.onload, para que termine de cargar los estilos y luego imprima.

Añadir estilo diferente del documento

Si queremos que nuestro documento, al ser visualizado se vea de una forma pero al ser impreso de otra, podemos manejar dos hojas de estilo. Una para imprimir y otra normal. Para ello voy a crear una hoja de estilos nueva, en donde ahora el encabezado será rojo y el fondo del párrafo verde:

También al imprimir, cambiaremos la función para que ahora cargue una diferente hoja de estilos.

Ahora veamos los resultados. Normalmente, el documento luce así:

Pero al imprimir, se ve así:

Míralo en vivo aquí.

Imprimir diferentes contenedores

Para terminar este tutorial demostraré cómo podemos imprimir diferentes contenedores, incluso aunque no sean divs.

Para ello crearé un párrafo con el id parrafo, y pondré igualmente un botón. Así que el código HTML queda así:

Y para escuchar a los botones:

Podemos probar el código en el siguiente enlace: ejemplo 4 de imprimir con HTML, JS y CSS.

Y así es como podemos jugar con los estilos y los elementos. Por cierto, podemos cambiar el tamaño de la ventana (que por defecto es de 400 x 600)

No te vayas sin seguirme en Twitter, Facebook y GitHub, así me motivas a escribir más posts.
Igualmente te invito a suscribirte en la parte superior derecha escribiendo tu correo en el formulario.
Si tienes dudas déjalas en un comentario


parzibyte

He trabajado por más de 4 años en el desarrollo de software con experiencia en Java, PHP, JavaScript, HTML, Node.JS, Python, Android y Go. También he trabajado con bases de datos SQL como MySQL y SQLite, así como con bases de datos NoSQL usando MongoDB. Soy bueno utilizando algunos frameworks y herramientas como Firebase, jQuery, AngularJS, VueJS, CodeIgniter, Laravel, BulmaCSS, Bootstrap y Electron. Otros términos que conozco son: Arduino, GraphQL, API's, REST, AJAX, PouchDB, CouchDB, Experiencia de usuario, buenas prácticas de programación, Webpack, NPM, Administración de servidores y programación de scripts La plataforma en la que tengo más experiencia es la web, pero en mis ratos libres realizo unos pequeños ejercicios en C# y C. Estoy aquí para ayudarte a resolver tus problemas de programación y depuración :-)

2 Comments

Leonardo Marquez · noviembre 12, 2018 a las 4:53 pm

men no estas aplicando los estilos en la impresión

    parzibyte · noviembre 12, 2018 a las 5:45 pm

    Hola, muchas gracias por comentar. Plunker (que es en donde alojaba los ejemplos en vivo) ha estado fallando últimamente y no cargaba los estilos CSS. He movido los ejemplos a mi servidor y ahora van como un encanto. De nuevo gracias 🙂

Deja un comentario

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: