Ruby on RailsでPDF作成&ダウンロード機能を実装
PDFダウンロード機能を実装したのでメモ
環境
ここに作った。
https://github.com/omiend/my_strongest_ror
wkhtmltopdf / wicked_pdf
PDF生成に利用したGEMは下記。
gem ‘wkhtmltopdf-binary’ gem ‘wicked_pdf’
wicked_pdfはwkhtmltopdfのラッパーで、単純にHTML画面をPDFとしてダウンロード出来るといったGEM。
他のPDF生成GEMをいろいろと試した中で一番簡単かつ、直感的で、独自DSLがないためキャッチアップが必要ないから、色々と楽。
コンテナの再構築
Gemfileに追加したら、コンテナを再構築。
$ docker-compose build
wicked_pdf.rbの作成
rails generate wicked_pdf
を実行すると、 config/initializers/wicked_pdf.rb
が作成される。
$ ./exec.sh rails generate wicked_pdf rails generate wicked_pdf create config/initializers/wicked_pdf.rb
次に、作成された wicked_pdf.rb
の内容を、下記のように編集。
WickedPdf.config = { :exe_path => “#{Gem.loaded_specs[‘wkhtmltopdf-binary’].full_gem_path}/bin/wkhtmltopdf” }
これでインストール完了。
routesの編集
config/routes.rb に、下記の通り追記。
get ‘/pdf-download’, to: ‘pdf#download’, as: ‘pdf_download’, :format => ‘pdf’
formatにpdfを指定するのがミソ?
コントローラーを作成
基本的な内容なので詳細は割愛。
coffee scriptや、helperは今回不要なので削除。
$ ./exec.sh rails g controller pdf
メソッドの定義はざっとこんな感じ。
class PdfController < ApplicationController def download respond_to do |format| # format.html format.pdf do render pdf: "pdf_download_test", # PDFのファイル名 encording: 'UTF-8', # エンコード指定 layout: 'layouts/pdf.html', # PDF用の共通レイアウト # trueを指定すると、HTML画面として確認ができる show_as_html: params[:show_as_html].present? end end end end
他にもいろいろなオプションがありますが、詳しくはコチラを参考に。
PDF用のレイアウトを作成
コントローラーで指定した layout: ‘layouts/pdf.html’,
に対応する、PDF用のlayoutを layouts/pdf.html.erb
として作成。
<html> <head> <meta charset="utf-8" ?> <%= wicked_pdf_stylesheet_link_tag 'pdf' %> <head> <body> <div class="header">header</div> <%= yield %> <div class="footer">footer</div> </body> </html>
中身は通常のHTML(erb)ファイルだが、CSSファイルの指定だけは通常の stylesheet_link_tag
ではなく、 wicked_pdf_stylesheet_link_tag
を利用。
画面を作成
PDFの画面として、 download.pdf.erb
を作成。
こちらも中身は通常のHTMLと代わりない。
<h1>PDFダウンロードテスト</h1> <h2>PDFダウンロードテスト</h2> <h3>PDFダウンロードテスト</h3>
ダウンロード実行
実際にダウンロード...文字化け。
これは単純にDockerコンテナ内に日本語が存在しないため。
PDF出力については以上だが、せっかくなので日本語表示出来るように修正する。
Dockerコンテナ内に日本語を追加
Dockerfile
にて、コンテナ作成時にIPAから日本語フォーマットをダウンロードする処理を追加。
修正前
RUN apt-get update -qq \ && apt-get install -y build-essential libpq-dev nodejs imagemagick libmagick++-dev \ && rm -rf /var/lib/apt/lists/*
修正後
RUN apt-get update -qq \ && apt-get install -y build-essential libpq-dev nodejs imagemagick libmagick++-dev \ && apt-get install fonts-ipa* \ && rm -rf /var/lib/apt/lists/*
修正したら、 docker-compose build
をして、PDFダウンロードを再実行すれば、日本語が表示されるはず。
PDF生成さえ出来れば、基本的な帳票作成機能はカバー出来るね。
また、wicked_pdfはHTMLとCSSの知識さえアレば、自由にレイアウトを作成できるので、新しく参画したエンジニアでもすぐにPDF生成機能を構築することが良い。
ウォーキング(32.km)
突然ですが、会社から私の家までは、合計32kmほどの距離でして、運動とストレス発散を兼ねて実はちょくちょくとウォーキングで帰っております。
先週の金曜日も会社から家までウォーキングで帰りましたので、今日はその模様をお届けしたいと思います!
ただ、今回はただウォーキングで帰るのが目的ではありません。
今回の一番の目的は、小金井公園に咲いているという、ある花を見ることです。
ある花とは
さて、皆さんは「皇帝ダリア」という花をご存知でしょうか?
キダチダリア(木立ダリア、学名 Dahlia imperialis)は、高さ8-10メートルになるダリア属の種で、メキシコ、中米、コロンビアの原産。日本では学名を訳した「皇帝ダリア」等の別名でも呼ばれる。wikipedia
何時のことかは定かではありませんが、ジョギングしていた時にたまたま目にしてからというもの、その堂々咲き誇る大輪の美しさに、大好きになってしまった花です。
しかし、一年を通して11月の中旬〜12月初旬にしか咲かないため、この時期を逃すと見れるのが次の年になってしまうんですよね。
スタート(恵比寿)〜小金井公園
オフィスから井之頭通りに出て、まずは吉祥寺を目指します。
天気にも恵まれ、とても気持ちの良いウォーキングでした。
代田橋駅近くにある水道局関係の建物が、なんだかとても気になりました。
中に入ってみたい・・・。
川があると、何故か写真を撮りたくなります。
吉祥寺につきました。
井之頭通りはまっすぐ進めばいいだけなので迷わないのが良いのですが、一直線でとても長かく、なかなか(精神的にも)大変でした。
吉祥寺を出て、三鷹を通り過ぎ、しばらく歩くと小金井公園につきます。
途中、おそらく神田川だと思われる川脇にある道を通りましたが、とても良い雰囲気でした。
いよいよ「皇帝ダリア」とご対面
小金井公園にも、秋の気配が(むしろ、もう冬?)。
さっそく皇帝ダリアを探します。
しかし、小金井公園に着いたときにはもう16時を回っており、すっかり黄昏時です。
この時、既に暗くなってきているのと、既に15km弱歩いて疲れていたこと、そして今年もちゃんと皇帝ダリアが咲いているのかわからず、そもそも見つけられるかなどなどで、正直に申し上げまして、若干半泣きでした笑
そんな心配を他所に、しばらく歩き回っているとなんなりと見つける事が出来ました。
正面入口、サービスセンター脇(GoogleMapのリンクを付けてます)に群生していました。
今年も見れて、本当に良かったです。
3メートルほどの高さに、ピンクの大輪と、とても大迫力です。
今年も、もしかしたらまだ咲いているかもしれませんので、是非一度ご鑑賞ください。
小金井公園〜所沢
さて、暗くなってきているので、小金井公園をそそくさと後にします。
この時間になると問題となるのが空腹です。
あたりまえですが、途中のコンビニでもちょいちょい買い食いするくらい、ウォーキングはとてもお腹が減ります。
(市街地はコンビニがあるので、長距離ウォーキングに最適です笑)
「ラーメン食べたいなあ」なんて思っていたら、あるじゃないですか。魁力屋が!!!
実は初めて食べたのですが、疲れと空腹もあってか、めっちゃくちゃ美味しかったです。
普段は付けないサイドメニューなんて付けちゃったりして、お腹は大満足。お財布は悲鳴。
でも、きれいな花を見るよりも、カロリーの方が、実際何よりのウォーキングへの活力になります笑
危険への対処
小金井街道はこれといって面白いものもなく(暗かったですし)、そのまま清瀬駅を通り過ぎます。
しかし、清瀬〜所沢くらいまで来ると畑も広がり道がとても暗く。
何より足元が本当に見えづらいので、真剣に危険と判断し。
この日は、東所沢駅をゴールとし、電車に乗って家に帰りました。
最後に
ウォーキングの楽しさや、皇帝ダリアの美しさが少しでも伝われば幸いです。
エンジニアをやっていると、一日中座っているので、運動は書かせません。
結構ジョギングもやってきた人間なのですが、その土地その土地の町並みをゆっくり観ながら歩くウォーキングの方が好きかもしれません。とてもオススメです。
ただ、危ないと思ったときは無理せず目標の方向転換は大事ですね。
何を成し遂げるべきか、仕事でも臨機応変に対応していきます。
しっかし、電車楽だわ〜笑
グッドライブ!グッドライフ!
こんなライブが開催されるとのことで、会社の代表と二人で参戦!
Rock no Cocoro 10th Anniversary “ONE STEP BEYOND” 11/21 渋谷O-EAST
このライブの情報を見た瞬間、「Kさん(会社の代表)行くかなー?いいや、とりあえずチケット取ってから考えよう」と、ろくに確認せずチケットをゲット笑
もちろん、「行く!」と二つ返事。(実際、予定が空いていてよかった・・・)
佐藤でクエ
さて、割りといい感じに仕事を片付けたとき、「ライブ前に一杯飲みたいね」となり、いつもの居酒屋佐藤にお邪魔。
この日、なんとクエが入荷しているとのこと!
見てください、この薄ピンクのきれいなクエのお刺身。
見た目は鯛の様ですが、食感はややモチモチしており、さすが根魚の王様。
味も良く、お酒にも合うのでパクパク食べてしまいます。
ネギの脇にある茶色いお刺身。これがなんとクエの胃袋だそうです。
初めて食べる食感と味ですが、アンコウのキモが近いですね。
こちらもとても美味しく、何故か、謎に、元気が出そうな一品でした!
そして、インスタグラムのリンク先で見れる磯辺揚げの写真にあるもの。
居酒屋佐藤名物、磯辺揚げ(大好き)ですが、添えられている魚の皮の様なものが、クエの皮で作ったお煎餅です。
味はエビチップスの様で、風味が強く、こちらもまたお酒が進みます。
初めてクエを堪能させていただいたのですが、最高に美味しかったです。
さすが、高級魚と言われるだけのことはありますね。
渋谷のO−EAST
いい塩梅に酔った二人は渋谷O−EASTに向かいました。
このライブは、渋谷は宇田川町にある僕が好きなBAR「ロックのこころ」の10周年記念ライブイベントとなります。
出演バンド別に、軽く感想なんかを!
BACK-ON
初見でしたが、かなりかっこよかったです。
いわゆるミクスチャーロックといいますか、僕のイメージではTWENTY ONE PILOTSに近かったです。
BAND-MAID
コチラも初見。
みんなメイドさんの格好をしているガールズバンドなのですが、見た目とは裏腹に、非常にラウドで激しい楽曲です。
正直、久利と二人でメロメロになってしまいました(笑)
SNOT
SNOTを初めて知ったのは、それこそロックのこころでロック友達が来ていたTシャツからでした。
その友人が「このバンドは、涙なくしては語れないんだよ」と言っていたのがとても印象的で、ネットで調べたところ、98年のOzzfestなどに出演するほどのバンドでした。
しかし、絶頂の最中、当時のVo.であるLynnが他界。
そのSNOTが新しいVo.にCarl Bensleyを迎え来日。
そしてロックのこころの10周年記念のためにライブをする。
これほど、色々な思いが詰まっているライブはなかなかありません...。
MAN WITH A MISSION
トリを飾るのが、我らがマンウィズ!
私自身、ファンになった2011年から数えて、かれこれもう2桁はライブで見ていますが、何度見てもマンウィズのライブは良いものですね。
敢えてつらつら書く必要はないでしょう。
最高でした!
おまけ
ライブ後、物販前でSNOTのVo.Carl Bensleyと少し話する機会がありました。
酔っ払っているので、英語いけます(英語話せますとは言わない笑)
SNOTのVo.Carl Bensleyと
ものすごく人当たりが良く、彼自身も日本に来れて興奮していたようで、「もうここに住みたいぜ!」と2〜3回言ってました笑
「日本はどう?お寿司食べた?」と聞いたら、「お寿司がぐるぐる回っているお店に言ったよ!」とのこと笑
もっと話していたかったです。
IT(1990年版)
今公開中のIT 〜それが見えたら終わり〜 を観に行く前に、改めて見直そうと思ったのだけど、結局時間がなくて後に鑑賞。
IT 〜それが見えたら終わり〜 は、少し設定が違うのね。
当時は小学校1年生くらいだったからだろうか、めちゃくちゃ怖かった覚えがあるんだよね。
でも、今観るとまったく怖くない。
最後の蜘蛛の化物も、なんだか可愛らしさすら覚えるw
それでも、結構忘れていたので、純粋に楽しめた。
しっかし、まさか蜘蛛を素手で倒すとは・・・w