是否可以使用PhantomJS和Node从模板动态生成PDF?

Cor*_*oss 17 pdf templates pdf-generation node.js phantomjs

背景/需要

我正在使用Node.JS和Express在Web应用程序上与一个小组合作.我们需要能够生成可以打印为硬拷贝和硬拷贝形式的报告.我们希望在服务器上为报告和手写表单动态生成PDF.我们目前正在服务器上使用EJS模板.

选项

我认为能够使用模板来构建表单/报告并从生成的HTML中生成PDF会很方便,但是我这样做的选项在我能找到的范围内看起来有限.我看了两种不同的解决方案:

编辑:我找到了另一个Node.JS模块,它能够从HTML生成名为node-wkhtml的 PDF,它依赖于wkhtmltopdf.我现在正在比较使用node-phantomnode-wkhtml.我已经能够在节点服务器上生成具有这两者的PDF,并且它们似乎都能够满足我的需要.

我已经看到了一些使用PhantomJS从网站呈现PDF文档的例子,但我见过的所有例子都使用了一个URL而不是一串HTML.我不确定是否可以使用模板进行此工作以动态生成PDF报告.

当我收到报告请求时,我希望从EJS模板生成HTML,并使用它生成PDF.反正我是否使用Phantom在服务器上完全动态创建页面而不提出请求?

我的另一个选择是使用PDFkit,它允许动态生成PDF,但它是一个类似画布的API,据我所知,它并不真正支持任何模板概念.

问题

有谁知道我是否可以使用PhantomJS和Node从模板生成的HTML动态生成PDF?或者是否有人知道我可以用来从我的Node/Express后端生成和提供可打印报告/表单的任何其他解决方案.

Cor*_*oss 8

我打算给那些试图做类似事情的人发一个答案node-phantom.因为node-phantom控制PhantomJS的本地安装,所以即使相应的PhantomJS操作是同步的,它也必须使用异步方法.设置要在PhantomJS中呈现的页面的内容时,您可以简单地执行以下操作:

page.content = '<h1>Some Markup</h1>';
page.render('page.pdf');
Run Code Online (Sandbox Code Playgroud)

但是,使用节点内的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();
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 我发送了一个动态html,它有外部css,因此使用"set"我无法将我的css应用于生成的pdf.请给我任何建议. (2认同)

Tre*_*xon 7

EJS似乎在PhantomJS中运行良好(安装path模块后).要在给定HTML字符串的情况下在PhantomJS中加载页面,请执行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();
Run Code Online (Sandbox Code Playgroud)

(运行此脚本phantomjs,而不是node.)

  • 谢谢,我曾尝试在我的节点服务器上设置`page.content`,使用(node-phantom)控制本地PhantomJS安装.没有设置内容并呈现内容的错误,但PDF只是一个空白页面.要使用node-phantom设置内容,必须使用async函数`page.set`. (2认同)

Pet*_*rov 5

这个问题的一个非常简单的解决方案是node-webshot模块 - 您可以直接将原始html作为参数放入,并直接打印pdf.