我非常接近在 Meteor js 中生成 PDF 报告,这将帮助很多人。我的代码几乎运行到最后,但最终出现错误
{ [错误:ENOENT,打开“report.pdf”] errno:34,代码:“ENOENT”,路径:“report.pdf”}
下面是我用来生成 PDF 列表的代码片段。
布局.html
<head>
<style type="text/css">
{{css}}
</style>
</head>
<body>
{{> Template.dynamic template=template data=data}}
</body>
report.html
<body>
<div class="container">
{{#each voters}}
<h4>{{name}}</h4><br>
{{/each}}
</div>
</body>
服务器/method.js
var total = voters.find()
Meteor.methods({'generate_pdf': function() {
console.log("--------inside PDF generation Module----------");
var fs = Npm.require('fs'),
Future = Npm.require('fibers/future'),
fut = new Future(),
fileName = "report.pdf",
voters = total,
data = { voters: voters }
SSR.compileTemplate('layout', Assets.getText('layout.html'));
SSR.compileTemplate('report', Assets.getText('report.html'));
var html_string = SSR.render('layout', { template: "report", data: data });
var options = {
"paperSize": { "format": "Letter", "orientation": "portrait", "margin": "1cm" },
siteType: 'html'
};
console.log("------------Commencing webshot-----------");
webshot(html_string, fileName, options, function(err) {
fs.readFile(fileName, function (err, data) {
if (err) {
return console.log(err);
}
fs.unlinkSync(fileName);
fut.return(data);
});
});
console.log("------------Waiting till PDF generated-----------");
let pdfData = fut.wait();
let base64String = new Buffer(pdfData).toString('base64');
console.log("------------Return result-----------");
return base64String;
}
});
带有按钮的触发点:home.html
<template name="home">
<div class="container">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<a href="#" class="generate-pdf">Generate PDF</a>
</div>
</div>
</div>
</template>
home.js
Template.home.events({
'click .generate-pdf': function(e, tmpl) {
e.preventDefault();
Meteor.call('generate_pdf', function(err, res) {
if (err) {
console.error(err);
} else if (res) {
window.open("data:application/pdf;base64, " + res);
}
})
}
});
控制台登录错误:
=> Meteor server restarted
=> Client modified -- refreshing
I20160509-16:17:04.639(5.5)? --------inside PDF generation Module----------
I20160509-16:17:14.617(5.5)? ------------Commencing webshot-----------
I20160509-16:17:14.622(5.5)? ------------Waiting till PDF generated-----------
I20160509-16:17:14.712(5.5)? { [Error: ENOENT, open 'report.pdf'] errno: 34, code: 'ENOENT', path: 'report.pdf' }
- 根据我的理解,错误是在行中抛出的 fs.readFile(fileName, function (err, data) { in file method.js
- 虽然无法读取可能未生成的文件。任何人都可以帮我解决这个问题吗?如果这个问题得到解决,许多人都会受益于这里现成的样板代码。
最佳答案
最初,我有以下meteor包来使用Phantomjs创建PDF并在单独的选项卡上显示: [适用于 Meteor 版本 1.3.2.4]
<强>1。 dfischer:phantomjs
<强>2。 meteor 黑客:ssr
<强>3。贾里德马丁: future
<强>4。 meteor 黑客:npm
<强>5。布莱恩 morgan :网络截图
经过几个小时的调试,我发现我必须删除包 bryanmorgan:webshot 并手动添加 "webshot":"0.15.4" 的包条目在 Project/packages.json 文件中。简而言之,我必须将 npm 的 webshot 添加到我的 Meteor 项目中。
然后,我必须重新启动 Meteor,它就成功了。
关于javascript - 在 Meteor js 中生成 PDF 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37114361/