0

我目前正在 Galaxy 上运行一个流星应用程序,它根据用户的输入创建 PDF。

我一直在使用 webshot-node 和 FS 来临时保存 PDF,然后在用户端直接下载。

由于我解决了一些其他错误,我在 Galaxy 上再次部署了新项目,但现在无法再生成 PDF(这部分代码没有任何更改)。

我得到的错误如下:

Error: ENOENT: no such file or directory, open /app/bundle/programs/web.browser/app/cv_resume.pdf 
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/app/bundle/programs/web.browser/app/cv_resume.pdf'

如前所述,我在生成 PDF 时没有更改任何内容,所以我想知道你们中是否有人在服务器端使用 webshot 和 FS 时遇到类似错误。

顺便说一句,它在我的本地机器上运行良好。

哦,这是一代的代码,以防有人想尝试一下:

var myDocument1 = Personalinfo.findOne({ email: creator });
      // SETUP
      // Grab required packages
      var fs = Npm.require('fs');
      var Future = Npm.require('fibers/future');
      var webshot = Npm.require('webshot-node');
      var fut = new Future();
      var meteorRoot = fs.realpathSync(process.cwd() + "/../" );
      var publicPath = meteorRoot + "/web.browser/app/";
      var fileName = publicPath + "cv_resume.pdf";

      // GENERATE HTML STRING
      var css = Assets.getText('style.css');
      SSR.compileTemplate('layout', Assets.getText('layout.html'));
      Template.layout.helpers({
        getDocType: function () {
          return "<!DOCTYPE html>";
        }
      });
      SSR.compileTemplate('resume', Assets.getText('resume.html'));

      // PREPARE DATA
      var html_string = SSR.render('layout', {
        css: css,
        template: "resume",
        data: myDocument1
      });

      var options = {
        "paperSize": {
          "format": "A4",
          "orientation": "portrait",
          "margin": "0.8cm"
        },
        siteType: 'html'
      };

      // Commence Webshot
      webshot(html_string, fileName, options, function (err) {
        fs.readFile(fileName, function (err, data) {
          if (err) {
            return console.error(err);
          }
          fs.unlinkSync(fileName);
          fut.return(data);
        });
      });
      
      let pdfData = fut.wait();
      let base64String = Buffer.from(pdfData).toString('base64');
      if (fullName != "") {
        return [base64String, fullName];
      } else {
        return base64String;
      }

希望有人可以帮助我,我已经被这个困扰了很长时间了。如果有人需要更多信息,随时可以使用。

4

1 回答 1

0

感谢您的澄清。似乎您只需要一个具有写入权限的文件夹,webshot 可以在其中放置 pdf,然后您可以从中再次读取它。在这种情况下,只需使用/tmp

var publicPath = "/tmp/";
var fileName = publicPath + "cv_resume.pdf";

更新为使用 /tmp,因此您无需先创建文件夹(在代码中)。

于 2021-11-02T15:25:43.560 回答