Membuat file PDF dari html dengan wkhtmltopdf memang susah - susah gampang. Gampang karena dengan gem wicked_pdf dan wkhtmltopdf kita tinggal membuat template html untuk dijadikan file PDF. Susah karena agak sedikit tricky untuk memilih binary wkhtmltopdf yang sesuai.

Persiapan aplikasi

Untuk aplikasi rails saya menggunakn rails 4.0.x, pertama kita tambahkan gem wicked_pdf di Gemfile.

1
gem 'wicked_pdf', github: 'mileszs/wicked_pdf'

lalu buat file initializer di config/initializers/wicked_pdf.rb yang isinya:

1
2
3
4
5
6
7
8
9
10
11
12
13
wicked_config = {
development: {
exe_path: '/usr/local/bin/wkhtmltopdf',
layout: 'pdf.pdf',
page_size: 'Letter'
},
staging: {
exe_path: '/home/app/invoice/shared/bin/wkhtmltopdf',
layout: 'pdf.pdf',
page_size: 'Letter'
}
}
WickedPdf.config = wicked_config[Rails.env.to_sym]

Persiapan file binari

Gem wicked_pdf membutuhkan file binari wkhtmltopdf yang harus diinstall terlebih dahulu. Ada beberapa cara untuk menginstall wkhtmltopdf. Di Mac OS X cara paling gampang adalah dengan menginstall menggunakan installer yang bisa di unduh disini atau dengan homebrew. Di Linux bisa menggunakan package manager tiap distro.

Setelah wkhtmltopdf terinstall ternyata masalah belum selesai, karena biasanya jika menggunakan installer, binary wkhtmltopdf yang terinstall adalah versi yang relatif baru, tapi justru disini masalahnya, karena versi yang baru memiliki beberapa masalah yang akan saya jelaskan nanti. Sekarang lebih baik kita gunakan versi yang lama, saya menggunakan versi 0.9.9 static binary.

Saya memilih binary yang statik karena berarti kita hanya perlu mengurus satu file binari itu saja, karena semua dependensinya sudah ikut dicompile menjadi satu.

Unduh file binari dari google code, pastikan kita mengunduh binari yang statik, biasanya dinamanya ada kata - kata static atau semacamnya, dan unduh yang versi 0.9.9. Lalu letakkan file yang diunduh tadi di direktori /usr/local/bin (pastikan path ini sesuai dengan path yang disebutkan di file initializer wicked_pdf diatas). Sekarang seharusnya kita bisa menghasilkan file pdf dengan wicked_pdf.

Masalah wicked_pdf dengan image tag

Berdasarkan pengalaman yang saya rasakan, walaupun wikhtmltopdf gampang untuk diinstall, ternyata tidak selalu bekerja sesuai yang saya inginkan. Salah satu masalah yang saya temui adalah jika kita menggunakan helper dari wicked_pdf untuk menghasilkan tag image dengan attribut src yang menggunakan url dan bukan asset rails, maka gambar tidak muncul di file pdf yang dihasilkan.

Masalah ini muncul karena wicked_pdf mengasumsikan file gambar yang ditabahkan ke file pdf adalah asset local yang bisa di akses dengan file path, sehingga di attribut src dari tag image selalu di tambahkan file:/// didepannya.

Hal ini jadi masalah terutama ketika kita menggunakan gambar yang di atur oleh gem paperclip, yang penyimpanan gambarnya bisa kita letakkan di server lain, dan kita akses menggunakan url dengan protokol http://. Hal inilah yang saya alami.

Setelah googling tanpa hasil yang memuaskan, akhirnya saya pikir kalau gambar itu dirubah menjadi data uri maka seharusnya tak ada masalah dengan perbedaan protokol lagi, karena dengan menggunakan data uri maka gambar itu di tempel langsung di template html. Untuk itu saya buat helper untuk paperclip seperti dibawah ini:

1
2
3
4
5
6
7
8
9
module Paperclip
class Attachment
def to_data_uri
asset = url.start_with?('/') ? path : url
base64 = Base64.encode64(open(asset).read)
"data:#{content_type};base64,#{base64}"
end
end
end

dan kita gunakan helper tersebut seperti ini

1
<%= image_tag model_dengan_attachment_paperclip.to_data_uri %>

Masalah dengan page break

Masalah lain yang saya alami adalah penentuan page break secara manual. Seringnya kita ingin bisa mengatur page break dari file PDF yang dihasilkan secara manual. Page break bisa dibuat secara manual dengan css, dan seharusnya tak ada masalah jika kita menggunakan wkhtmltopdf versi 0.9.9 statik.