2015-05-04 59 views
4

我想通过wkhtmltopdf将一些html页面转换为pdf。但是,我想要转换为PDF的html页面是使用句柄动态生成的。节点表达如何将handlebars html页面渲染为文件

所以我认为一种解决方案可能是通过句柄生成html页面,但是生成一个文件(html文件)。然后,使用hkhtmltopdf将该文件转换为pdf,然后允许用户以某种方式下载PDF。

所以,我的问题是:如何将(handlebars)动态生成的html页面渲染为文件?

谢谢,再见...

+1

检查的第一个用法示例从这里https://npmjs.com/package/handlebars然后用fs.writeFile写入你的文件 – Miroshko

+0

嗨,Miroshko,谢谢你的回答;请在下面看到我的评论... –

回答

8

创建文件的简单示例。

var Handlebars = require('handlebars'); 

var source = "<p>Hello, my name is {{name}}. I am from {{hometown}}. I have " + 
    "{{kids.length}} kids:</p>" + 
    "<ul>{{#kids}}<li>{{name}} is {{age}}</li>{{/kids}}</ul>"; 
var template = Handlebars.compile(source); 

var data = { "name": "Alan", "hometown": "Somewhere, TX", 
    "kids": [{"name": "Jimmy", "age": "12"}, {"name": "Sally", "age": "4"}]}; 
var result = template(data); 


var fs = require('fs'); 
    fs.writeFile("test.html", result, function(err) { 
    if(err) { 
     return console.log(err); 
    } 
}); 
+1

嗯,我在这里有点困惑。首先,我使用:var exphbs = require('express-handlebars')。当我试图做“编译”时,我得到这个错误:“Handlebars没有方法'编译'”。我在与“main”不同的文件中使用此代码,其中我使用“create”方法配置Express。我试图在这个文件中添加“创建”部分,但错误是一样的。因为我需要的不是在“main”中,而是在另一个文件(another.js)中,我从“main.js”中请求,我需要为Handlebars接受“编译”方法做什么? –

+0

我认为'express-handlebars'不是官方和完整的软件包。使用此 - https://www.npmjs.com/package/handlebars –

0

Alex以上的代码完美无缺。但是,我的困惑是:我使用的是“快速车把”而不是“车把手”。现在,我可以理解的是,Express-Handlebars是Express应用程序的Handlebars的实现,我正在使用它。我只是没有找到在Express-Handlebars中使用'compile()'方法的方法,所以我最终安装了Handlebars(独立版),并使用它来编译我的(html)模板并将结果保存到磁盘,就像Alex上面解释道。

总结: 1)我知道Express-Handlebars是快递应用的把手。 2)我不知道如何从express-handlebars中使用“compile()”方法,所以我最终安装了Handlebars(从npm)并在服务器上使用它来生成我的html文件(从模板)并保存它到磁盘。 3)当然我安装并使用Express-Handlebars在我的Express应用程序中为我的页面提供服务;只是安装Handlebars来生成我的HTML(在服务器)与“编译()”方法,并将结果保存到磁盘。

希望这是可以理解的。再次感谢并再见...

+0

这应该只是一个评论,而不是另一个答案,你应该接受亚历克斯的答案,如果它是正确的。 –

3

使用express-handlebars,您应该使用高级模式并创建它的一个实例,如this example

的正确方法是创建一个视图文件(就像你可能已经按照您怀疑),并使用快递车把实例,以使其:

// init code 
var exphbs = require('express-handlebars'); 
var hbs = exphbs.create({ 
    defaultLayout: 'your-layout-name', 
    helpers: require("path-to-your-helpers-if-any"), 
}); 
app.engine('.file-extention-you-use', hbs.engine); 
app.set('view engine', '.file-extention-you-use'); 

// ...then, in the router 
hbs.render('full-path-to-view',conext, options).then(function(hbsTemplate){ 
    // hbsTemplate contains the rendered html, do something with it... 
}); 

HTH