2017-01-04 12 views
0

私のビューからPDFを作成しようとしています。Node.js、Jade、Expressを使用してPDFを作成する

このビューは、JadeとExpressを使用してレンダリングされ、いくつかのJavascript、いくつかのCSSファイルをロードし、いくつかのJadeビューを拡張し、データベースに照会して異なるグラフを設定します。レンダリングプロセスはあまりよく最適化されていないため、約7秒かかります。

さらに、ビューのGETリクエストではpassportconnect-ensure-loginを使用して、レンダリング前にユーザーがログインしていることを確認し、レンダリング時にJade用の変数を渡します。

var express = require('express'); 
var router = express.Router(); 
var moment = require('moment'); 

router.get('/', require('connect-ensure-login').ensureLoggedIn(), function (req, res, next) { 
    res.render('summary', { 
     title: 'Summary', 
     day: moment().format('D'), 
     month: moment().locale('es').format('MMMM'), 
     year: moment().format('YYYY') 
    }); 
}); 

module.exports = router; 

これは、PDFに変換する必要がありジェイドファイルです:

extends layout 

block content 

    .container-fluid 

     #banner 

     .chart#chart1 
     .chart#chart2 
     .chart#chart3 

     script(type='text/javascript', src='/javascripts/summary.js') 

を、これはジェイドは(レイアウト)ファイルで拡張されています。これは、ハンドラのコードである

doctype html 

html 
    head 
     meta(charset='utf-8') 
     meta(http-equiv='X-UA-Compatible', content='IE=edge') 
     meta(http-equiv='content-type', content='text/html; charset=UTF-8') 
     meta(content='width=device-width, initial-scale=1', name='viewport') 
     title=title 

     link(rel='stylesheet', type='text/css', href='/stylesheets/styles.css') 

     script(type='text/javascript', src='/assets/jquery-3.1.1/jquery-3.1.1.min.js') 
     script(type='text/javascript', src='/assets/bootstrap-3.3.7/js/bootstrap.min.js') 

    body 
     .page-wrapper 
      block content 

ページを読み込んでスクリーンショットを撮ってPDFに変換したり、翡翠ファイルからPDFとしてレンダリングしたりするにはどうすればいいですか?

PhantomJSについて聞いたことがありますが、最新の情報は見つかりませんでした。

誰かが私を助けることができたら、私はとても感謝しています。あなたは何ができるか

答えて

0

、このライブラリを使用し、これが完了するとファイル・システム(非同期の方法)に保存し、所望の値との.htmlファイルを生成するためにヒスイ/パグを使用している:

https://www.npmjs.com/package/html-pdf

ファイルシステムに保存した.htmlファイルを読んで(非同期に)、pdfに変換し、最後にクライアントにストリームします。

ファイルシステムに書き込む代わりに別のライブラリを使用して直接PDFコンバータにパイプすると、高速になることがあります。

テンプレートが頻繁に変更される場合、これはすべての要求に対して実行する必要があります。そうでなければ、キャッシュして最初に生成し、ifが既に存在していることを検出して応答にパイプします。

希望します。