jsPDF è in grado di utilizzare plugin. Per abilitarlo a stampare HTML, devi includere alcuni plugin e quindi devi fare quanto segue:
- Vai su https://github.com/MrRio/jsPDF e scarica l'ultima versione.
- Includi i seguenti script nel tuo progetto:
- jspdf.js
- jspdf.plugin.from_html.js
- jspdf.plugin.split_text_to_size.js
- jspdf.plugin.standard_fonts_metrics.js
Se si desidera ignorare determinati elementi, è necessario contrassegnarli con un ID, che è quindi possibile ignorare in un gestore di elementi speciali di jsPDF. Pertanto il tuo HTML dovrebbe apparire così:
<!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>
Quindi si utilizza il seguente codice JavaScript per aprire il PDF creato in un 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");
Per me questo ha creato un PDF bello e ordinato che includeva solo la riga "stampa questo in pdf".
Si noti che i gestori di elementi speciali trattano solo gli ID nella versione corrente, che è anche indicata in un problema GitHub . Afferma:
Poiché la corrispondenza viene eseguita su ogni elemento nella struttura del nodo, il mio desiderio era di renderlo il più veloce possibile. In quel caso, significava "Solo gli ID degli elementi sono abbinati" Gli ID degli elementi sono ancora eseguiti nello stile jQuery "#id", ma ciò non significa che tutti i selettori jQuery siano supportati.
Pertanto la sostituzione di "#ignorePDF" con selettori di classe come ".ignorePDF" non ha funzionato per me. Dovrai invece aggiungere lo stesso gestore per ogni singolo elemento, che desideri ignorare come:
var elementHandler = {
'#ignoreElement': function (element, renderer) {
return true;
},
'#anotherIdToBeIgnored': function (element, renderer) {
return true;
}
};
Dagli esempi si afferma anche che è possibile selezionare tag come 'a' o 'li'. Questo potrebbe essere un po 'troppo restrittivo per la maggior parte dei casi:
Supportiamo gestori di elementi speciali. Registrarli con il selettore ID in stile jQuery per ID o nome nodo. ("#iAmID", "div", "span" ecc.) Al momento non è supportato nessun altro tipo di selettore (classe, composto).
Una cosa molto importante da aggiungere è che perdi tutte le informazioni di stile (CSS). Fortunatamente jsPDF è in grado di formattare bene h1, h2, h3 ecc., Il che era abbastanza per i miei scopi. Inoltre stamperà solo testo all'interno di nodi di testo, il che significa che non stamperà i valori di textareas e simili. Esempio:
<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>