node.js - nodejs - ¿Es posible usar PhantomJS y Node para generar dinámicamente archivos PDF a partir de plantillas?
phantomjs() (3)
EJS parece funcionar bien en PhantomJS (después de instalar el módulo de path
). Para cargar una página en PhantomJS dada una cadena de HTML, haga page.content = ''<html><head>...'';
.
npm install ejs
y npm install path
, luego:
var ejs = require(''ejs''),
page = require(''webpage'').create();
var html = ejs.render(''<h1><%= title %></h1>'', {
title: ''wow''
});
page.content = html;
page.render(''test.pdf'');
phantom.exit();
(Ejecute este script con phantomjs
, no con node
).
Fondo / Necesidad
Estoy trabajando con un grupo en una aplicación web usando Node.JS y Express. Necesitamos poder generar informes que puedan imprimirse como copias impresas y también formularios impresos. Preferiblemente, nos gustaría generar dinámicamente archivos PDF en el servidor para informes y formularios escritos a mano. Actualmente estamos usando plantillas EJS en el servidor.
Opciones
Pensé que sería conveniente poder usar plantillas para poder crear formularios / informes y generar un PDF a partir del HTML resultante, sin embargo, mis opciones para hacer esto parecen ser limitadas hasta donde puedo encontrar. He visto dos posibles soluciones diferentes:
- PhantomJS - (npm node-phantom module)
- PDFKit
EDITAR: Encontré otro módulo Node.JS que puede generar archivos PDF a partir de HTML llamado node-wkhtml que se basa en wkhtmltopdf . Ahora estoy comparando utilizando node-phantom
y node-wkhtml
. He podido generar archivos PDF en un servidor Node con ambos y ambos parecen ser capaces de hacer lo que necesito.
He visto algunos ejemplos de uso de PhantomJS para representar documentos PDF de sitios web, pero todos los ejemplos que he visto utilizan una URL y no la alimentan con una cadena de HTML. No estoy seguro de si podría hacer que esto funcione con plantillas para generar informes PDF de forma dinámica.
Cuando llega una solicitud de informe, esperaba generar HTML a partir de una plantilla EJS y usarlo para generar un PDF. ¿Hay alguna forma de usar Phantom para crear dinámicamente una página completamente en el servidor sin hacer una solicitud?
Mi otra opción es usar PDFkit, que permite la generación dinámica de archivos PDF, pero es una API similar a un lienzo y realmente no admite ninguna noción de plantillas por lo que puedo decir.
La pregunta
¿Alguien sabe si puedo usar PhantomJS with Node para generar dinámicamente archivos PDF a partir de HTML generado a partir de una plantilla? ¿O alguien sabe alguna otra solución que pueda usar para generar y entregar informes / formularios imprimibles desde mi back-end Node / Express?
Una solución realmente fácil para este problema es el módulo node-webshot : puede poner html directamente como argumento e imprime el pdf directamente.
Voy a publicar una respuesta para cualquiera que intente hacer algo similar con node-phantom
. Debido a que node-phantom
controla la instalación local de PhantomJS, debe usar métodos asíncronos para todo, incluso cuando la operación de PhantomJS correspondiente sea sincrónica. Al configurar el contenido de una página para que se represente en PhantomJS, simplemente puede hacer lo siguiente:
page.content = ''<h1>Some Markup</h1>'';
page.render(''page.pdf'');
Sin embargo, al usar el módulo node-phantom dentro del nodo, debe usar el método page.set
. Este es el código que he usado a continuación.
''use strict'';
var phantom = require(''node-phantom'');
var html = ''<!DOCTYPE html><html><head><title>My Webpage</title></head>'' +
''<body><h1>My Webpage</h1><p>This is my webpage. I hope you like it'' +
''!</body></html>'';
phantom.create(function (error, ph) {
ph.createPage(function (error, page) {
page.set(''content'', html, function (error) {
if (error) {
console.log(''Error setting content: %s'', error);
} else {
page.render(''page.pdf'', function (error) {
if (error) console.log(''Error rendering PDF: %s'', error);
});
}
ph.exit();
});
});
});