Cómo crear una página imprimible de Twitter-Bootstrap

162

Estoy usando Twitter-Bootstrap y necesito poder imprimir la página como se ve en el navegador. Puedo imprimir otras páginas hechas con Twitter-Bootstrap muy bien, pero parece que no puedo imprimir mi página que usa puramente Twitter-Bootstrap. ¿Me estoy perdiendo una etiqueta en alguna parte?

Página oficial de TB cuando se imprime: Página de Bootstrap de Twitter

Mi página cuando se imprime: ingrese la descripción de la imagen aquí

Cómo se ve realmente mi página: ingrese la descripción de la imagen aquí

Jay Q.
fuente
2
¿Estás especificando un atributo media = "pantalla"? Mira mi respuesta.
albertedevigo

Respuestas:

156

Asegúrese de tener una hoja de estilo asignada para imprimir.
Podría ser una hoja de estilo separada:

<link rel="stylesheet" type="text/css" media="print" href="print.css">

o uno que comparta para todos los dispositivos:

<link rel="stylesheet" type="text/css" href="bootstrap.min.css"> # Note there's no media attribute

Luego, puede escribir sus estilos para impresoras en las hojas de estilo separadas o en la compartida utilizando consultas de medios:

@media print {
    /* Your styles here */
}
albertedevigo
fuente
29
Acabo de agregar esto: <link rel = "stylesheet" type = "text / css" media = "print" href = "bootstrap.min.css"> y no necesité hacer nada más. Trabajado como un encanto. ¡Gracias!
Jay Q.
13
Si ya está usando esta hoja de estilo, es probable que tenga la que tiene actualmente media="screen", que una impresora no verá. Puede cambiar esto a media="all", o simplemente eliminar mediacomo sugiere la respuesta anterior.
Wex
Albertedevigo, necesito ayuda con respecto al estilo. Como cambiar tamaño de fuente, anchos, ... ¿qué es exactamente lo que se necesita cambiar? TIA @JayQ. : ¿Sigue funcionando o está desactualizado? porque no puedo hacer que funcione.
musafar006
@dreamster, solo incluye tus estilos en la hoja de estilos que se aplica a la impresión. Tenga en cuenta que CSS en cascada todavía funciona; entonces el orden, la herencia y las prioridades del selector influirán en el resultado. Probablemente haría una nueva pregunta con su propio código.
albertedevigo
181

Actualización de Bootstrap 3.2: (versión actual)

La versión actual estable de Bootstrap es 3.2.0 .
Con la versión 3.2 de impresión visible en desuso, por lo que debe usar así:

Class                        Browser    Print
 -------------------------------------------------
.visible-print-block         Hidden        Visible (as block)
.visible-print-inline        Hidden        Visible (as inline)
.visible-print-inline-block  Hidden        Visible (as inline-block)
.hidden-print                Visible       Hidden

Actualización de Bootstrap 3:

Las clases de impresión ahora están en documentos: http://getbootstrap.com/css/#responsive-utilities-print

Similar to the regular responsive classes,
       use these for toggling content for print.

Class            Browser    Print
 ----------------------------------------
.visible-print   Hidden     Visible
.hidden-print    Visible    Hidden

Versión Bootstrap 2.3.1:

Después de agregar el archivo bootstrap.css a su HTML,
busque las partes que no desea imprimir y agregue la hidden-printclase a las etiquetas. Porque el archivo css incluye esto:

@media print {
  .visible-print  { display: inherit !important; }
  .hidden-print   { display: none !important; }
}
trante
fuente
44
¿No hay una clase para hacer que algo sea visible tanto en el navegador como en la impresora en el caso en que hago que todo ( body) sea invisible .hidden-print, pero quiero anular un elemento específico para que se muestre?
Vincent Poirier
1
@VincentPoirier: si un elemento está oculto, todo lo que está dentro está oculto. Por lo tanto, no tiene sentido ocultar el cuerpo, sino mostrar algo que es parte del cuerpo. Porque no habría contexto (contenedor) en el que mostrar ese subelemento. En su lugar, haga css para ocultar todos sus elementos de hoja (p. Ej., Coloque una clase predeterminada en sus divs internos), luego use la clase o id css apropiada donde desee que sea visible. Es probable que requiera un poco de experimentación para hacer esto exactamente bien.
ToolmakerSteve
112

Reemplace cada col-md-concol-xs-

Por ejemplo: reemplazar cada col-md-6a col-xs-6.

Esto es lo que funcionó para mí para librarme de este problema, puedes ver lo que tienes que reemplazar.

Sonam
fuente
Gracias ! Estaba teniendo problemas con la escala de la vista HTML en comparación con la Vista de impresión ... ¡todo está bien ahora!
David Bélanger
2
¡Hey gracias! Tenía problemas al imprimir mi página, cadadiv solía ir por debajo de la anterior. Esta respuesta me dio una pista, agregué col-xs-*antes de cada uno col-md-*y esto solucionó el problema. DESCARGO DE RESPONSABILIDAD: No probé agregar un contenedor ya <div class="row"></div>que también podría haber resuelto el problema (parece obvio).
Fr0zenFyr
66
A menos que se pretenda tener un diseño diferente para pantallas estrechas (por ejemplo, teléfono) que para imprimir. Parece extraño que la lógica de la impresora bootstrap piense que su pantalla de impresión es tan estrecha.
ToolmakerSteve
3
Esto debería estar en la parte superior.
Suraj
Solo para agregar que puede reemplazar col-md- como dice la respuesta o simplemente puede agregar col-xs-like: class = "col-md-6 col-xs-6" y puede mezclar y combinar según los requisitos de su diseño
zaidorx
17

Hay una sección de @media printcódigo en el archivo css (Bootstrap 3.3.1 [ACTUALIZACIÓN:] a 3.3.5), esto elimina prácticamente todo el estilo, por lo que obtienes impresiones bastante suaves incluso cuando está funcionando.

Por ahora he tenido que recurrir a despojar a la @media printsección de bootstrap.css - lo que realmente soy , no contento con pero mis usuarios quieren pantalla apropiaciones directas por lo que este tendrá que hacer por ahora. Si alguien sabe cómo suprimirlo sin cambios en los archivos de arranque, estaría muy interesado.

Aquí está el bloque de código 'ofensivo', comienza en la línea # 192:

@media print {
  *,
  *:before,enter code here
  *:after {
    color: #000 !important;
    text-shadow: none !important;
    background: transparent !important;
    -webkit-box-shadow: none !important;
            box-shadow: none !important;
  }
  a,
  a:visited {
    text-decoration: underline;
  }
  a[href]:after {
    content: " (" attr(href) ")";
  }
  abbr[title]:after {
    content: " (" attr(title) ")";
  }
  a[href^="#"]:after,
  a[href^="javascript:"]:after {
    content: "";
  }
  pre,
  blockquote {
    border: 1px solid #999;

    page-break-inside: avoid;
  }
  thead {
    display: table-header-group;
  }
  tr,
  img {
    page-break-inside: avoid;
  }
  img {
    max-width: 100% !important;
  }
  p,
  h2,
  h3 {
    orphans: 3;
    widows: 3;
  }
  h2,
  h3 {
    page-break-after: avoid;
  }
  select {
    background: #fff !important;
  }
  .navbar {
    display: none;
  }
  .btn > .caret,
  .dropup > .btn > .caret {
    border-top-color: #000 !important;
  }
  .label {
    border: 1px solid #000;
  }
  .table {
    border-collapse: collapse !important;
  }
  .table td,
  .table th {
    background-color: #fff !important;
  }
  .table-bordered th,
  .table-bordered td {
    border: 1px solid #ddd !important;
  }
}
Hugo Yates
fuente
6

La mejor opción que encontré fue http://html2canvas.hertzen.com/
http://jsfiddle.net/nurbsurf/1235emen/

html2canvas(document.body, {  
  onrendered: function(canvas) {
    $("#page").hide();
    document.body.appendChild(canvas);
    window.print();
    $('canvas').remove();
    $("#page").show();
  }
});
Bodie Leonard
fuente
Probé tanto 0.4 como 0.5 pero ninguno de ellos funcionó. 0.5 agregó algunas cosas buenas después de mi página, pero la página original todavía estaba allí, y luego, ¿cómo se supone que imprima eso? Al intentar 0.4 desencadenó una impresión, la página original también estaba allí, y el renderizado estaba un poco roto.
Csaba Toth
3

En caso de que alguien esté buscando una solución para Bootstrap v2.XX aquí. Estoy dejando la solución que estaba usando.Esto no está completamente probado en todos los navegadores, sin embargo, podría ser un buen comienzo.

1) asegúrese de que el atributo de medios de bootstrap-responsive.css es is screen.

<link href="/css/bootstrap-responsive.min.css" rel="stylesheet" media="screen" />

2) crear un print.css ay asegúrese de que su atributo de mediosprint

<link href="/css/print.css" rel="stylesheet" media="print" />

3) dentro print.css, agregue el "ancho" de su sitio web en html & body

html, 
body {
    width: 1200px !important;
}

4.) reproducir las clases de consulta de medios necesarias en print.css porque estaban dentro bootstrap-responsive.cssy lo hemos deshabilitado al imprimir.

.hidden{display:none;visibility:hidden}
.visible-phone{display:none!important}
.visible-tablet{display:none!important}
.hidden-desktop{display:none!important}
.visible-desktop{display:inherit!important}

Aquí está la versión completa de print.css:

html, 
body {
    width: 1200px !important;
}

.hidden{display:none;visibility:hidden}
.visible-phone{display:none!important}
.visible-tablet{display:none!important}
.hidden-desktop{display:none!important}
.visible-desktop{display:inherit!important}
abchau
fuente
0

Para hacer que la vista de impresión se vea como una tableta o escritorio, incluya bootstrap como .less, no como .css y luego puede sobrescribir las clases receptivas de bootstrap al final del archivo bootstrap_variables, por ejemplo:

@container-sm:      1200px;
@container-md:      1200px;
@container-lg:      1200px;
@screen-sm:         0;

No se preocupe por poner estas variables al final del archivo. LESS admite la carga diferida de variables para que se apliquen.

Hrvoje Golcic
fuente
0

Si desea mantener columnas en impresión A4 (que es de alrededor de 540 px), esta es una buena idea

@media print {
    .make-grid(print-A4);
}

.make-print-A4-column(@columns) {
    @media print {
        float: left;
        width: percentage((@columns / @grid-columns));
    }
}

Puedes usarlo así:

<div class="col-sm-4 col-print-A4-4">

Søren Westh Larsen
fuente