首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以使用PhantomJS和Node从模板动态生成PDF吗?

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

Stack Overflow用户
提问于 2013-10-22 00:22:18
回答 3查看 10.1K关注 0票数 16

背景/需求

我正在与一个使用Node.JS和Express的web应用程序小组一起工作。我们需要能够生成报告,可以打印为硬拷贝,也可以硬拷贝形式。最好,我们想在服务器上为报告和手写表单动态生成PDF。我们目前在服务器上使用的是EJS模板。

选项

我在想,能够使用模板来构建表单/报告并从生成的HTML生成PDF会很方便,但就我所能找到的而言,这样做的选择似乎有限。我已经研究了两种不同的可能解决方案:

编辑:我发现了另一个Node.JS模块,它能够从node-wkhtml 生成PDF,它依赖于wkhtmltopdf。我现在正在使用node-phantomnode-wkhtml进行比较。我已经能够用这两个工具在Node服务器上生成PDF,它们似乎都能做我需要的事情。

我见过一些使用PhantomJS从网站呈现PDF文档的例子,但我见过的所有例子都使用了一个URL,而不是向它提供一个HTML字符串。我不确定我是否可以让这个工作与模板,以便动态生成PDF报告。

当一个报告的请求进来时,我希望从一个EJS模板生成HTML,并使用它来生成PDF。有没有办法让我使用Phantom在服务器上完全动态地创建一个页面,而不需要发出请求?

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

问题是

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 04:45:30

在安装path模块之后,EJS似乎可以在PhantomJS中正常运行。要在给定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();

(使用phantomjs而不是node运行此脚本。)

票数 7
EN

Stack Overflow用户

发布于 2013-10-22 23:39:30

对于任何想用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();
        });
    });
});
票数 7
EN

Stack Overflow用户

发布于 2014-01-12 05:37:00

这个问题的一个非常简单的解决方案是node-webshot模块-你可以直接把原始的html作为一个参数,它会直接打印pdf。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19499789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档