ruby on rails 中使用phantomjs生成pdf,並使用cookie,支持https

1、新建項目

  rails new app --skip-bundleweb

  完成後修改Gemfile文件:vim Gemfilevim

  把source 修改爲taobao或者ruby-china的源。ruby

  在這個文件里加入:gem 'phantomjs'cookie

  而後運行:bundle installsession

  這樣項目就新建完成了。app

  phantomjs須要單獨下載,若是不下載,這個gem運行的時候會自動下載,可能會比較慢。dom

2、生成pdf

  建立一個controller在頭部加上require 'phantomjs'ui

  在format.pdf的代碼塊裏中入以下代碼:url

  scheme = "#{request.scheme}" # 獲取協議
      url = "#{scheme}://webdomain/path" #這是要生成pdf的頁面url,能夠動態獲取,這裏只作簡單的說明
  
    name = "#{Time.now.to_date.to_s(:db)}_#{Digest::MD5.hexdigest('pdf'+Time.now.to_i.to_s)}.pdf"
    path = Rails.root.join("public","download", "#{name}").to_s #生成pdf後存放的路徑
    Phantomjs.base_dir = Rails.root.join('public','js', 'phantomjs').to_s # 這裏是下載phantomjs文件的存放路徑,若是不指定這個,它會自動下載phantomjs。rest

  https_protocol = "--ignore-ssl-errors=yes" if scheme == "https" # phantomjs的一項配置


    Phantomjs.run(https_protocol.to_s, Rails.root.join('public','js','rasterize.js').to_s, url, path, "", request.host, cookies["_your_session"]) #resterize.js存入在public/js下, _your_session是你的項目的session名稱。
    send_file(path)

這裏使用的是resterize.js,須要對源碼進行修改:

"use strict";var page = require('webpage').create(),    system = require('system'),    address, output, size;phantom.addCookie({    'name'     : '_your_session',   /* 你的session 名稱  */    'value'    : system.args[5],  /* session ,傳入的參數*/    'domain'   : system.args[4],  /* 你的域名,傳入的參數 */    'path'     : '/',                /* required property */    'httponly' : true,    'secure'   : false,    'expires'  : (new Date()).getTime() + (1000 * 60 * 60)   /* <-- expires in 1 hour */});if (system.args.length < 3 || system.args.length > 7) {    console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');    console.log('  paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');    console.log('  image (png/jpg output) examples: "1920px" entire page, window width 1920px');    console.log('                                   "800px*600px" window, clipped to 800x600');    phantom.exit(1);} else {    address = system.args[1];    output = system.args[2];    page.viewportSize = { width: 600, height: 600 };    // if (system.args.length > 4) {    //     page.zoomFactor = 0.1;    // }    page.open(address, function (status) {        if (status !== 'success') {            console.log('Unable to load the address!');            phantom.exit(1);        } else {            window.setTimeout(function () {                page.render(output);                phantom.exit();            }, 1000);        }    });}本例主要是生成pdf,去掉了一些沒用的代碼,加入了addCookie的代碼。

相關文章
相關標籤/搜索