使用PhantomJS渲染PDF并发送给用户而不创建临时文件

时间:2015-09-27 03:14:52

标签: node.js pdf phantomjs

我正在尝试使用PhantomJS呈现PDF文档并发送给用户,但不会在此过程中创建任何文件。原因是安全性,如果我不存储任何文件,就没有什么东西可以被盗。我试图做的是不是运行“page.render(filePath,cb)”我做“page.renderBase64('PNG',cb)”,这样就没事了,除了页面数量等所有页脚和页眉都没了(当我只渲染PDF文件时,他们就在那里)

有没有办法让这些页脚/标题呈现或以不同方式完成我的任务?

编辑: 对不起,我已经在凌晨5点左右发布了这个问题,经过几个小时的战斗,我只是忘了添加我认为可能有用的代码。注释掉的代码完全正常,并生成我期望的页脚和标题文件。我的PhantomJS版本是2.0.0

return P.coroutine(function* () {
  var result = yield getPhantom();
  result.page.set('content', template);

  var options = {
    format: 'Letter',
    paperSize: {width: '215.9mm', height: '279.4mm'},
    margin: {
      left: '25.4mm',
      right: '25.4mm',
      top: '25.4mm',
      bottom: '25.4mm'
    }
  };

  if (document.metadata && document.metadata.enableHeader) {
    options.header = {
      height: '30px',
      contents: result.ph.callback(function (pageNum, numPages) {
        return '<div style="pull-right; font-size: 10px;">Page ' + pageNum + ' of ' + numPages + '</div>';
      })
    }
  }
  if (document.metadata && document.metadata.enableFooter) {
    var footerTemplate = document.footer ?
      document.footer : yield fs.readFile(path.join(templatesPath, 'footer.hbs'), 'utf8');
    var footer = Handlebars.compile(footerTemplate)({
      data: data,
      metadata: document.metadata
    });
    var returnFooter = new Function('pageNum', 'numPages', `return '${footer.replace(/(\r\n|\n|\r)/gm, '')}'`);
    options.footer = {
      height: document.metadata.footerHeight || '120px',
      contents: result.ph.callback(returnFooter)
    }
  }

  result.page.set('paperSize', options);

  //var filePath = path.join(tmpPath, fileService.randomName() + '.pdf');

  var base64 = yield P.fromNode((cb) => result.page.renderBase64('PNG', cb.bind(null, null)));
  //yield P.fromNode(function (cb) {
  //  result.page.render(filePath, cb);
  //});
  result.ph.exit();
  return base64;
  //return filePath;
})();
}

0 个答案:

没有答案