web-dev-qa-db-ja.com

Rails:HTMLをPDFに変換しますか?

ColdFusionでCFDOCUMENTを使用するのと同様に、HTMLを取得してPDFに変換する最良かつ最も簡単な方法は何ですか?

PDATE:これまでに人々から寄せられたすべてのコメントと提案に感謝しますが、答えを残した人々はポイントを失っていると感じています。

1)ソリューションは無料またはオープンソースでなければなりません。 1人はpricexmlを使用し、もう1人はpd4mlを使用することを提案しました。これらのソリューションはどちらもお金がかかります(pricexmlには腕と脚がかかります)。

2)htmlを(ファイル、url、または文字列変数から)取り込み、pdfを生成できる必要があります。エビ、rprf、rtexなどのライブラリは、htmlを取り込まずに独自のメソッドを使用して生成されます。

提案に感謝しているとは思わないでください。ColdFusionを使用しているがRailsに変換したい人にとっては、pdf生成は本当に問題のように思えます。

60
rip747

Gem WickedPDF は、exactlyを行います。

64
Sebastian

今日の最大のことは、この仕事のためのPDFKitです。

14
fl00r

WickedPDFを試す 、PDFジェネレーター(HTMLから))プラグイン。

ここに例があります

gem 'wicked_pdf'  
gem 'wkhtmltopdf-binary' 
#wicked_pdf is a wrapper for wkhtmltopdf, you'll need to install that, too

あなたのコントローラーで(私はあなたがshowメソッドにいると仮定しました):

    respond_to  do |format|
      format.html
      format.pdf do
        pdf = render_to_string :pdf => 'test',
                         layout: 'pdf.html.erb',
                         template: 'show.pdf.slim',
                         header: { :right => '[page] of [topage]'},
                         margin: {top: 0,
                                  bottom: 0,
                                  left: 0,
                                  right: 0},
                         outline: {outline: true,
                                   outline_depth: 2}
        end
     end

ビューでPDFリンク

= link_to 'Download Pdf', you_show_path(@uour_object, format: :pdf)

PDFを電子メールの添付ファイルで送信する場合は、まずPDFファイルをパブリックフォルダーまたは一時フォルダーに保存してから、メーラークラスに保存します(例:mailers/e_mailer.rb)

attachments["test.pdf"] = File.read(Rails.root.join('public',"test.pdf"))
mail(:to => to, :cc => cc , :subject => "subject")

メールを送信した後、ファイルを削除できます

File.delete(Rails.root.join("public", "test.pdf"))
11
Sajjad Murtaza

私はこの質問がこの時点でほぼ5歳であることを知っています。ただし、新しいオプションが利用可能です。

エビをお試しください! https://github.com/adeven/shrimp

3
Michael Irey

大量の汗と涙を流した後、かなりシンプルなRails= TinyMce を使用してユーザーがレターテンプレートを作成できるアプリを作成できました。 PDFドキュメントとして表示できます。

Wysiwygエディターのオプションを可能な限り制限することにしました。オプションのいくつかは期待どおりに動作しませんが、必要に応じてgsub-ingで解決できないものはありません。

必要なHTMLDOCをラップするRuby gemがあります。 PDF :: HTMLDoc

それが得られたら、MIMEタイプを登録して、次のようなことができます。

@letter_template = LetterTemplate.find(params[:id])

respond_to do |format|
      format.html
      format.pdf { send_data render_to_pdf({:action => 'show.rpdf',  :layout => 'pdf_report'}), :filename => @letter_template.name + ".pdf",  :disposition => 'inline' }
    end

アプリケーションコントローラーで、render_to_pdfメソッドを次のように追加しました。

def render_to_pdf(options =nil)
    data = render_to_string(options)
    pdf = PDF::HTMLDoc.new
    pdf.set_option :bodycolor, :white
    pdf.set_option :toc, false
    pdf.set_option :portrait, true
    pdf.set_option :links, false
    pdf.set_option :webpage, true
    pdf.set_option :left, '2cm'
    pdf.set_option :right, '2cm'
    pdf.set_option :footer, "../"
    pdf.set_option :header, "..."
    pdf.set_option :bottom, '2cm'
    pdf.set_option :top, '2cm'
    pdf << data
    pdf.generate
  end

Travis Bealeのリンク先のHTMLDOCサイトには、さらにドキュメントがあります。これがあなたの道を進むのを助け、あなたの文書が本当に複雑でなければ、それで十分であることを願っています。乗車方法をお知らせください。

2
tsdbrown

これに対する「解決策」として私が見つけた最も近いものは、JRubyを使用してから The Flying Saucer Project を使用することです。私はそれがRubyに移植されることを望んでいるので、それはネイティブな解決策になり得ます。

1
rip747
1
mat

プロジェクトは停滞しているかもしれませんが、ピサ(別名 XHTML2PDF )はPython libで、CSS + HTMLからPDFへの変換を行います。 Railsアプリをコマンドラインツールとして駆動することでしばらく前に-かなりうまくいきました。

0
Thomas

PDF https://grabz.it による解決策へのHTMLをお勧めします。

これらは非常に柔軟で使いやすいスクリーンショットAPIを備えており、どのタイプのRubyアプリケーションでも使用できます。

試してみたい場合は、最初に認証 アプリキー+シークレット および 開発無料SDK を取得する必要があります

次に、アプリでの実装手順は次のとおりです。

//initialization    
require 'grabzit'
grabzItClient = GrabzIt::Client.new("APPLICATION KEY", "APPLICATION SECRET")

//capturing the url to PDF
grabzItClient.url_to_pdf("http://www.google.com")   

次は保存です。 2つの保存方法のいずれかを使用できます。アクセス可能なコールバックハンドルが利用可能な場合はsave

grabzItClient.save("http://www.example.com/handler/index")  

そしてsave_to同期保存が必要な場合(スクリーンショットの作成中にアプリケーションを待機させる):

filepath = "images/result.jpg"
grabzItClient.save_to(filepath) 

保存について details のドキュメントを確認してください。

それで全部です。 image screenshots など、他の種類のスクリーンショットを取得することもできます。

0
Johnny