printDiv (divId) : Une solution généralisée pour imprimer n'importe quel div sur n'importe quelle page.
J'ai eu un problème similaire mais je voulais (a) pouvoir imprimer la page entière, ou (b) imprimer n'importe laquelle de plusieurs zones spécifiques. Ma solution, grâce à une grande partie de ce qui précède, vous permet de spécifier n'importe quel objet div à imprimer.
La clé de cette solution est d'ajouter une règle appropriée à la feuille de style du support d'impression afin que le div demandé (et son contenu) soit imprimé.
Tout d'abord, créez le css d'impression requis pour tout supprimer (mais sans la règle spécifique pour autoriser l'élément que vous souhaitez imprimer).
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
Notez que j'ai ajouté de nouvelles règles de classe:
- noprintarea vous permet de supprimer l'impression des éléments de votre div, à la fois le contenu et le bloc.
- noprintcontent vous permet de supprimer l'impression des éléments dans votre div- le contenu est supprimé mais et la zone allouée est laissée vide.
- impression vous permet d'avoir des éléments qui apparaissent dans la version imprimée mais pas sur la page d'écran. Ceux-ci auront normalement "display: none" pour le style d'écran.
Insérez ensuite trois fonctions JavaScript. Le premier active et désactive simplement la feuille de style de support d'impression.
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
Le second fait le vrai travail et le troisième nettoie ensuite. Le second (printDiv) active la feuille de style de support d'impression, puis ajoute une nouvelle règle pour permettre au div souhaité d'imprimer, émet l'impression, puis ajoute un délai avant le nettoyage final (sinon les styles peuvent être réinitialisés avant que l'impression ne soit réellement terminé.)
function printDiv(divId)
{
// Enable the print CSS: (this temporarily disables being able to print the whole page)
disableSheet(0,false);
// Get the print style sheet and add a new rule for this div
var sheetObj=document.styleSheets[0];
var showDivCSS="visibility:visible;display:block;position:absolute;top:30px;left:30px;";
if (sheetObj.rules) { sheetObj.addRule("#"+divId,showDivCSS); }
else { sheetObj.insertRule("#"+divId+"{"+showDivCSS+"}",sheetObj.cssRules.length); }
print();
// need a brief delay or the whole page will print
setTimeout("printDivRestore()",100);
}
Les fonctions finales suppriment la règle ajoutée et redéfinissent le style d'impression sur désactivé pour que la page entière puisse être imprimée.
function printDivRestore()
{
// remove the div-specific rule
var sheetObj=document.styleSheets[0];
if (sheetObj.rules) { sheetObj.removeRule(sheetObj.rules.length-1); }
else { sheetObj.deleteRule(sheetObj.cssRules.length-1); }
// and re-enable whole page printing
disableSheet(0,true);
}
La seule autre chose à faire est d'ajouter une ligne à votre traitement de chargement afin que le style d'impression soit initialement désactivé, permettant ainsi l'impression de la page entière.
<body onLoad='disableSheet(0,true)'>
Ensuite, de n'importe où dans votre document, vous pouvez imprimer un div. Il suffit de lancer printDiv ("thedivid") à partir d'un bouton ou autre.
Un gros plus pour cette approche, il fournit une solution générale pour imprimer le contenu sélectionné à partir d'une page. Il permet également d'utiliser des styles existants pour les éléments imprimés - y compris le div contenant.
REMARQUE: dans mon implémentation, ce doit être la première feuille de style. Remplacez les références de feuille (0) par le numéro de feuille approprié si vous devez le faire plus tard dans la séquence de feuilles.