Solución al bug de Internet Explorer 7 y la cláusula CSS page-break-before

Una acción que es ampliamente utilizada en proyectos web es la impresión de datos en dispositivos tales como una impresora. Internet Explorer 7Estos datos pueden ser recibos y sus copias, contratos, etc.

Imprimir en un proyecto web es relativamente sencillo, basta con enviar una orden javascript “window.print()” al navegador, para que éste nos presente el diálogo de impresión.

Esta operación se complica si deseamos imprimir contenido en más de una página, pero el contenido de la primera página, no la llena completamente. Por ejemplo, si estamos realizando una reserva de estancia en un apartamento, a través de internet, una impresión podría ser el resguardo de la reserva y una copia. Una para el dueño del apartamento a entregar en el momento de inicio de la estancia y otra, la copia, para el cliente que realiza la reserva.

Una primera idea que nos viene a la cabeza seguramente consiste en rellenar la primera página con lineas en blanco, a partir de donde finaliza el texto impreso. Si bien es una manera efectiva, plantea tantos o más problemas como los que soluciona. A saber, debemos conocer de antemano la longitud del texto, y lo que es más díficil, el tamaño de la página física en la que realizaremos la impresión.

Otra solución, mucho más elegante consiste en utilizar una propiedad de CSS llamada page-break-before. Con ella le indicamos al navegador cuando imprimimos, que debe realizar un salto de página, justo antes del elemento que tiene definida esta propiedad CSS.

Solamente deberiamos tener en cuenta, si estamos realizando un bucle, que no debemos poner la propiedad en el primer elemento u obtendremos una primera página en blanco al realizar la impresión.

Visto lo anterior, podríamos preguntarnos, ¿a que viene publicar un post con algo tan sencillo? Pues que como siempre, la batalla de navegadores se cobra sus habituales víctimas: los desarrolladores. En Internet Explorer 7, no siempre funciona esta propiedad. Al imprimir un texto simplemente se ignora, y aparecen todas las páginas una detrás de la otra, sin separación, como si fueran una sola.

Entonces, ¿que hacemos?. Como siempre, recurrir a técnicas no del todo puristas. Si incluimos las propiedades height y line-height al tag html que incorpora el page-break-before, el navegador de Microsoft ya puede realizar el salto de página.

Si tenemos un código como el siguiente, que no funciona en IE7.

<div style="page-break-before:always;">
... texto y html ...
</div>

Debemos dejarlo de la siguiente manera:

<div style="page-break-before:always;height:0;line-height:0;">
... texto y html ...
</div>

Si recargamos el navegador e imprimimos…. ¡ya tenemos la paginación correcta!

En este punto podríamos cerrar el post e ir a celebrar que ya hemos resulto el problema pero…, como ya dijimos unas lineas mas arriba, nada es tan sencillo como parece. Si esta página la visualizamos con Firefox, muy probablemente veamos que las lineas de texto se superponen las unas con las otras, ya que interpreta el line-height:0 correctamente, y no deja espacios entre líneas.

¿Qué debemos hacer pues? ¿Marginar un navegador frente al otro? ¿Complicar extremadamente el código?

Afortunadamente, la respuesta es que no. Una opción que recomendamos es hacer uso de las llamados comentarios condicionales de Internet Explorer. Estos comentarios, solamente son interpretados por la familia de IE. Los demas navegadores, los ignorarán como un comentario cualquiera.

Con lo que la manera de solucionar nuestro problema sería:

  1. <!--[if IE]>
  2. <div style="page-break-before: always;height:0; line-height:0;"></div>
  3. <![endif]–>
  4. <![if !IE]>
  5. <div style="page-break-before: always;"></div>
  6. <![endif]>

Debemos fijarnos en la manera que está construida la segunda opción, sin los “- -”, de otra manera no funcionará.

El primer endif acaba con dos guiones y las comillas son las normales no las tipográficas.

De esta manera los navegadores de la familia IE construiran el tag con el truco del height / line-height y los demás navegadores, utilizarán la segunda versión.

Espero que estos trucos os resulten útiles en vuestros proyectos.codi

2008-10-23. Actualizado con el codigo correcto evitando que Wordpress elimine carácteres

13 Respuestas a “Solución al bug de Internet Explorer 7 y la cláusula CSS page-break-before”


  1. 1 Juancho

    Muchas gracias!, me ha sido de mucha utilidad este post para resolver el bug del IE7.

  2. 2 Vien

    gracias por el POST.
    Por fin encuentro lo que necesito y bien explicadito, con ejemplos y todo. Muy bien para la prisa que llevo! :-)

  3. 3 Joseba

    Por fin encuentro una solución para el frikin bicho del IE7

    Gracias.

  4. 4 Andres Botero

    Viejito muy bacano, tu explicacion es super elaborada. Pero no me hace nada en firefox, en ie funciona divinamente.

  5. 5 David García

    Andres, si pones solo <div style=”page-break-before: always;”></div> en el firefox funciona?

    En el ejemplo me deje el tag de cerrar el <div>. Ahora lo he corregido. Tal vez por ello no te funciona.

  6. 6 David Cardona

    Hola. Es truco funciona muy bien para IE. Pero Firefox no reconoce la instruccion page-break-before: always….
    He ahi el problema. Que idea tienen para solucionar esto?
    Muchas gracias a todos

  7. 7 effixburfjoff

    That was a very nice post, I’m proud of you!
    Interesting Pages

  8. 8 carmelo

    tengo ese mismo problema para explorador 8

    que hago. NO me funciona

  9. 9 arntracks

    Te cuento que con este estilo en tu CSS
    h1.SaltoDePagina { page-break-before: always; }
    funciona el salto de página pero no siempre, tengo una página dinámica en la cual funciona la mitad de las veces aunque parezca increible.
    Y lo peor, que con el código que pusiste no funciona ni una sola vez.
    Espero que alguien tenga una idea más actual.

  10. 10 David García

    Hola!

    ¿Puedo ver el código html generado de tu pagina?

  11. 11 Dantrech

    Hola, para los que tienes problemas con este ejemplo, los problemas son 2:

    1.- Faltaba el caracter “-” en el primer “endif”.
    2.- Al hacer copy&paste del ejemplo de arriba, me di cuenta que las comillas no son las que el navegador interpreta, por lo cual, hay que reemplazarla con las normales.

    Abajo les pongo el codigo totalmente funcional, para que lo prueben.
    Ah, otra cosa. Los pagebreak dentro de tablas SI los interpreta IE, pero Mozilla NO. Por lo cual, tengan cuidado donde los ocupan, de preferencia pongan estas sentencias antes o despues de tablas, o en cualquier otra parte que no sea dentro de ella.

    Saludos, y que les sirva.

  12. 12 Dantrech

    No se ve el código, pero con los comentarios que les puse deben probarlo. Más claramente, en el punto 1, el endif termina con dos “-” y despues el “>”

    Y en el punto dos, reemplazar las comillas por estas otras: “

  13. 13 David García

    Hola Dantrech,

    he actualizado la entrada incluyendo los comentarios que dices. Se ve que el WP ajusta los carácteres a su manera.

Añade un Comentario