printDiv (divId) : Uma solução generalizada para imprimir qualquer div em qualquer página.
Eu tinha um problema semelhante, mas queria (a) poder imprimir a página inteira ou (b) imprimir qualquer uma das várias áreas específicas. Minha solução, graças a grande parte das opções acima, permite especificar qualquer objeto div a ser impresso.
A chave para esta solução é adicionar uma regra apropriada à folha de estilos da mídia de impressão para que a div solicitada (e seu conteúdo) seja impressa.
Primeiro, crie o css de impressão necessário para suprimir tudo (mas sem a regra específica para permitir o elemento que você deseja imprimir).
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
Observe que eu adicionei novas regras de classe:
- A noprintarea permite suprimir a impressão de elementos dentro de sua divisão - o conteúdo e o bloco.
- O noprintcontent permite suprimir a impressão de elementos dentro de sua div - o conteúdo é suprimido, mas a área alocada é deixada em branco.
- impressão permite que você tenha itens que aparecem na versão impressa, mas não na página da tela. Eles normalmente terão "display: none" para o estilo da tela.
Em seguida, insira três funções JavaScript. O primeiro apenas ativa e desativa a folha de estilo da mídia de impressão.
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
O segundo faz o trabalho real e o terceiro limpa depois. O segundo (printDiv) ativa a folha de estilo da mídia de impressão e anexa uma nova regra para permitir que a div desejada seja impressa, emite a impressão e adiciona um atraso antes da limpeza final (caso contrário, os estilos podem ser redefinidos antes da impressão ser realmente feito.)
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);
}
As funções finais excluem a regra adicionada e definem o estilo de impressão novamente como desativado, para que toda a página possa ser impressa.
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);
}
A única outra coisa a fazer é adicionar uma linha ao seu processamento onload para que o estilo de impressão seja inicialmente desativado, permitindo a impressão de toda a página.
<body onLoad='disableSheet(0,true)'>
Então, de qualquer lugar do seu documento, você pode imprimir uma div. Basta emitir printDiv ("thedivid") de um botão ou o que for.
Uma grande vantagem dessa abordagem é fornecer uma solução geral para imprimir o conteúdo selecionado de dentro de uma página. Também permite o uso de estilos existentes para elementos impressos - incluindo a div que contém.
NOTA: Na minha implementação, esta deve ser a primeira folha de estilos. Altere as referências da planilha (0) para o número da planilha apropriado, se precisar fazê-lo posteriormente na sequência da planilha.