在Meteor js

时间:2016-05-09 11:14:45

标签: javascript node.js pdf meteor

我非常接近在Meteor js中生成PDF报告,这将有助于许多人。我的代码几乎一直运行到最后,但最终出现错误

{[错误:ENOENT,打开'report.pdf']错误:34,代码:'ENOENT',路径:'report.pdf'}

以下是我用来生成PDF列表的代码段。

的layout.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' } 
  1. 根据我的理解,错误就行了 fs.readFile(fileName,function(err,data){ in file method.js
  2. 虽然无法读取可能未生成的文件。任何人都可以帮助我解决这个问题,如果这个案例得到解决,许多人可以在这里使用现成的锅炉板代码。

1 个答案:

答案 0 :(得分:1)

最初,我使用Phantomjs创建PDF并在单独的TAB上显示以下meteor包: [对于Meteor版本 1.3.2.4 ]

<强> 1。 dfischer:phantomjs

<强> 2。 meteorhacks:SSR

第3。 jaredmartin:将来

<强> 4。 meteorhacks:NPM

<强> 5。 bryanmorgan:webshot

经过数小时的调试后,我发现我必须删除 bryanmorgan:webshot 包并手动添加“webshot”的包条目:“0.15.4” Project / packages.json 文件中。简而言之,我必须将npm的webshot 添加到我的流星项目中。

然后,我不得不重新启动流星,它起作用了。