printDiv (divId) : una solución generalizada para imprimir cualquier div en cualquier página.
Tuve un problema similar pero quería (a) poder imprimir toda la página, o (b) imprimir cualquiera de varias áreas específicas. Mi solución, gracias a gran parte de lo anterior, le permite especificar cualquier objeto div para imprimir.
La clave para esta solución es agregar una regla apropiada a la hoja de estilo del medio de impresión para que se imprima el div solicitado (y su contenido).
Primero, cree el css de impresión necesario para suprimir todo (pero sin la regla específica para permitir el elemento que desea imprimir).
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
Tenga en cuenta que he agregado nuevas reglas de clase:
- noprintarea le permite suprimir la impresión de elementos dentro de su div, tanto el contenido como el bloque.
- noprintcontent le permite suprimir la impresión de elementos dentro de su división; el contenido se suprime pero el área asignada se deja vacía.
- print le permite tener elementos que se muestran en la versión impresa pero no en la página de la pantalla. Normalmente tendrán "display: none" para el estilo de pantalla.
Luego inserte tres funciones de JavaScript. El primero simplemente activa y desactiva la hoja de estilo de medios impresos.
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
El segundo hace el trabajo real y el tercero limpia después. El segundo (printDiv) activa la hoja de estilo de medios de impresión, luego agrega una nueva regla para permitir que se imprima el div deseado, emite la impresión y luego agrega un retraso antes de la limpieza final (de lo contrario, los estilos se pueden restablecer antes de que la impresión sea realmente hecho.)
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);
}
Las funciones finales eliminan la regla agregada y vuelven a desactivar el estilo de impresión para que se pueda imprimir toda la página.
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 única otra cosa que debe hacer es agregar una línea a su procesamiento de carga para que el estilo de impresión se deshabilite inicialmente, permitiendo la impresión de toda la página.
<body onLoad='disableSheet(0,true)'>
Luego, desde cualquier parte de su documento, puede imprimir un div. Simplemente emita printDiv ("thedivid") desde un botón o lo que sea.
Una gran ventaja de este enfoque es que proporciona una solución general para imprimir contenido seleccionado desde una página. También permite el uso de estilos existentes para elementos que se imprimen, incluido el div que contiene.
NOTA: En mi implementación, esta debe ser la primera hoja de estilo. Cambie las referencias de hoja (0) al número de hoja apropiado si necesita hacerlo más adelante en la secuencia de la hoja.