2

わかりました、ここにこの質問のいくつかのバージョンがありますが、私のものは他のいくつかよりも少し深くなっており、満足のいく答えは見られません.

私が欲しいもの:

ユーザーによってコンテンツが頻繁に変更される Web サイトのページがあり、「PDF を生成」というボタンを押して、ページ上の関連情報を見栄えの良い PDF レポートに変換できるようにしたいと考えています。

Herokuにデプロイして、NodeJS、Expressでこれをやろうとしています。

一般的に、これは私がこれを達成しようとしている方法です:

私の計画:

  1. GET リクエストを開始する
  2. データベースにクエリを実行して関連する結果を得る
  3. EJS テンプレートにデータをロードする
  4. 結果の HTML を保存します
  5. npm モジュールHTML-pdfを使用してブラウザにストリーミングします

その他の重要な詳細:

  1. このファイルは一時的なものです。どこにも保存したくありません。
  2. その時点でブラウザにのみ存在することを意図しているため、どこにも書き込む必要さえないことを好みます。
  3. このアプリは Heroku にデプロイされており、その構造内で動作する必要があります。私は、S3 のようなファイル ストアを使用したくありません。

私のコード:

router.get('/formulas/:id/pdf', function(req, res){
  var db = req.db.collection('users');
  var id = new ObjectID(req.params.id);
  var pointer = {"formulas.$": 1, "_id": 0};
//query database, get the info out
db.aggregate([
  {$match: {"formulas.f_id": id}},
  {$unwind: "$formulas"},
  {$match: {"formulas.f_id": id}},
  {$project : {"formulas": 1, "_id": 0}}
]).toArray(function(e, doc){
  if (e) {
  throw e;
} else {
  var html = null;
  ejs.renderFile('./views/pdf.ejs', { //create template from db query
    project: doc[0].formulas,
    title: 'Formula Info Report',
    description:  'PDF Report For Your Formula by Nutraceutical Pro',
    ID: 'pdf',
    keywords: 'PDF, PDF generator, Formula Info Report',
    user: req.user,
    loggedIn: req.isAuthenticated()
  }, function(err, results){
    if (err) {
      console.log(err);
      }
      html = results; //save results of HTML output
    });
    var options = { format: 'Letter' };
    var path = './public/pdf/formula-' + req.params.id + '.pdf';
    pdf.create(html, options).toStream(function(err, stream) {//initiate stream
      if (err) {
        return console.log(err);
      }
      if (stream) {
        console.log(stream);
        stream.pipe(fs.createWriteStream(path));
        console.log("the pdf was streamed.");
        res.end();
        }
      });
    }
  });
});

GET次のような AJAX 呼び出しでリクエストを開始します。

 $('.getPDF').click(function(){
   var filepath = 'https://my-domain.herokuapp.com/pdf/formula-' + this.id + '.pdf';
 $.ajax({
   url: '/formulas/'+ this.id +'/pdf',
   type: 'GET',
   success: function () {window.open(filepath);}
 });

スクリプトを実行するとストリームが生成され、コンソールは PDF が作成されたことをログに記録します。結果のファイルをローカル システムに保存するだけでは問題ありませんが、アプリでは次のエラー メッセージが表示されます。

Cannot GET /pdf/formula-59cc38992fb99b00045832ad.pdf

つまり、PDF の原材料が作成されているようなものですが、ログに記録されず、アプリが読み取れるような方法で作成されていません。

私はこれについてさまざまな解決策を受け入れるので、もっと簡単な方法があれば、私はすべて耳を傾けます. ただし、現在のスタックに固執することを好みます。

4

0 に答える 0