javascript - 在 Meteor js 中生成 PDF 报告

标签 javascript node.js pdf meteor

我非常接近在 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' } 
  1. 根据我的理解,错误是在行中抛出的 fs.readFile(fileName, function (err, data) { in file method.js
  2. 虽然无法读取可能未生成的文件。任何人都可以帮我解决这个问题吗?如果这个问题得到解决,许多人都会受益于这里现成的样板代码。

最佳答案

最初,我有以下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/

相关文章:

javascript - 从 FOR 循环生成的 SELECT 列表中选择 OPTION

javascript - 在滚动到页面底部之前调用函数

node.js - GraphQL-突变响应后的自定义错误消息

ruby-on-rails - 测试使用 ActionMailer 发送的 PDF 内容

Java 用颜色写入 .pdf

javascript - TypeError : props. theTodos.map 不是函数

javascript - 带 if 语句的正则表达式

javascript - Node.js - 创建变量中指定类名的对象

mysql - NodeJS mysql 没有插入到表中

ruby-on-rails - 使用 Ruby/JRuby 将 pdf 转换为图像