是否有可能使用PhantomJS和节点从模板dynamic生成PDF?

背景/需要

我正在使用Node.JS和Express在一个Web应用程序上使用一个组。 我们需要能够生成可作为硬拷贝和硬拷贝forms打印的报告。 最好我们想在服务器上dynamic生成PDF格式的报告和手写格式。 我们目前正在服务器上使用EJS模板。

选项

我认为能够使用模板来构build表单/报告并从生成的HTML中生成PDF将是方便的,但是我的选项似乎是有限的,只要我能find。 我看了两个不同的可能的解决scheme:

  • PhantomJS – (npm 节点 – 幻像模块)
  • PDFKit

编辑:我发现了另一个Node.JS模块,它能够从HTML生成的PDF文件称为节点-wkhtml依靠wkhtmltopdf 。 我现在正在比较使用node-phantomnode-wkhtml 。 我已经能够在这两个节点服务器上生成PDF,他们都似乎能够做我所需要的。

我已经看到了一些使用PhantomJS从网站上呈现PDF文档的例子,但是我所看到的所有例子都使用了一个URL,而不是给它一个HTMLstring。 我不确定我是否可以使用模板来dynamic生成PDF报告。

当报告的请求进来时,我希望从EJS模板生成HTML,并使用它来生成PDF。 有没有反正我使用Phantom来dynamic创build一个页面完全在服务器上,而没有提出请求?

我的另一个select是使用PDFkit,它允许dynamic生成PDF,但它是一个类似canvas的API,并不能真正支持任何模板的概念,据我所知。

问题

有谁知道如果我可以使用PhantomJS与节点dynamic生成从模板生成的HTML的PDF? 还是有人知道任何其他解决scheme,我可以用来生成和提供可打印的报告/forms从我的节点/ Express后端。

在PhantomJS中,EJS似乎运行良好(安装path模块后)。 要在PhantomJS中给定一个HTMLstring的页面,请执行page.content = '<html><head>...';

npm install ejsnpm install path ,然后:

 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(); 

(用phantomjs运行这个脚本,而不是node 。)

我会发布一个答案,任何人试图做类似的node-phantom 。 由于node-phantom控制PhantomJS的本地安装,因此即使相应的PhantomJS操作是同步的,它也必须使用asynchronous方法。 在PhantomJS中设置页面的内容时,您可以简单地执行以下操作:

 page.content = '<h1>Some Markup</h1>'; page.render('page.pdf'); 

但是,在节点内使用节点 – 幻像模块,您必须使用page.set方法。 这是我在下面使用的代码。

 '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(); }); }); }); 

这个问题的一个非常简单的解决scheme是node-webshot模块 – 您可以直接将raw html作为参数,并直接打印pdf。