web-dev-qa-db-ja.com

生成PDFからRails

Ruby on Rails Wikiはいくつかのライブラリをリストします s[〜#〜] pdf [〜#〜]Railsでの生成アドレスラベル(レター形式、つまり1ページあたり12〜15個のアドレス)を印刷する必要がありますどちらを使用するか決定できません。

37
Sebastian
42
Marston A.

確かにエビとエビ。 DSLは本当の扱いであり、PDFをresponse_to形式ブロック内の他の形式として扱うことができるという単純さもそうです:

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

エビのチュートリアルビデオ here

9
btw

RTeX もあります。最初に LaTeX に翻訳するつもりなら、それはうまくいきます。 LaTeXはマークアップされたドキュメントを保存するための非常に良い方法です。それは、各ドキュメントの静的度に依存します。ドキュメントの大部分が動的である場合は、PrawnまたはPDF :: Writerを使用することをお勧めします。そのほとんどが静的で、それぞれにテキスト置換が2、3しかない場合は、LaTeXの方が適している可能性があります。

3
James A. Rosen

PDFKit もあります。なかなか面白いです。

2
babttz

複雑すぎない場合は、基本的なHTMLをPDFに変換するHTMLDOCを使用することもできます。これにより、(エビの場合のように)独自のレイアウト構文を学ぶ必要がなくなります。それはあなたにいくつかの頭痛を救うかもしれません:)

これは、HTMLDOCのRuby gemへのリンクです。

また、RailsでHTMLDOCを使用してPDFにビューをレンダリングするための良いガイドは次のとおりです。

2
dhulihan

エビは行く方法です。本当に簡単なエビのラベルが付いた。

プロジェクトの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"
2
Jordan

私はPDF :: Writerとエビの両方を使用しましたが、エビの方がはるかに快適です。 Ruby Mendicant をチェックして、PDF :: Writerを使用したエビの喜びを示す comparison を確認してください。

実際には、Rubyとにかくメンディカントをチェックして、すばらしい デザインパターン の開発者としての正しい生計を求めてください。

1
Abie

私はHTMLからPDFを生成するために空飛ぶ円盤を使用しました。これはJavaライブラリですが、Ruby-Java Bridge gemを使用してRailsアプリでアクセスできます。css2.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
0
theirongiant

あなたのユースケースでは、出力をピクセルレベルで制御する必要があるため、 prawn が正しい選択であるという他のほとんどの回答に同意します。

PDF組み込みの(意見)テーブルスタイル、ヘッダーなどを含むレポートを生成するために、 report gem-check out-を使用できます。 Rails 3-どのツールを選択するか? からPDFを生成する方法の例については、.

0
Seamus Abshere

完全にRubyではありませんが、OpenOffice .odtを使用して、静寂とdocsplitを組み合わせてPDFを生成できます。

http://github.com/kremso/serenity

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

または、odtとcups-pdfを使用してPDFを生成するぎこちない宝石を使用することもできます。

http://github.com/ngty/clamsy

0
JasonOng