我正在使用Node.JS和Express在Web应用程序上与一个小组合作。我们需要能够生成可以打印为硬拷贝和硬拷贝形式的报告。我们希望在服务器上为报告和手写表单动态生成PDF。我们目前正在服务器上使用EJS模板。
我认为能够使用模板来构建表单/报告并从生成的HTML中生成PDF会很方便,但是我这样做的选项看起来有限。我已经看了两种不同的解决方案:
编辑:我找到了另一个Node.JS模块,该模块能够从HTML node-wkhtml 生成依赖于wkhtmltopdf的PDF。我现在正在使用node-phantom
和node-wkhtml
进行比较。我已经能够在节点服务器上生成具有这两者的PDF,并且它们似乎都能够满足我的需要。
我已经看到了一些使用PhantomJS从网站呈现PDF文档的示例,但我看到的所有示例都使用了URL,并且不提供HTML字符串。我不确定是否可以使用模板进行此工作以动态生成PDF报告。
当报告请求出现时,我希望从EJS模板生成HTML,并使用它生成PDF。反正我是否使用Phantom在服务器上完全动态创建页面而不提出请求?
我的另一个选择是使用允许动态生成PDF的PDFkit,但它是一个类似画布的API,据我所知,它并不真正支持任何模板概念。
有没有人知道我是否可以使用PhantomJS和Node从模板生成的HTML动态生成PDF?或者是否有人知道我可以用来从我的Node / Express后端生成和提供可打印报告/表单的任何其他解决方案。
答案 0 :(得分:8)
我打算为试图与node-phantom
做类似事情的人发布答案。因为node-phantom
控制PhantomJS的本地安装,所以即使相应的PhantomJS操作是同步的,它也必须使用异步方法。设置要在PhantomJS中呈现的页面的内容时,您只需执行以下操作:
page.content = '<h1>Some Markup</h1>';
page.render('page.pdf');
但是,使用节点内的node-phantom模块必须使用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();
});
});
});
答案 1 :(得分:7)
EJS似乎在PhantomJS中运行良好(安装path
模块后)。要在给定HTML字符串的情况下在PhantomJS中加载页面,请执行page.content = '<html><head>...';
。
npm install ejs
和npm 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
。)
答案 2 :(得分:5)
这个问题的一个非常简单的解决方案是node-webshot模块 - 您可以直接将原始html作为参数放入,并直接打印pdf。