As described on wkhtmltopdf Google group (http://code.google.com/p/wkhtmltopdf/issues/detail?id=162), I have a problem generating a PDF while using popen and wkhtmltopdf. wkhtmltopdf takes HTML code as input and ouputs a PDF file. Here is what I''m doing: command = ''"C:\Program Files\wkhtmltopdf\wkhtmltopdf.exe" - - -q'' IO.popen(command, ''r+'') do |f| # Writing the html previously rendered in a string f.write(html_output) f.close_write # Reading the ouput and closing pdf = f.readlines f.close # Returning the pdf data pdf end This code results in a corrupted PDF file. I checked the PDF itself which shows some differences with a valid PDF file, like some missing closing tags (endstream) - but I''m not an expert of that format. Well, my question is the following: am I doing it wrong, using a wrong method, missing something, or wkhtmltopdf is more likely to be the problem? I attached the corrupted file. If you have a look at it, you''ll notice that a PDF EOF symbol is there, which tends to say that the generation was not interrupted in any way. Any idea? Thanks for your help! - Nicolas Attachments: http://www.ruby-forum.com/attachment/4453/corrupted.pdf -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Hi Nicolas, Whenever I generate pdfs from a rails app using wkhtmltopdf (or princexml), I usually call wkhtmltopdf using an app_url (ie wkhtmltopdf hits the web app to get the html/css/imgs/... to be used to gen the pdf), something like the following: # in some controller .... require ''timeout'' .. TIMEOUT_SECS = 5 ... def gen_pdf url_to_pdf = .... # the url to gen the pdf from. fname = .... # the name of the resulting pdf. ftype = "application/pdf" # combat shell injection? app_url = app_url.to_s.gsub(/["''\s`$;><&\|\(\)\\\[\]]/, '''') s = nil # valid url? unless (app_url =~ URI::regexp).nil? begin timeout(TIMEOUT_SECS) do # gen pdf from url. s = `wkhtmltopdf -q "#{app_url}" -`.chomp end rescue Exception => e ... # log, render/redirect err msg, ... end end # invalid pdf? if not s.to_s =~ /^%PDF/ ... # log, render/redirect err msg, .... end send_data(s, :type=>ftype, :filename=>fname); return end ... Jeff On Feb 1, 8:14 pm, Nicolas Rimbeau <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> As described on wkhtmltopdf Google group > (http://code.google.com/p/wkhtmltopdf/issues/detail?id=162), I have a > problem generating a PDF while using popen and wkhtmltopdf. > > wkhtmltopdf takes HTML code as input and ouputs a PDF file. Here is what > I''m doing: > > command = ''"C:\Program Files\wkhtmltopdf\wkhtmltopdf.exe" - - -q'' > IO.popen(command, ''r+'') do |f| > > # Writing the html previously rendered in a string > f.write(html_output) > f.close_write > > # Reading the ouput and closing > pdf = f.readlines > f.close > > # Returning the pdf data > pdf > > end > > This code results in a corrupted PDF file. I checked the PDF itself > which shows some differences with a valid PDF file, like some missing > closing tags (endstream) - but I''m not an expert of that format. > > Well, my question is the following: am I doing it wrong, using a wrong > method, missing something, or wkhtmltopdf is more likely to be the > problem? > > I attached the corrupted file. > > If you have a look at it, you''ll notice that a PDF EOF symbol is there, > which tends to say that the generation was not interrupted in any way. > > Any idea? > > Thanks for your help! > > - Nicolas > > Attachments:http://www.ruby-forum.com/attachment/4453/corrupted.pdf > > -- > Posted viahttp://www.ruby-forum.com/.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
(reposted due to typo... ) Hi Nicolas, Whenever I generate pdfs from a rails app using wkhtmltopdf (or princexml), I usually call wkhtmltopdf using an app_url (ie wkhtmltopdf hits the web app to get the html/css/imgs/... to be used to gen the pdf), something like the following: # in some controller .... require ''timeout'' .. TIMEOUT_SECS = 5 ... def gen_pdf app_url = .... # the url to gen the pdf from. fname = .... # the name of the resulting pdf. ftype = "application/pdf" # combat shell injection? app_url = app_url.to_s.gsub(/["''\s`$;><&\|\(\)\\\[\]]/, '''') s = nil # valid url? unless (app_url =~ URI::regexp).nil? begin timeout(TIMEOUT_SECS) do # gen pdf from url. s = `wkhtmltopdf -q "#{app_url}" -`.chomp end rescue Exception => e ... # log, render/redirect err msg, ... end end # invalid pdf? if not s.to_s =~ /^%PDF/ ... # log, render/redirect err msg, .... end send_data(s, :type=>ftype, :filename=>fname); return end ... Jeff On Feb 1, 8:14 pm, Nicolas Rimbeau <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> As described on wkhtmltopdf Google group > (http://code.google.com/p/wkhtmltopdf/issues/detail?id=162), I have a > problem generating a PDF while using popen and wkhtmltopdf. > > wkhtmltopdf takes HTML code as input and ouputs a PDF file. Here is what > I''m doing: > > command = ''"C:\Program Files\wkhtmltopdf\wkhtmltopdf.exe" - - -q'' > IO.popen(command, ''r+'') do |f| > > # Writing the html previously rendered in a string > f.write(html_output) > f.close_write > > # Reading the ouput and closing > pdf = f.readlines > f.close > > # Returning the pdf data > pdf > > end > > This code results in a corrupted PDF file. I checked the PDF itself > which shows some differences with a valid PDF file, like some missing > closing tags (endstream) - but I''m not an expert of that format. > > Well, my question is the following: am I doing it wrong, using a wrong > method, missing something, or wkhtmltopdf is more likely to be the > problem? > > I attached the corrupted file. > > If you have a look at it, you''ll notice that a PDF EOF symbol is there, > which tends to say that the generation was not interrupted in any way. > > Any idea? > > Thanks for your help! > > - Nicolas > > Attachments:http://www.ruby-forum.com/attachment/4453/corrupted.pdf > > -- > Posted viahttp://www.ruby-forum.com/.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Thanks for your answer Jeff. I''ll give it a try in my own app and see whether it''s working or not. I''ll keep you posted! Cheers, - Nicolas -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.