HTML a PDF con Node.js

Estoy buscando crear una versión imprimible en pdf de las páginas web de mi sitio web. Algo así como express.render() solo muestra la página como pdf

¿Alguien sabe un módulo de nodo que hace eso?

Si no, ¿cómo vas a implementar uno? He visto algunos métodos sobre el uso del navegador sin cabeza como phantom.js , pero no estoy seguro de cuál es el flujo.

Extendiéndose sobre la respuesta de Mustafa.

A) Instalar http://phantomjs.org/ y luego

B) instala el módulo de nodo fantasma https://github.com/amir20/phantomjs-node

enter image description here

C) Aquí hay un ejemplo de renderización de un pdf

 var phantom = require('phantom'); phantom.create().then(function(ph) { ph.createPage().then(function(page) { page.open("http://www.google.com").then(function(status) { page.render('google.pdf').then(function() { console.log('Page Rendered'); ph.exit(); }); }); }); }); 

Salida del PDF:

enter image description here

EDITAR: impresión silenciosa de ese PDF

java -jar pdfbox-app-2.0.2.jar PrintPDF -silentPrint C:\print_mypdf.pdf

Phantom.js es un servidor webkit sin cabeza y cargará cualquier página web y la renderizará en la memoria, aunque es posible que no pueda verla, hay una función de captura de pantalla, en la que puede exportar la vista actual como PNG, PDF , JPEG y GIF. Echa un vistazo a este ejemplo de la documentación de phantom.js

Si quieres exportar HTML a PDF. Tienes muchas opciones. sin nodo incluso

Opción 1: tiene un botón en su página html que llama a la función window.print (). utilice los navegadores nativos html a pdf. use consultas de medios para hacer que su página html se vea bien en un pdf. y también tiene la impresión antes y después de los eventos que puede usar para realizar cambios en su página antes de imprimir.

Opción 2. htmltocanvas o rasterizeHTML . convierta su html a canvas, luego llame aDataURL () en el objeto canvas para obtener la imagen. y use una biblioteca de JavaScript como jsPDF para agregar esa imagen a un archivo PDF. La desventaja de este enfoque es que el pdf no se puede editar. Si desea datos extraídos de PDF, existen diferentes formas de hacerlo.

Opción 3. @Jozzhard respuesta

La mejor solución que encontré es html-pdf. Es simple y funciona con un gran html.

https://www.npmjs.com/package/html-pdf

Es tan simple como eso:

  pdf.create(htm, options).toFile('./pdfname.pdf', function(err, res) { if (err) { console.log(err); } }); 

Crear PDF desde una URL externa

Aquí hay una adaptación de las respuestas anteriores que utiliza html-pdf , pero también lo combina con requestify para que funcione con una URL externa:

Instala tus dependencias

 npm i -S html-pdf requestify 

Luego, crea la secuencia de comandos:

 //MakePDF.js var pdf = require('html-pdf'); var requestify = require('requestify'); var externalURL= 'http://www.google.com'; requestify.get(externalURL).then(function (response) { // Get the raw HTML response body var html = response.body; var config = {format: 'A4'}; // or format: 'letter' - see https://github.com/marcbachmann/node-html-pdf#options // Create the PDF pdf.create(html, config).toFile('pathtooutput/generated.pdf', function (err, res) { if (err) return console.log(err); console.log(res); // { filename: '/pathtooutput/generated.pdf' } }); }); 

Luego, simplemente corres desde la línea de comando:

 node MakePDF.js 

Mira cómo se ha creado tu beautify pixel perfect PDF (¡gratis!)

Utilice html-pdf

 var fs = require('fs'); var pdf = require('html-pdf'); var html = fs.readFileSync('./test/businesscard.html', 'utf8'); var options = { format: 'Letter' }; pdf.create(html, options).toFile('./businesscard.pdf', function(err, res) { if (err) return console.log(err); console.log(res); // { filename: '/app/businesscard.pdf' } }); 

Paquete

Usé html-pdf

Fácil de usar y no solo permite guardar archivos PDF como archivos, sino también canalizar contenido PDF a WriteStream (para que pueda transmitirlo directamente a Google Storage y guardar allí mis informes).

Usar imágenes css +

Tiene en cuenta css. El único problema al que me enfrenté fue que ignoró mis imágenes. La solución que encontré fue reemplazar url en valor de atributo src por base64, por ejemplo

Puede hacerlo con su código o utilizar uno de los convertidores en línea, por ejemplo, https://www.base64-image.de/

Comstack código html válido de html fragment + css

  1. Tuve que obtener un fragmento de mi documento html (Acabo de aplicar el método .html () en el selector jQuery).
  2. Luego, he leído el contenido del archivo css correspondiente.

Usando estos dos valores (almacenados en las variables html y css consecuencia), he comstackdo un código html válido usando la cadena de plantillas.

 var htmlContent = `       ${html}  ` 

y lo pasó para create método de html-pdf .