Comment créer une page Twitter-Bootstrap imprimable

162

J'utilise Twitter-Bootstrap et je dois pouvoir imprimer la page telle qu'elle apparaît sur le navigateur. Je suis capable d'imprimer très bien d'autres pages créées avec Twitter-Bootstrap, mais je n'arrive pas à imprimer ma page qui utilise uniquement Twitter-Bootstrap. Est-ce que je manque une étiquette quelque part?

Page officielle sur la tuberculose une fois imprimée: Page de démarrage Twitter

Ma page une fois imprimée: entrez la description de l'image ici

À quoi ressemble ma page: entrez la description de l'image ici

Jay Q.
la source
2
Spécifiez-vous un attribut media = "screen"? Jetez un œil à ma réponse.
albertedevigo le

Réponses:

156

Assurez-vous d'avoir une feuille de style attribuée pour l'impression.
Il peut s'agir d'une feuille de style distincte:

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

ou celui que vous partagez pour tous les appareils:

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

Ensuite, vous pouvez écrire vos styles pour les imprimantes dans les feuilles de style séparées ou dans celle partagée à l'aide de requêtes multimédias:

@media print {
    /* Your styles here */
}
albertedevigo
la source
29
Je viens d'ajouter ceci: <link rel = "stylesheet" type = "text / css" media = "print" href = "bootstrap.min.css"> et je n'ai rien eu d'autre à faire. A travaillé comme un charme. Merci!
Jay Q.
13
Si vous utilisez déjà cette feuille de style, il y a de fortes chances que vous l'ayez actuellement media="screen", ce qui ne sera pas vu par une imprimante. Vous pouvez changer cela en media="all"ou simplement supprimer mediacomme le suggère la réponse ci-dessus.
Wex
albertedevigo, j'ai besoin d'aide concernant le style. Comme changer la taille de la police, les largeurs, ... qu'est-ce qui devait exactement être changé? TIA. @JayQ. : Est-ce que cela fonctionne toujours ou est obsolète? parce que je ne peux pas le faire fonctionner.
musafar006
@dreamster, incluez simplement vos styles dans la feuille de style qui s'applique à l'impression. Notez que la cascade CSS fonctionne toujours; Ainsi, l'ordre, l'héritage et les priorités du sélecteur influenceront le résultat. Vous poseriez probablement une nouvelle question avec votre propre code.
albertedevigo
181

Mise à jour de Bootstrap 3.2: (version actuelle)

La version actuelle stable de Bootstrap est 3.2.0 .
Avec la version 3.2 visible-print obsolète, vous devriez donc utiliser comme ceci:

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

Mise à jour de Bootstrap 3:

Les classes d'impression sont maintenant dans les documents: 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

Version de Bootstrap 2.3.1:

Après avoir ajouté le fichier bootstrap.css dans votre HTML,
recherchez les parties que vous ne souhaitez pas imprimer et ajoutez la hidden-printclasse dans les balises. Parce que le fichier css comprend ceci:

@media print {
  .visible-print  { display: inherit !important; }
  .hidden-print   { display: none !important; }
}
trante
la source
4
N'y a-t-il pas une classe pour rendre quelque chose visible à la fois sur le navigateur et sur l'imprimante dans le cas où je rends tout ( body) invisible avec .hidden-print, mais que je veux remplacer un élément spécifique à afficher?
Vincent Poirier
1
@VincentPoirier - si un élément est caché, tout ce qu'il contient est caché. Il n'est donc pas significatif de cacher le corps, mais de dévoiler quelque chose qui fait partie du corps. Parce qu'il n'y aurait pas de contexte (conteneur) dans lequel afficher ce sous-élément. Au lieu de cela, faites css pour masquer tous vos éléments feuilles (par exemple, mettez une classe par défaut sur vos divs internes), puis utilisez la classe ou l'identifiant css approprié là où vous souhaitez être visible. Cela nécessitera probablement une certaine expérimentation pour y parvenir.
ToolmakerSteve
112

Remplacez chaque col-md-parcol-xs-

par exemple: remplacez tous col-md-6par col-xs-6.

C'est ce qui a fonctionné pour moi pour me débarrasser de ce problème, vous pouvez voir ce que vous devez remplacer.

Sonam
la source
Merci ! Avait un problème avec l'échelle de la vue HTML par rapport à la vue d'impression ... tout va bien maintenant!
David Bélanger
2
Hey, merci! J'étais confronté à un problème lors de l'impression de ma page, chacun ayant l' divhabitude d'aller en dessous de la précédente. Cette réponse m'a donné un indice, j'ai ajouté col-xs-*avant chacun col-md-*et cela a résolu le problème. AVIS DE NON-RESPONSABILITÉ: Je n'ai pas testé l'ajout d'un conteneur car <div class="row"></div>cela pourrait également avoir résolu le problème (cela semble évident).
Fr0zenFyr
6
Sauf si l'on a l'intention d'avoir une disposition différente pour les écrans étroits (par exemple téléphone) que pour l'impression. Cela semble étrange que la logique de l'imprimante bootstrap pense que son écran d'impression est si étroit.
ToolmakerSteve
3
Cela devrait être au top.
Suraj du
Juste pour ajouter que vous pouvez remplacer col-md- comme le dit la réponse ou vous pouvez simplement ajouter col-xs- comme: class = "col-md-6 col-xs-6" et vous pouvez mélanger et assortir en fonction des besoins de votre conception.
zaidorx
17

Il y a une section de @media printcode dans le fichier css (Bootstrap 3.3.1 [UPDATE:] à 3.3.5), cela supprime pratiquement tout le style, donc vous obtenez des impressions assez fades même quand cela fonctionne.

Pour l'instant, j'ai dû recourir à la suppression de la @media printsection de bootstrap.css - ce dont je ne suis vraiment pas content, mais mes utilisateurs veulent des captures d'écran directes, donc cela devra faire pour le moment. Si quelqu'un sait comment le supprimer sans modifier les fichiers d'amorçage, je serais très intéressé.

Voici le bloc de code `` offensant '', commence à la ligne 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
la source
6

La meilleure option que j'ai trouvée était 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
la source
J'ai essayé à la fois 0.4 et 0.5 mais aucun d'eux n'a fonctionné. 0.5 a ajouté de beaux trucs après ma page, mais la page d'origine était toujours là, et comment je devais l'imprimer? Essayer 0.4 a déclenché une impression, la page d'origine était également toujours là et le rendu était un peu cassé.
Csaba Toth
3

Dans le cas où quelqu'un cherche une solution pour Bootstrap v2.XX ici. Je laisse la solution que j'utilisais. Ce n'est pas entièrement testé sur tous les navigateurs, mais cela pourrait être un bon début.

1) assurez-vous que l'attribut media de bootstrap-responsive.cssest screen.

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

2) créez un print.csset assurez-vous que son attribut médiaprint

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

3) à l'intérieur print.css, ajoutez la "largeur" ​​de votre site web en html & body

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

4.) reproduisez les classes de requêtes multimédias nécessaires print.csscar elles étaient à l'intérieur bootstrap-responsive.csset nous l'avons désactivé lors de l'impression.

.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}

Voici la version complète 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
la source
0

Pour que la vue d'impression ressemble à une tablette ou à un bureau, incluez bootstrap en .less, pas en .css, puis vous pouvez écraser les classes réactives bootstrap à la fin du fichier bootstrap_variables, par exemple comme ceci:

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

Ne vous inquiétez pas de mettre ces variables à la fin du fichier. LESS prend en charge le chargement différé des variables afin qu'elles soient appliquées.

Hrvoje Golcic
la source
0

Si vous souhaitez conserver les colonnes sur une impression A4 (environ 540 pixels), c'est une bonne idée

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

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

Vous pouvez l'utiliser comme ceci:

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

Søren Westh Larsen
la source