Ruby On Rails Wiki 列出了几个有助于在Rails中生成PDF的库。我需要打印出地址标签(以字母格式,因此每页 12-15 个地址)并且无法决定使用哪一个。有什么建议吗?
10 回答
到目前为止我见过的最好的是虾:
对虾肯定是Prawnto。DSL 是一种真正的享受,就像在 respond_to 格式块中能够将 PDF 视为任何其他格式一样简单:
respond_to do |format|
format.pdf { render :layout => false }
这里有一个关于虾的教程视频:
大虾是要走的路。现在有了虾标签,这真的很容易做到。
在此处查看项目的 README:
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"
如果您没有做任何太复杂的事情,您还可以使用 HTMLDOC,它将基本的 HTML 转换为 PDF。这使您不必学习更多专有的布局语法(例如在 Prawn 的情况下)。它可能会为您省去一些麻烦:)
这是 HTMLDOC 的 ruby gem 的链接:
此外,这里是使用 HTMLDOC 将 rails 中的视图呈现为 pdf 的一个很好的指南:
还有PDFKit。这也很有趣。
我同时使用了 PDF::Writer 和 Prawn,发现 Prawn 使用起来更愉快。查看Ruby Mendicant进行比较,以展示 Prawn w/r/t PDF::Writer 的乐趣。
实际上,不管怎样,只要看看 Ruby Mendicant 就可以找到适合作为开发人员谋生的伟大设计模式。
虽然不完全是 ruby,但您可以使用 OpenOffice .odt 通过结合 serenity 和 docsplit 来生成 PDF。
http://github.com/kremso/serenity
http://documentcloud.github.com/docsplit/
或者您可以使用使用 odt 和 cups-pdf 的 clamsy gem 来生成 PDF。
对于您的用例,我同意大多数其他prawn
正确选择的答案,因为您需要对输出进行像素级控制。
要生成带有内置(自有)表格样式、标题等的 PDF 报告,您可以使用report
gem - 查看Generate pdf from Rails 3 - 选择什么工具?有关如何使用的示例。
我使用飞碟从 html 生成 pdf。它是一个 java 库,但您可以使用 Ruby-Java Bridge gem 在您的 rails 应用程序中访问它。它与 css 2.1 兼容,并从 css3 中添加了一些内容,以允许对分页进行一些额外的控制。我推荐它,因为它不需要您在 html 中放置“pdf 代码”,您可以使用相同的视图和部分显示到浏览器,就像生成 pdf 一样。
飞碟:https ://github.com/flyingsaucerproject/flyingsaucer
Ruby Java 桥: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