Impresión horizontal desde HTML


244

Tengo un informe HTML, que debe imprimirse horizontalmente debido a las muchas columnas. ¿Hay alguna manera de hacer esto, sin que el usuario tenga que cambiar la configuración del documento?

¿Y cuáles son las opciones entre los navegadores?

Respuestas:


379

En su CSS, puede establecer la propiedad @page como se muestra a continuación.

@media print{@page {size: landscape}}

La @page es parte de la especificación CSS 2.1, sin embargo, esto sizeno está tan resaltado por la respuesta a la pregunta ¿Es obsoleta la @Page {size: landscape}? :

CSS 2.1 ya no especifica el atributo de tamaño. El borrador de trabajo actual para el módulo CSS3 Paged Media lo especifica (pero esto no es estándar ni aceptado).

Como se indicó, la opción de tamaño proviene de la especificación borrador de CSS 3 . En teoría, se puede establecer tanto en tamaño de página como en orientación, aunque en mi muestra se omite el tamaño.

El soporte está muy mezclado con un informe de error que comienza archivado en Firefox , la mayoría de los navegadores no lo admiten.

Puede parecer que funciona en IE7, pero esto se debe a que IE7 recordará la última selección de paisaje o retrato de los usuarios en la vista previa de impresión (solo se reinicia el navegador).

Este artículo tiene algunas soluciones sugeridas usando JavaScript o ActiveX que envían claves al navegador de los usuarios, aunque no son ideales y dependen de cambiar la configuración de seguridad de los navegadores.

Alternativamente, puede rotar el contenido en lugar de la orientación de la página. Esto se puede hacer creando un estilo y aplicándolo al cuerpo que incluye estas dos líneas, pero esto también tiene inconvenientes que crean muchos problemas de alineación y diseño.

<style type="text/css" media="print">
    .page
    {
     -webkit-transform: rotate(-90deg); 
     -moz-transform:rotate(-90deg);
     filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
    }
</style>

La última alternativa que he encontrado es crear una versión horizontal en un PDF. Puede señalarlo cuando el usuario seleccione imprimir, imprime el PDF. Sin embargo, no pude hacer que esto imprimiera automáticamente en IE7.

<link media="print" rel="Alternate" href="print.pdf">

En conclusión, en algunos navegadores es relativamente fácil usar la opción de tamaño de página @ sin embargo, en muchos navegadores no hay una forma segura y dependerá de su contenido y entorno. Quizás por eso Google Documents crea un PDF cuando se selecciona imprimir y luego permite al usuario abrirlo e imprimirlo.


28
Es extraño que diga 'tamaño' puede ser horizontal, cuando en realidad es una 'orientación'.
Magnus Smith

1
@page sizeNo parece funcionar en todos los navegadores modernos, solo en Firefox. Chrome y Opera ignoran esto por lo que he visto.
Justin808

2
size: landscapeNO es parte de CSS2.1, aunque las @pagereglas sí lo son. Sin embargo, es parte de CSS3. Para confirmar, intente usar el Validador CSS W3C e ingrese @page {size: landscape}y compare los resultados con el "Perfil" establecido en el nivel 2.1 frente al nivel 3.
daiscog

1
Cuando tiene un div que ocupa 100 ancho o alto de la página, la rotación no hace que el div ocupe el espacio de una página de retrato, sino que gira un paisaje. Entonces, algunas partes del div están fuera de la página.
Oliver

66
@AbeerSul - Para ser honesto, con respecto a CSS, lo que funciona en IE;)
Tony

27

Mi solución:

<style type="text/css" media="print">
    @page { 
        size: landscape;
    }
    body { 
        writing-mode: tb-rl;
    }
</style>

Esto funciona en IE , FirefoxyChrome


1
¿Qué sucede si quisiera que cierto classdiv estuviera en horizontal y no en toda la página?
SearchForKnowledge

2
@SearchForKnowledge: esa sería la transformación de css3: rotate (90deg).
ToolmakerSteve

No entendí lo que estoy haciendo mal, pero esto rompe toda la página en Chrome. Esta es la línea que copié del código @media print {@page {size: portrait;} body {writing-mode: tb-rl;}}
X-HuMan

Para mí, agregar solo esta @page {size: landscape; } trabajos.
Kumar M

1
En 2018 todavía funciona muy bien con los componentes estándar de WebBrowers. Gracias.
Ken Bekov

14

No es suficiente solo rotar el contenido de la página. Aquí hay un CSS correcto que funciona en la mayoría de los navegadores (Chrome, Firefox, IE9 +).

Primero configure el cuerpo marginen 0, porque de lo contrario los márgenes de la página serán mayores que los que configuró en el cuadro de diálogo de impresión. También configure el backgroundcolor para visualizar páginas.

body {
  margin: 0;
  background: #CCCCCC;
}

margin, borderY backgroundson necesarios para visualizar páginas.

paddingdebe establecerse en el margen de impresión requerido. En el cuadro de diálogo de impresión, debe establecer los mismos márgenes (10 mm en este ejemplo).

div.portrait, div.landscape {
  margin: 10px auto;
  padding: 10mm;
  border: solid 1px black;
  overflow: hidden;
  page-break-after: always;
  background: white;
}

El tamaño de la página A4 es de 210 mm x 297 mm. Debe restar los márgenes de impresión del tamaño. Y establezca el tamaño del contenido de la página:

div.portrait {
  width: 190mm;
  height: 276mm;
}
div.landscape {
  width: 276mm;
  height: 190mm;
}

Utilizo 276 mm en lugar de 277 mm, porque los diferentes navegadores escalan las páginas de forma un poco diferente. Entonces, algunos de ellos imprimirán contenido de 277 mm de altura en dos páginas. La segunda página estará vacía. Es más seguro usar 276 mm.

No necesitamos ninguna margin, border, padding, backgrounden la página impresa, por lo eliminarlos:

@media print {
  body {
    background: none;
    -ms-zoom: 1.665;
  }
  div.portrait, div.landscape {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
  }
  div.landscape {
    transform: rotate(270deg) translate(-276mm, 0);
    transform-origin: 0 0;
  }
}

Tenga en cuenta que el origen de la transformación es 0 0! ¡También el contenido de las páginas horizontales debe moverse 276 mm hacia abajo!

Además, si tiene una combinación de páginas de retratos y paisajes, IE reducirá las páginas. Lo arreglamos configurando -ms-zooma 1.665. Si lo configura en 1.6666 o algo así, el borde derecho del contenido de la página puede recortarse a veces.

Si necesita IE8- u otros navegadores antiguos apoyo que puede utilizar -webkit-transform, -moz-transform,filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3) . Pero para navegadores lo suficientemente modernos no es necesario.

Aquí hay una página de prueba:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style>
      ...Copy all styles here...
    </style>
  </head>
  <body>
    <div class="portrait">A portrait page</div>
    <div class="landscape">A landscape page</div>
  </body>
</html>

Muchas gracias, funciona de maravilla (cromo usado) con las páginas web que consisten en una mezcla de modos horizontal y vertical.
zcahfg2

¿De dónde son div.portrait, div.landscape?
zcahfg2

¿Funcionó esto en IE 11 para alguien? Parece que todos los elementos están apagados.
mzonerz

1
@mzonerz Acabo de probar en IE 11, funciona bien. Agregué un html de prueba al final de la respuesta. Tenga en cuenta que debe establecer los márgenes de página en 10 mm en la configuración de impresión. Si necesita un margen de página diferente, debe actualizar los siguientes valores: relleno: 10 mm; ancho: 190 mm; altura: 190 mm;
Denis

@Denis Gracias por sus esfuerzos ... En realidad, esta es la única solución que me ha funcionado hasta ahora ... ¡¡¡¡¡¡¡Bien !! !!
mzonerz

13

Citado de CSS-Discuss Wiki

La regla @page se ha reducido en alcance de CSS2 a CSS2.1. Según los informes, la regla completa de CSS2 @page se implementó solo en Opera (e incluso con errores). Mis propias pruebas muestran que IE y Firefox no son compatibles con @page. Según la sección 13.2.2 de la especificación CSS2, ahora obsoleta, es posible anular la configuración de orientación del usuario y (por ejemplo) forzar la impresión en horizontal, pero la propiedad "tamaño" relevante se ha eliminado de CSS2.1, de acuerdo con el hecho que ningún navegador actual lo admite. Se ha restablecido en el módulo CSS3 Paged Media, pero tenga en cuenta que esto es solo un borrador de trabajo (a julio de 2009).

Conclusión: olvídate de @page por el momento. Si cree que su documento debe imprimirse en orientación horizontal, pregúntese si puede hacer que su diseño sea más fluido. Si realmente no puede (tal vez porque el documento contiene tablas de datos con muchas columnas, por ejemplo), deberá aconsejar al usuario que configure la orientación en horizontal y tal vez describa cómo hacerlo en los navegadores más comunes. Por supuesto, algunos navegadores tienen una función de impresión que se ajusta al ancho (encogirse para ajustarse) (por ejemplo, Opera, Firefox, IE7), pero no es aconsejable confiar en que los usuarios tengan esta instalación o la tengan activada.


44
Esa es la "CSS-Discuss Wiki", no "Wikipedia".
jball

12

Intenta agregar esto a tu CSS:

@page {
  size: landscape;
}

2
¿Funcionó para ti con alguno de los navegadores? Con IE8 y Firefox3.5 no parecía haber ninguna diferencia en la vista previa de impresión.
Daniel Ballinger

La vista previa de impresión no sigue todas las propiedades CSS, desafortunadamente. Pero esto debería funcionar en todos los navegadores actuales.
gizmo

Gracias por seguir con esto. No parece funcionar para mí con la impresión real tampoco. ¿Me he perdido algo? Mi archivo de prueba es el siguiente: (Tuve que truncar el contenido del párrafo para que quepa en el cuadro de comentarios) <html> <head> <title> Página de prueba de paisaje </title> <style> @Page {size: landscape; } </style> </head> <body> <p> Lorem ipsum dolor sit amet, ... </p> </body> </html>
Daniel Ballinger el

He probado todas las combinaciones de la regla @Page que se muestra en esta página y algunas de otros sitios, así como el ejemplo en HTML / XHTML de O'Reilly: la guía definitiva, quinta edición. No he podido hacer que esto funcione en IE8, Firefox 3.6 o Chrome 7.0.
Paul Keister el

Sé que es 2012 ... pero esta respuesta me ayudó ... a admitir la opción horizontal para IE8 ... gracias
Vikram

11

La sizepropiedad es lo que buscas como se mencionó. Para configurar la orientación y el tamaño de su página al imprimir, puede usar lo siguiente:

/* ISO Paper Size */
@page {
  size: A4 landscape;
}

/* Size in mm */    
@page {
  size: 100mm 200mm landscape;
}

/* Size in inches */    
@page {
  size: 4in 6in landscape;
}

Aquí hay un enlace a la documentación de @page .


Cuando se usa con bootstrap, esta declaración debe almacenarse en un .cssarchivo separado o, de lo contrario, si está en línea, prevalecerá la declaración boostrap predeterminada ( size: a3).
caram


5

También puede usar el modo de escritura de atributo css no estándar solo de IE

div.page    { 
   writing-mode: tb-rl;
}

1
Esto reorienta el contenido de la página, pero realmente no cambia el diseño de la página a horizontal. Es decir, los encabezados y pies de página se seguirán agregando como si la página fuera vertical.
Daniel Ballinger el

2
-webkit-transform: rotate(-90deg); -moz-transform:rotate(-90deg);
     filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);

no funciona en Firefox 16.0.2 pero funciona en Chrome


2

Creé un documento MS en blanco con la configuración horizontal y luego lo abrí en el bloc de notas. Copié y pegué lo siguiente en mi página html

<style type="text/css" media="print">
   @page Section1
    {size:11 8.5in;
    margin:.5in 13.6pt 0in 13.6pt;
    mso-header-margin:.5in;
    mso-footer-margin:.5in;
    mso-paper-source:4;}
div.Section1
    {page:Section1;}
</style>



<div class="Section1"> put  text / images / other stuff  </div>

La vista previa de impresión muestra las páginas en tamaño horizontal. Esto parece estar funcionando bien en IE y Chrome, no probado en FF.


1

Traté de resolver este problema una vez, pero toda mi investigación me llevó a los controles / complementos de ActiveX. No hay ningún truco para que los navegadores (de todos modos, hace 3 años) permitieran cambiar la configuración de impresión (número de copias, tamaño de papel).

Puse mis esfuerzos en advertir al usuario cuidadosamente que necesitaban seleccionar "paisaje" cuando aparecía el cuadro de diálogo de impresión del navegador. ¡También creé una página de "vista previa de impresión", que funcionó mucho mejor que la de IE6! Nuestra aplicación tenía tablas de datos muy amplias en algunos informes, y la vista previa de la impresión dejó en claro a los usuarios cuándo la tabla se derramaría del borde derecho del papel (ya que IE6 tampoco podía hacer frente a la impresión en 2 hojas).

Y sí, la gente todavía usa IE6 incluso ahora.


1
<style type="text/css" media="print">
.landscape { 
    width: 100%; 
    height: 100%; 
    margin: 0% 0% 0% 0%; filter: progid:DXImageTransform.Microsoft.BasicImage(Rotation=1); 
} 
</style>

Si desea que este estilo se aplique a una tabla, cree una etiqueta div con esta clase de estilo y agregue la etiqueta de tabla dentro de esta etiqueta div y cierre la etiqueta div al final.

Esta tabla solo se imprimirá en horizontal y todas las demás páginas se imprimirán solo en modo vertical. Pero el problema es que si el tamaño de la tabla es mayor que el ancho de la página, entonces podemos perder algunas de las filas y, a veces, también se pierden los encabezados. Ten cuidado.

Tenga un buen día.

Gracias, Naveen Mettapally.


1
Esto gira el contenido de la pantalla 90 grados, pero la impresión aún sale en formato protrait. Lo peor de ambos mundos realmente, al menos en ie8.
arame3333

1

Intenté la respuesta de Denis y encontré algunos problemas (las páginas verticales no se imprimieron correctamente después de las páginas horizontales), así que aquí está mi solución:

body {
  margin: 0;
  background: #CCCCCC;
}

div.page {
  margin: 10px auto;
  border: solid 1px black;
  display: block;
  page-break-after: always;
  width: 209mm;
  height: 296mm;
  overflow: hidden;
  background: white;
}

div.landscape-parent {
  width: 296mm;
  height: 209mm;
}

div.landscape {
  width: 296mm;
  height: 209mm;
}

div.content {
  padding: 10mm;
}

body,
div,
td {
  font-size: 13px;
  font-family: Verdana;
}

@media print {
  body {
    background: none;
  }
  div.page {
    width: 209mm;
    height: 296mm;
  }
  div.landscape {
    transform: rotate(270deg) translate(-296mm, 0);
    transform-origin: 0 0;
  }
  div.portrait,
  div.landscape,
  div.page {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
  }
}
<div class="page">
  <div class="content">
    First page in Portrait mode
  </div>
</div>
<div class="page landscape-parent">
  <div class="landscape">
    <div class="content">
      Second page in Landscape mode (correctly shows horizontally in browser and prints rotated in printer)
    </div>
  </div>
</div>
<div class="page">
  <div class="content">
    Third page in Portrait mode
  </div>
</div>



0

Si desea ver el paisaje en la pantalla antes de imprimir, además de imprimir, en su CSS, puede establecer el ancho en 900 px y la altura en 612 px.

OP no mencionó el tamaño A4. Supongo que es el tamaño de letra en mis números anteriores.


-1

Puedes probar lo siguiente:

@page {
    size: auto
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.