O jsPDF pode usar plugins. Para permitir a impressão de HTML, você deve incluir determinados plugins e, portanto, fazer o seguinte:
- Acesse https://github.com/MrRio/jsPDF e baixe a versão mais recente.
- Inclua os seguintes scripts no seu projeto:
- jspdf.js
- jspdf.plugin.from_html.js
- jspdf.plugin.split_text_to_size.js
- jspdf.plugin.standard_fonts_metrics.js
Se você deseja ignorar certos elementos, é necessário marcá-los com um ID, que pode ser ignorado em um manipulador de elemento especial do jsPDF. Portanto, seu HTML deve ficar assim:
<!DOCTYPE html>
<html>
<body>
<p id="ignorePDF">don't print this to pdf</p>
<div>
<p><font size="3" color="red">print this to pdf</font></p>
</div>
</body>
</html>
Em seguida, use o seguinte código JavaScript para abrir o PDF criado em um PopUp:
var doc = new jsPDF();
var elementHandler = {
'#ignorePDF': function (element, renderer) {
return true;
}
};
var source = window.document.getElementsByTagName("body")[0];
doc.fromHTML(
source,
15,
15,
{
'width': 180,'elementHandlers': elementHandler
});
doc.output("dataurlnewwindow");
Para mim, isso criou um PDF agradável e arrumado, que incluía apenas a linha 'imprima isso em pdf'.
Observe que os manipuladores de elementos especiais lidam apenas com IDs na versão atual, o que também é declarado em um problema do GitHub . Afirma:
Como a correspondência é feita com todos os elementos da árvore de nós, meu desejo era torná-lo o mais rápido possível. Nesse caso, significava "Somente IDs de elemento são correspondidos". Os IDs de elemento ainda são feitos no estilo jQuery "#id", mas isso não significa que todos os seletores de jQuery sejam suportados.
Portanto, substituir '#ignorePDF' por seletores de classe como '.ignorePDF' não funcionou para mim. Em vez disso, você precisará adicionar o mesmo manipulador para cada elemento, que deseja ignorar como:
var elementHandler = {
'#ignoreElement': function (element, renderer) {
return true;
},
'#anotherIdToBeIgnored': function (element, renderer) {
return true;
}
};
A partir dos exemplos , também é afirmado que é possível selecionar tags como 'a' ou 'li'. Isso pode ser um pouco irrestrito para a maioria dos casos de uso:
Apoiamos manipuladores de elementos especiais. Registre-os no seletor de ID no estilo jQuery para o ID ou o nome do nó. ("#iAmID", "div", "span" etc.) Não há suporte para nenhum outro tipo de seletor (classe, composto) no momento.
Uma coisa muito importante a acrescentar é que você perde todas as suas informações de estilo (CSS). Felizmente, o jsPDF consegue formatar bem h1, h2, h3 etc., o que foi suficiente para meus propósitos. Além disso, ele imprimirá apenas texto dentro de nós de texto, o que significa que não imprimirá os valores de áreas de texto e similares. Exemplo:
<body>
<ul>
<!-- This is printed as the element contains a textnode -->
<li>Print me!</li>
</ul>
<div>
<!-- This is not printed because jsPDF doesn't deal with the value attribute -->
<input type="textarea" value="Please print me, too!">
</div>
</body>