[Rails5] wicked_pdf 란 무엇입니까?

소개



Rails의 공부로서 gem 주위를 만져 보는 기획입니다.
이번에는...

wicked_pdf

시도해 보겠습니다.

무슨 젬이야?



간단히 말하면 HTML을 PDF로 변환하여 다운로드하는 것을 실현하는 gem입니다.

함께 wkhtmltopdf 라는 명령줄 도구의 gem도 사용합니다.
wkhtmltopdf를 Rails 사용하려면 이번 wicked_pdf가 필요합니다.
(wicked_pdf는 래퍼에 해당하는 gem 같다.)

조속히 시도해 봅시다.

검증 환경



다음 환경에서 실시했습니다.
[client]
・MacOS Mojave(10.14.2)
・Vagrant 2.2.2
・VBoxManage 6.0.0

[virtual]
・CentOS 7.6
・Rails 5.2.2
・ruby 2.3.1

참고까지.

wicked_pdf 소개



1.gem 설치

사전에 Rails 공부용으로 작성한 프로젝트로 진행합니다.
각 MVC는 적당히 게시판 앱을 상정하여 Posts 컨트롤러 등을 생성 완료되었습니다.
(index, show, edit의 빈 페이지를 볼 수있는 정도)
$ rails g model post
$ rails g controller posts index show edit

그 전제하에 Gemfile에 다음을 추가한다.

Gemfile
# wicked_pdf
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'

추가하면 설치.
$ bundle install

-----------
Fetching wicked_pdf 1.1.0
Installing wicked_pdf 1.1.0
Fetching wkhtmltopdf-binary 0.12.4
Installing wkhtmltopdf-binary 0.12.4
-----------
→無事に完了。

계속해서 이니셜라이저를 생성.
$ rails g wicked_pdf
    create  config/initializers/wicked_pdf.rb

2.wicked_pdf 설정하기

위의 명령으로 생성된 파일의 내용을 조정합니다.

wicked_pdf.rb
# WickedPDF Global Configuration
#
# Use this to set up shared configuration options for your entire application.
# Any of the configuration options shown here can also be applied to single
# models by passing arguments to the `render :pdf` call.
#
# To learn more, check out the README:
#
# https://github.com/mileszs/wicked_pdf/blob/master/README.md

WickedPdf.config = {
  # Path to the wkhtmltopdf executable: This usually isn't needed if using
  # one of the wkhtmltopdf-binary family of gems.
  # exe_path: '/usr/local/bin/wkhtmltopdf',
  #   or
  # exe_path: Gem.bin_path('wkhtmltopdf-binary', 'wkhtmltopdf')

  # これを追記
  :exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"

  # Layout file to be used for all PDFs
  # (but can be overridden in `render :pdf` calls)
  # layout: 'pdf.html',
}

이 설정의 기술 방법은 이쪽을 참고로 했습니다.

견적:
rails에서 wicked_pdf를 사용하는 방법
by 🌸

또한 gem의 README에도 적혀 있지만,
Rails 버전이 오래된 경우 mime_types.rb다음 설명이 필요할 것 같습니다.

mime_types.rb
Mime::Type.register "application/pdf", :pdf

이번에는 새로운 버전의 Rails 때문에,
특히 추가하지 않아도 되므로 스루.

3.wicked_pdf를 사용해보기

이제 wicked_pdf를 사용하여 구현해 보겠습니다.

posts_controller.rb
def show
  # とりあえず愚直に
  respond_to do |format|
    format.html
    format.pdf do
      render pdf: "sample",   # PDF名
             template: "posts/show.html.erb" # viewを対象にする
    end
  end
end

4. 동작 확인

그럼 서버를 시작해 페이지를 보자.
액세스 URL로 /posts/show 또는 /posts/show.html지금까지와 같이 일반 HTML 페이지가 표시되었습니다.

그리고 본제의 posts/show.pdf에 액세스하면 ...
오류! ! ! ! ! ! ! ! !
RuntimeError (Failed to execute:
["/usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf", "-q", "file:////tmp/wicked_pdf20190108-8274-1n8d1sj.html", "/tmp/wicked_pdf_generated_file20190108-8274-7au09y.pdf"]
Error: PDF could not be generated!
 Command Error: /usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf_linux_amd64: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or directory
):

명령 오류의 결과로 생성 실패했습니다.
libXrender.so.1이 없습니까?

오류 해결



어쩐지・・・.
라는 느낌으로 벽에 부딪쳤기 때문에,
Google 선생님에게 여러가지 들으면서 대응책을 조사한다.

조사한 결과, 지금의 가상 환경에 라이브러리가 부족하지 않은 모습.
우선 libXrender를 넣어 본다.
$ yum -y install libXrender

위를 설치 한 후 페이지를 다시 보았을 때,
이번에는 "libfontconfig.so.1"이 ~라는 오류!
계속 추가 추가 추가 ぁ!
(그 밖에도 마찬가지로 에러가 나왔기 때문에 단번에 정리해 기재합니다)
$ yum -y install libfontconfig.so.1
$ yum -y install fontconfig
$ yum -y install libXext

그리고 마침내 ...



표시된 했어요!

소감



도하마했습니다.
gem이고, 거기까지 고생하지 않고 만질 것이라고 생각했지만,
그런 일은 없었다. 그냥 환상이었습니다.

하지만 어쨌든,
본래 하고 싶었던 HTML을 PDF로 변환하는 기능은 할 수 있었으므로,
좋았고 좋았습니다.

어쩌면 여기에서 먼저,
일본어 넣거나, 출력시의 레이아웃 조정 등,
여러 가지 더 어려운 일이 있다고 생각하지만,
우선은 단락으로서 일단 여기에서 단락짓습니다.

2019/01/09 추가:
계속 썼습니다.

결론



뭔가 눈치채는 점이 있으면,
지적이나 어드바이스등 받을 수 있으면 매우 도움이 됩니다!

좋은 웹페이지 즐겨찾기