wicked_pdf Error: PDF could not be generated
I had wkhtmltopdf-binary
already in gemfile
, but as this was working on my local computer and not on server, I left this error for the server support team to care off.. they have checked the path to wkhtmltopdf, they tried to convert a simple html to pdf and it worked.. so they tried to run a bundle update
command and after this the pdf converting worked fine on server too. I had a gem path changed and I guess this was the problem. I posted my solution in case someone else will have this problem too.
I had the same problem. I had wkhtmltopdf-binary
installed and bundle update
didn't help neither. Here is what helped me:
The important thing is that I run this on Alpine Linux and it does not seem to be supported by gem wkhtmltopdf_binary_gem https://github.com/zakird/wkhtmltopdf_binary_gem/issues/53
I installed separately wkhtmltopdf into the system: apk add wkhtmltopdf
And then edited the initializer to include the binary path:
# config/initializers/wicked_pdf.rb
require "wicked_pdf"
WickedPdf.config = {
exe_path: ENV["WKHTMLTOPDF_BIN"]
}
I had the same problem. The solution was to add wkhtmltopdf-binary
to the gem file and run bundle install
.
gem "wicked_pdf"
gem "wkhtmltopdf-binary"
For Alpine 3.9+ the wkhtmltopdf binary is available, however I was getting either a blank PDF or "Failed to load document" error - despite working fine locally on MacOSX. It turns out that you need to include fonts explicitly for alpine builds (at least)
Controller action
def show
respond_to do |format|
format.html do
render 'pdfs/templates/my_template.html.erb'
end
format.pdf do
render(
pdf: "file_name",
template: 'pdfs/templates/my_template.html.erb',
disposition: 'inline'
)
end
end
end
The above worked locally on MacOSX machine but on a server based on ruby alpine image, as below, it failed with failed to load document
Dockerfile
FROM ruby:2.6.3-alpine3.10
....
# add wkhtmltopdf for use with wicked_pdf gem
RUN apk --no-cache add wkhtmltopdf
...
even a more basic example failed with a blank pdf
respond_to do |format|
format.pdf do
pdf = WickedPdf.new.pdf_from_string('TESTING 123')
send_data(
pdf,
filename: "file_name.pdf",
type: 'application/pdf',
disposition: 'inline'
)
end
end
Solution
Dockerfile
FROM ruby:2.6.3-alpine3.10
....
# add wkhtmltopdf for use with wicked_pdf gem
RUN apk --no-cache add \
ttf-ubuntu-font-family \
wkhtmltopdf
...
Ideally Alpine would include a basic font with the wkhtmltopdf
package, however until such time I found this to be a useful source of info and/or good for adding a mutistage Docker file.
https://github.com/madnight/docker-alpine-wkhtmltopdf/blob/master/Dockerfile
NOTE:
lack of an explicit font package in alpine may also cause PDF conversion using libreoffice
to fail too. We found corrupt PDFs when converted from docx files in particular.