jsPDF puede usar complementos. Para permitirle imprimir HTML, debe incluir ciertos complementos y, por lo tanto, debe hacer lo siguiente:
- Vaya a https://github.com/MrRio/jsPDF y descargue la última versión.
- Incluya los siguientes scripts en su proyecto:
- jspdf.js
- jspdf.plugin.from_html.js
- jspdf.plugin.split_text_to_size.js
- jspdf.plugin.standard_fonts_metrics.js
Si desea ignorar ciertos elementos, debe marcarlos con un ID, que luego puede ignorar en un controlador de elementos especial de jsPDF. Por lo tanto, su HTML debería verse así:
<!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>
Luego, usa el siguiente código JavaScript para abrir el PDF creado en una ventana emergente:
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 mí, esto creó un PDF bonito y ordenado que solo incluía la línea 'imprimir esto a pdf'.
Tenga en cuenta que los controladores de elementos especiales solo tratan con ID en la versión actual, que también se indica en un problema de GitHub . Afirma:
Debido a que la comparación se realiza con cada elemento del árbol de nodos, mi deseo era hacerlo lo más rápido posible. En ese caso, significaba que "solo las ID de los elementos coinciden". Las ID de los elementos todavía se hacen en estilo jQuery "#id", pero no significa que todos los selectores jQuery sean compatibles.
Por lo tanto, reemplazar '#ignorePDF' con selectores de clase como '.ignorePDF' no funcionó para mí. En su lugar, tendrá que agregar el mismo controlador para todos y cada uno de los elementos, que desea ignorar como:
var elementHandler = {
'#ignoreElement': function (element, renderer) {
return true;
},
'#anotherIdToBeIgnored': function (element, renderer) {
return true;
}
};
De los ejemplos también se afirma que es posible seleccionar etiquetas como 'a' o 'li'. Sin embargo, eso podría ser un poco restrictivo para la mayoría de los casos de uso:
Apoyamos manipuladores de elementos especiales. Regístrelos con el selector de ID de estilo jQuery para ID o nombre de nodo. ("#iAmID", "div", "span", etc.) No hay soporte para ningún otro tipo de selectores (clase, compuesto) en este momento.
Una cosa muy importante para agregar es que pierde toda su información de estilo (CSS). Afortunadamente, jsPDF es capaz de formatear bien h1, h2, h3, etc., lo cual fue suficiente para mis propósitos. Además, solo imprimirá texto dentro de nodos de texto, lo que significa que no imprimirá los valores de áreas de texto y similares. Ejemplo:
<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>