从Rails生成PDF

Ruby On Rails Wiki列出了一些便于在Rails中生成PDF 的库 。 我需要打印出地址标签(以字母格式,因此每页12-15个地址),不能决定使用哪一个。 任何build议?

大虾与虾确定。 DSL是一种真正的享受,就像在respond_to格式块中能够将PDF视为任何其他格式那样简单:

respond_to do |format| format.pdf { render :layout => false } 

这里有一个关于虾的教程video:

还有RTeX 。 如果你愿意先翻译成LaTeX的话,那效果很好。 LaTeX是一个非常好的方式来存储标记的文件。 这只取决于每个文档的静态。 如果大部分文档是dynamic的,那么使用Prawn或PDF :: Writer可能会更好。 如果它大部分是静态的,只需几个文本replace,LaTeX可能是一个更好的select。

如果你没有做太复杂的事情,你也可以使用HTMLDOC,它将基本的HTML转换成PDF。 这可以防止你学习更多的专有布局语法(例如在虾的情况下)。 这可能会节省你一些头痛:)

这里是HTMLDOC的ruby的链接:

另外,这里有一个很好的指南,用于使用HTMLDOC将轨道中的视图渲染为pdf:

还有PDFKit 。 这也很有趣。

我已经使用了PDF :: Writer和Prawn,并且find了更好用的虾。 查看Ruby Mendicant进行比较 ,以展示虾/ w / r / t PDF :: Writer的乐趣。

其实,无论如何,只要看看Ruby Mendicant是否有一个好的devise模式 ,作为一个开发者的正确生计。

虾是要走的路。 现在虾的标签很容易做到。

在这里查看项目的自述文件:

https://github.com/jordanbyron/prawn-labels#readme

这是一个在Rails控制器中使用的超级简单的例子。 不要忘记将gem 'prawn-labels'添加到您的Gemfile中。

 names = %w{Jordan Kelly Greg Bob} labels = Prawn::Labels.render(names, :type => "Avery5160") do |pdf, name| pdf.text name end send_data labels, :filename => "names.pdf", :type => "application/pdf" 

虽然不是完全的ruby,但可以使用OpenOffice .odt结合serenity和docsplit来生成PDF。

http://github.com/kremso/serenity

http://documentcloud.github.com/docsplit/

或者您可以使用使用odt和cups-pdf生成PDF的clamsy gem。

http://github.com/ngty/clamsy

对于你的用例,我同意大多数其他的答案, prawn是正确的select,因为你需要像素级别的输出控制。

为了生成带有内置(自定义)表格样式,标题等的PDF报告,您可以使用report gem – 检查Rails 3生成pdf – select什么工具? 为例子如何使用。

我用飞碟从HTML生成pdf。 这是一个Java库,但您可以使用Ruby-Java Bridge gem在您的Rails应用程序中访问它。 它符合css 2.1,并且有一些来自css3的附加function,允许对分页进行一些额外的控制。 我推荐它,因为它不要求你在你的html中join“pdf code”,你可以使用相同的视图和partials来显示给浏览器,就像你生成PDF一样。

飞碟: https : //github.com/flyingsaucerproject/flyingsaucer

Ruby Java Bridge: http : //rjb.rubyforge.org/

我使用这个模块代码来生成PDF文件

 require 'rubygems' require 'rjb' module Html2Pdf def self.included(controller) controller.send :helper_method, :create_pdf end def create_pdf(options = {}) itext = "#{RAILS_ROOT}/lib/html2pdf/jars/iText-2.0.8.jar" core_renderer = "#{RAILS_ROOT}/lib/html2pdf/jars/core-renderer.jar" xerces = "#{RAILS_ROOT}/lib/html2pdf/jars/xml-apis-xerces-2.9.1.jar" joinchar = (RUBY_PLATFORM.include? 'mswin') ? ';' : ':' classpath = [itext, core_renderer, xerces].join(joinchar) Rjb::load(classpath, jvmargs=['-Djava.awt.headless=true']) if options[:htmlstring].nil? options[:layout] ||= false options[:template] ||= File.join(controller_path,action_name+".pdf.erb") html_string = render_to_string(:template => options[:template], :layout => options[:layout]) else html_string = options[:htmlstring] end # Make all paths relative, on disk paths... html_string.gsub!(".com:/",".com/") # strip out bad attachment_fu URLs html_string.gsub!( /src=["']+([^:]+?)["']/i ) { |m| "src=\"file:///#{RAILS_ROOT}/public/" + $1 + '"' } # re-route absolute paths html_string.gsub!( /url\(["']+([^:]+?)["']/i ) { |m| "url\(\"file:///#{RAILS_ROOT}/public/" + $1 + '"' } # re-route absolute paths # Remove asset ids on images with a regex // tbh i can't remember what this line is for but i'm sure it did something awesome html_string.gsub!( /src=["'](\S+\?\d*)["']/i ) { |m| 'src="' + $1.split('?').first + '"' } filename = "#{RAILS_ROOT}/public/pdfs/"+options[:filename]+".pdf" fileOutputStream = Rjb::import('java.io.FileOutputStream') iTextRenderer = Rjb::import('org.xhtmlrenderer.pdf.ITextRenderer') renderer = iTextRenderer.new renderer.setDocumentFromString(html_string) os = fileOutputStream.new(filename) renderer.layout() renderer.createPDF(os) os.close() end end 

用这样的代码调用它:

 def generate_pdf htmlsrc = render_to_string(:partial => 'invoice', :layout => false) rnd = Time.now.to_s(:datentime).gsub!(/[\/ \.:]/,'') filename = "docstore/tmp_#{rnd}" create_pdf(:htmlstring => htmlsrc, :filename => filename) contents = open("#{RAILS_ROOT}/public/pdfs/#{filename}.pdf", "rb") { |io| io.read } File.delete("#{RAILS_ROOT}/public/pdfs/#{filename}.pdf") respond_to do | wants | wants.html { render :text => contents, :content_type => 'application/pdf' } end end