70 votes

comment imprimer une partie d'une page html rendue en javascript ?

Le code javascript window.print() peut imprimer la page html actuelle.

Ma question est la suivante : si j'ai un div dans une page html (par exemple, une page rendue à partir d'une vue ASP.NET MVC), je veux imprimer uniquement le div.

Existe-t-il un javascrpt JQuery discret ou un javascript normal pour réaliser cette demande ?

Rendez-le plus clair. Supposons que la page html rendue soit comme :

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head" runat="server">
<title>
        <asp:ContentPlaceHolder runat="server" ID="TitleContent" />
</title>
</head>
<body>
    <div id="div1" class="div1">....</div>
    <div id="div2" class="div2">....</div>
    <div id="div3" class="div3">....</div>
    <div id="div4" class="div4">....</div>    
    <div id="div4" class="div4">....</div>
<p>
    <input id="btnSubmit" type="submit" value="Print" onclick="divPrint();" />
</p>
</body>
</html>

Ensuite, je veux cliquer sur le bouton d'impression uniquement pour imprimer div3.

118voto

Coding With Style Points 752

Je m'y prendrais un peu comme ça :

<html>
<head>
<title>Print Test Page</title>
<script>
printDivCSS = new String ('<link href="myprintstyle.css" rel="stylesheet" type="text/css">')
function printDiv(divId) {
    window.frames["print_frame"].document.body.innerHTML=printDivCSS + document.getElementById(divId).innerHTML;
    window.frames["print_frame"].window.focus();
    window.frames["print_frame"].window.print();
}
</script>
</head>
<body>
<h1><b><center>This is a test page for printing</center></b><hr color=#00cc00 width=95%></h1>
<b>Div 1:</b> <a href="javascript:printDiv('div1')">Print</a><br>
<div id="div1">This is the div1's print output</div>
<br><br>
<b>Div 2:</b> <a href="javascript:printDiv('div2')">Print</a><br>
<div id="div2">This is the div2's print output</div>
<br><br>
<b>Div 3:</b> <a href="javascript:printDiv('div3')">Print</a><br>
<div id="div3">This is the div3's print output</div>
<iframe name="print_frame" width="0" height="0" frameborder="0" src="about:blank"></iframe>
</body>
</html>

1 votes

Mais que propose printDivCSS ? Il ne semble pas nécessaire de l'utiliser.

2 votes

PrintDivCSS est juste là si vous avez besoin de formater ce que vous imprimez avec une feuille de style. Si vous ne voulez pas que votre texte imprimé soit formaté avec une feuille de style, alors vous n'en avez pas besoin.

0 votes

Cette solution fonctionne bien dans FF, mais pas dans IE 7. Avec IE7, la page entière sera imprimée avec un blanc pour la zone d'impression souhaitée.

31voto

Zack The Human Points 5517

Dans le même ordre d'idées que certaines des suggestions, vous devriez au moins faire ce qui suit :

  • Chargement dynamique de certains CSS par JavaScript
  • Rédiger quelques règles CSS spécifiques à l'impression
  • Appliquez vos règles CSS fantaisistes via JavaScript

Un exemple de CSS pourrait être aussi simple que celui-ci :

@media print {
  body * {
    display:none;
  }

  body .printable {
    display:block;
  }
}

Votre JavaScript n'aura alors qu'à appliquer la classe "printable" à votre div cible et celle-ci sera la seule chose visible (pour autant qu'il n'y ait pas d'autres règles CSS conflictuelles - un exercice distinct) lorsque l'impression aura lieu.

<script type="text/javascript">
  function divPrint() {
    // Some logic determines which div should be printed...
    // This example uses div3.
    $("#div3").addClass("printable");
    window.print();
  }
</script>

Vous pouvez éventuellement supprimer la classe de la cible après l'impression, et/ou supprimer le CSS ajouté dynamiquement après l'impression.

Vous trouverez ci-dessous un exemple fonctionnel complet, la seule différence étant que le CSS d'impression n'est pas chargé dynamiquement. Si vous souhaitez qu'il soit vraiment discret, vous devrez alors charger le CSS dynamiquement comme dans cette réponse .

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <title>Print Portion Example</title>
    <style type="text/css">
      @media print {
        body * {
          display:none;
        }

        body .printable {
          display:block;
        }
      }
    </style>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
  </head>

  <body>
    <h1>Print Section Example</h1>
    <div id="div1">Div 1</div>
    <div id="div2">Div 2</div>
    <div id="div3">Div 3</div>
    <div id="div4">Div 4</div>
    <div id="div5">Div 5</div>
    <div id="div6">Div 6</div>
    <p><input id="btnSubmit" type="submit" value="Print" onclick="divPrint();" /></p>
    <script type="text/javascript">
      function divPrint() {
        // Some logic determines which div should be printed...
        // This example uses div3.
        $("#div3").addClass("printable");
        window.print();
      }
    </script>
  </body>
</html>

0 votes

Pour FF, cette solution permettra d'imprimer la page entière avec div3. Pour IE7, cette solution imprimera la page entière mais remplacera div3 par un blanc.

0 votes

Quelle version de Firefox ? Quand j'ai testé cela avec IE, c'était avec IE6 et cela fonctionne correctement -- en imprimant seulement "Div 3". Firefox 3.5.2 présente le même comportement. Google Chrome 2.0.172.43 présente également le même comportement. Je ne comprends peut-être pas vos exigences.

0 votes

MERCI. Mon scénario est le suivant : I put your suggest css @media print... into the site.css. My page is render as <body> <div class="fixed"> <div class="col1"> <div id="DivForPrint"> </div> </div> </div> </body> maybe the css is not correct for this case?

10voto

essayez ce javascript...

function printout() {

    var newWindow = window.open();
    newWindow.document.write(document.getElementById("output").innerHTML);
    newWindow.print();
}

1 votes

Cela a juste craché un tableau non formaté sur un nouvel onglet pour moi. Rien n'a été imprimé.

4voto

alex Points 186293

Vous pourriez utiliser une feuille de style CSS d'impression...

Mais cela affectera toutes les fonctions d'impression.

Vous pourriez essayer d'avoir une feuille de style d'impression externe, et elle est incluse via Js quand un bouton est pressé, et ensuite appeler window.print(), puis après cela la supprimer.

0 votes

Cela pourrait fonctionner, mais avec quelques modifications pour permettre à la page de se "réinitialiser" après l'impression de votre cible. (Par exemple, juste avant l'impression, ouvrez une fenêtre modale ou une sorte d'incrustation indiquant que l'impression peut maintenant avoir lieu (ou appelez window.print() à ce moment-là), puis lorsque l'utilisateur clique sur OK ou Close, les feuilles de style peuvent se réinitialiser.

0 votes

Oh, également, vous n'avez pas nécessairement besoin d'avoir un fichier CSS externe chargé dynamiquement, vous pouvez l'avoir préchargé mais simplement ajuster les classes sur votre div cible ou autre conteneur lorsque vous êtes prêt à imprimer. (Et supprimer les classes lorsque vous avez terminé).

0voto

samuli rova Points 1

jQuery PrintArea - Utilise encore aujourd'hui iFrame ou une fenêtre popup.

Ces techniques ne sont pas considérées comme un moyen sûr, moderne ou même raisonnable d'obtenir ce que vous demandez.

Il suffit de masquer tout le reste du html via DOM ou CSS, ou comme réponse précédente, d'ouvrir le ContainerElement imprimable dans une nouvelle fenêtre du navigateur avec seulement le body-html et les styles nécessaires que vous pouvez ensuite imprimer par exemple par jQ- " $(document).ready(function(){ }) ; ".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X