2015-05-04 84 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