【问题标题】:Generate PDF Report in Meteor js在 Meteor js 中生成 PDF 报告
【发布时间】:2016-09-04 00:07:29
【问题描述】:

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

{ [Error: ENOENT, open 'report.pdf'] errno: 34, code: 'ENOENT', path: 'report.pdf' }

下面是我用来生成 PDF 列表的代码 sn-p。

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>

server/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) { 在文件 method.js
  2. 虽然无法读取可能未生成的文件。任何人都可以帮我解决这个问题,如果这个案例得到解决,很多人都会受益于这里准备好的样板代码。

【问题讨论】:

    标签: javascript node.js pdf meteor


    【解决方案1】:

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

    1. dfischer:phantomjs

    2。流星黑客:ssr

    3。 jaredmartin:未来

    4.流星黑客:npm

    5. bryanmorgan:webshot

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多