Ruby On Rails Wiki には、RailsでのPDF生成を容易にするいくつかのライブラリがリストされています。住所ラベルを印刷する必要があり (レター形式なので、1 ページあたり 12 ~ 15 の住所)、どれを使用するか決められません。推奨事項はありますか?
10 に答える
確かにエビとエビ。DSLは、PDFをrespond_to形式ブロック内の他の形式と同じように扱うことができるという単純さのように、本当の扱いです。
respond_to do |format|
format.pdf { render :layout => false }
ここにエビのチュートリアルビデオがあります:
PDFKitもあります。それもかなり面白いです。
あまり複雑なことをしていない場合は、基本的な HTML を PDF に変換する HTMLDOC を使用することもできます。これにより、(Prawn の場合のように) 独自のレイアウト構文をさらに学習する必要がなくなります。それはあなたの頭痛の種を救うかもしれません:)
HTMLDOC の ruby gem へのリンクは次のとおりです。
また、HTMLDOC を使用して rails でビューを pdf にレンダリングするための優れたガイドは次のとおりです。
エビは行く方法です。今では本当に簡単にエビのラベルを付けることができます。
ここでプロジェクトの 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"
あなたのユースケースでprawn
は、出力をピクセルレベルで制御する必要があるため、正しい選択である他のほとんどの回答に同意します。
組み込みの (独自の) テーブル スタイル、ヘッダーなどを使用して PDF レポートを生成するには、report
gemを使用できます。「 Rails 3 から PDF を生成する - どのツールを選択すればよいですか?」を参照してください。使い方の例。
完全に Ruby ではありませんが、OpenOffice .odt を使用して、serenity と docsplit を組み合わせることで PDF を生成できます。
http://github.com/kremso/serenity
http://documentcloud.github.com/docsplit/
または、odt と cups-pdf を使用して PDF を生成する clamsy gem を使用することもできます。
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