RailsでHTMLをPDFに変換する方法
在 Ruby 和 Rails 中生成 PDF 的方法有很多种。您可能已经熟悉 HTML 和 CSS,因此我们将使用 PDFKit 通过标准 Rails 视图和样式代码中的 HTML 生成 PDF 文件。
PDFKit 简介
在内部,PDFKit 使用 wkhtmltopdf(WebKit HTML 到 PDF),这是一个引擎,它将采用 HTML 和 CSS,使用 WebKit 渲染它,并将其输出为高质量的 PDF。
首先,请在您的计算机上安装 wkhtmltopdf。您可以下载二进制文件或从 Mac 上的 Brew 或您首选的 Linux 存储库进行安装。
您还需要安装 pdfkit gem
,然后运行以下 Ruby 代码来生成包含文本“Hello Envato!”的 PDF
require "pdfkit" kit = PDFKit.new(<<-HTML) <p>Hello Envato!</p> HTML kit.to_file("hello.pdf")
您应该有一个名为 hello.pdf 的新文件,其文本位于顶部。
PDFKit 还允许您从 URL 生成 PDF。如果您想从 Google 主页生成 PDF,您可以运行:
require "pdfkit" PDFKit.new('https://www.google.com', :page_size => 'A3').to_file('google.pdf')
如您所见,我指定了 page_size
— 默认情况下使用 A4。您可以在此处查看完整的选项列表。
使用 CSS 设置 PDF 样式
之前我提到过我们将使用 HTML 和 CSS 生成 PDF 文件。在此示例中,我添加了一些 CSS 来设置示例发票的 HTML 样式,如您所见:
require "pdfkit" kit = PDFKit.new(<<-HTML) <style> * { color: grey; } h1 { text-align: center; color: black; margin-bottom: 100px; } .notes { margin-top: 100px; } table { width: 100%; } th { text-align: left; color: black; padding-bottom: 15px; } </style> <h1 id="Envato-Invoice">Envato Invoice</h1> <table> <thead> <tr> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> <tr> <td>Monthly Subscription to Tuts+</td> <td>$15</td> </tr> </tbody> </table> <div class="notes"> <p><strong>Notes:</strong> This invoice was paid on the 23rd of March 2016 using your credit card ending on 1234.</p> </div> HTML kit.to_file("envato_invoice.pdf")
如果运行此脚本,将生成文件envato_invoice.pdf。这张照片显示了样本发票的结果:
如您所见,如果您已经熟悉 HTML 和 CSS,则 PDFKit 非常易于使用。您可以根据需要继续自定义此文档或设计其样式。
在 Rails 应用程序中使用 PDFKit
现在让我们看看如何在 Rails 应用程序上下文中使用 PDFKit,以便我们可以使用模型中的数据动态生成 PDF 文件。在本节中,我们将构建一个简单的 Rails 应用程序来动态生成之前的“Envato Invoice”。首先创建一个新的 Rails 应用程序并添加三个模型:
$ rails new envato_invoices $ cd envato_invoices $ rails generate model invoice date:date client notes $ rails generate model line_item description price:float invoice:references $ rake db:migrate
现在,我们必须向数据库添加一些示例数据。将此代码片段添加到 db/seeds.rb
。
line_items = LineItem.create([ { description: 'Tuts+ Subscription April 2016', price: 15.0 }, { description: 'Ruby eBook', price: 9.90} ]) Invoice.create( client: 'Pedro Alonso', total: 24.90, line_items: line_items, date: Date.new(2016, 4, 1))
在终端中运行 rake db:seed
将示例发票添加到数据库中。
我们还对在应用程序中生成发票列表和一张发票的详细信息感兴趣,因此使用 Rails 生成器,运行 railsgeneratecontrollerInvoicesindexshow
来创建控制器和视图。< /p>
app/controllers/invoices_controller.rb
class InvoicesController < ApplicationController def index @invoices = Invoice.all end def show @invoice = Invoice.find(params[:id]) end end
app/views/invoices/index.html.erb
<h1 id="Invoices">Invoices</h1> <ul> <% @invoices.each do |invoice| %> <li> <%= link_to "#{invoice.id} - #{invoice.client} - #{invoice.date.strftime("%B %d, %Y")} ", invoice_path(invoice) %> </li> <% end %> </ul>
我们需要修改rails路由以默认重定向到InvoicesController
,因此编辑config/routes.rb
:
Rails.application.routes.draw do root to: 'invoices#index' resources :invoices, only: [:index, :show] end
启动 rails server
并导航到 localhost:3000 以查看发票列表:
app/views/invoices/show.html.erb
<div class="invoice"> <h1 id="Envato-Invoice">Envato Invoice</h1> <h3 id="To-invoice-client">To: <%= @invoice.client %></h3> <h3 id="Date-invoice-date-strftime-B-d-Y">Date: <%= @invoice.date.strftime("%B %d, %Y") %></h3> <table> <thead> <tr> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> <% @invoice.line_items.each do |line_item| %> <tr> <td><%= line_item.description %></td> <td><%= number_to_currency(line_item.price) %></td> </tr> <% end %> <tr class="total"> <td style="text-align: right">Total: </td> <td><%= number_to_currency(@invoice.total) %></span></td> </tr> </tbody> </table> <% if @invoice.notes %> <div class="notes"> <p><strong>Notes:</strong> <%= @invoice.notes %></p> </div> <% end %> </div>
此发票详细信息页面的 CSS 已移至 app/assets/stylesheets/application.scss
.invoice { width: 700px; max-width: 700px; border: 1px solid grey; margin: 50px; padding: 50px; h1 { text-align: center; margin-bottom: 100px; } .notes { margin-top: 100px; } table { width: 90%; text-align: left; } th { padding-bottom: 15px; } .total td { font-size: 20px; font-weight: bold; padding-top: 25px; } }
然后,当您点击主列表页面中的发票时,您将看到详细信息:
此时,我们已准备好向 Rails 应用程序添加查看或下载 PDF 格式的发票的功能。< /p>
处理 PDF 渲染的 InvoicePdf 类
为了将 Rails 应用中的发票呈现为 PDF,我们需要将三个 gem 添加到 Gemfile 中:PDFKit、render_anywhere 和 wkhtmltopdf-binary。默认情况下,rails 只允许您从控制器渲染模板,但通过使用 render_anywhere
,我们可以从模型或后台作业渲染模板。
gem 'pdfkit' gem 'render_anywhere' gem 'wkhtmltopdf-binary'
为了不让太多逻辑污染我们的控制器,我将在 app/models
文件夹中创建一个新的 InvoicePdf
类,以将逻辑包装到生成 PDF。
require "render_anywhere" class InvoicePdf include RenderAnywhere def initialize(invoice) @invoice = invoice end def to_pdf kit = PDFKit.new(as_html, page_size: 'A4') kit.to_file("#{Rails.root}/public/invoice.pdf") end def filename "Invoice #{invoice.id}.pdf" end private attr_reader :invoice def as_html render template: "invoices/pdf", layout: "invoice_pdf", locals: { invoice: invoice } end end
此类只是将发票作为类构造函数的参数进行渲染。私有方法 as_html
是 读取视图模板 invoices/pdf
和 layout_pdf
我们用来生成需要渲染为 PDF 的 HTML。最后,方法 to_pdf
使用 PDFKit 将 PDF 文件保存在 Rails 公共文件夹中。
您可能希望在实际应用程序中生成动态名称,以便 PDF 文件不会被意外覆盖。您可能也希望将文件存储在 AWS S3 或私有文件夹上,但这超出了本教程的范围。
/app/views/invoices/pdf.html.erb
<div class="invoice"> <h1 id="Envato-Invoice">Envato Invoice</h1> <h3 id="To-invoice-client">To: <%= invoice.client %></h3> <h3 id="Date-invoice-date-strftime-B-d-Y">Date: <%= invoice.date.strftime("%B %d, %Y") %></h3> <table> <thead> <tr> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> <% invoice.line_items.each do |line_item| %> <tr> <td><%= line_item.description %></td> <td><%= number_to_currency(line_item.price) %></td> </tr> <% end %> <tr class="total"> <td style="text-align: right">Total: </td> <td><%= number_to_currency(invoice.total) %></span></td> </tr> </tbody> </table> <% if invoice.notes %> <div class="notes"> <p><strong>Notes:</strong> <%= invoice.notes %></p> </div> <% end %> </div>
/app/views/layouts/invoice_pdf.erb
<!DOCTYPE html> <html> <head> <title>Envato Invoices</title> <style> <%= Rails.application.assets.find_asset('application.scss').to_s %> </style> </head> <body> <%= yield %> </body> </html>
在此布局文件中需要注意的一件事是我们正在布局中渲染样式。如果我们以这种方式呈现样式,WkHtmlToPdf 确实会工作得更好。
用于呈现 PDF 发票的 DownloadsController
此时我们需要一个调用类 InvoicePdf
的路由和控制器来将 PDF 文件发送到浏览器,因此编辑 config/routes.rb
添加嵌套资源:
Rails.application.routes.draw do root to: "invoices#index" resources :invoices, only: [:index, :show] do resource :download, only: [:show] end end
如果我们运行 rake paths
,我们会看到应用程序中可用的路由列表:
Prefix Verb URI Pattern Controller#Action root GET / invoices#index invoice_download GET /invoices/:invoice_id/download(.:format) downloads#show invoices GET /invoices(.:format) invoices#index invoice GET /invoices/:id(.:format) invoices#show
添加 app/controllers/downloads_controller.rb
:
class DownloadsController < ApplicationController def show respond_to do |format| format.pdf { send_invoice_pdf } end end private def invoice_pdf invoice = Invoice.find(params[:invoice_id]) InvoicePdf.new(invoice) end def send_invoice_pdf send_file invoice_pdf.to_pdf, filename: invoice_pdf.filename, type: "application/pdf", disposition: "inline" end end
如您所见,当请求请求 PDF 文件时,方法 send_invoice_pdf
正在处理该请求。方法 invoice_pdf
只是通过 id 从数据库中查找发票,并创建 InvoicePdf 的实例。那么 send_invoice_pdf
只是调用方法 to_pdf
,将生成的 PDF 文件发送到浏览器。
需要注意的一点是,我们将参数 disposition: "inline"
传递给 send_file
。该参数是将文件发送到浏览器,并显示出来。如果您想强制下载文件,则需要传递 disposition: "attachment"
。
向发票显示模板 app/views/invoices/show.html.erb
添加下载按钮:
<%= link_to "Download PDF", invoice_download_path(@invoice, format: "pdf"), target: "_blank", class: "download" %>
运行应用程序,导航到发票详细信息,单击下载,然后将打开一个新选项卡,显示 PDF 发票。
在开发中将 PDF 渲染为 HTML
当您处理 PDF 标记时,每次想要测试更改时都必须生成 PDF,有时可能会很慢。因此,能够以纯 HTML 形式查看将转换为 PDF 的 HTML 非常有用。我们只需要编辑/app/controllers/downloads_controller.rb
即可。
class DownloadsController < ApplicationController def show respond_to do |format| format.pdf { send_invoice_pdf } if Rails.env.development? format.html { render_sample_html } end end end private def invoice Invoice.find(params[:invoice_id]) end def invoice_pdf InvoicePdf.new(invoice) end def send_invoice_pdf send_file invoice_pdf.to_pdf, filename: invoice_pdf.filename, type: "application/pdf", disposition: "inline" end def render_sample_html render template: "invoices/pdf", layout: "invoice_pdf", locals: { invoice: invoice } end end
现在 show
方法也在开发模式下响应 HTML 请求。 PDF 发票的路径类似于 http://localhost:3000/invoices/1/download.pdf。如果您将其更改为 http://localhost:3000/invoices/1/download.html,您将看到 HTML 格式的发票,其中使用了用于生成 PDF 的标记。
根据上面的代码,假设您熟悉 Ruby 语言和 Rails 框架,使用 Ruby on Rails 生成 PDF 文件非常简单。也许整个过程最好的一点是您不必学习任何新的标记语言或有关 PDF 生成的细节。
我希望本教程是有用的。请在评论中留下任何问题、评论和反馈,我很乐意跟进。
以上がRailsでHTMLをPDFに変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











WeChat は主流のチャット ツールの 1 つであり、WeChat を通じて新しい友人に出会ったり、古い友人に連絡したり、友人間の友情を維持したりすることができます。永遠に終わらない宴会など存在しないように、人間同士が仲良くなれば必ず意見の相違が生じます。ある人があなたの気分に極度に影響を与える場合、または仲良くなったときに意見が一致しないことがわかり、コミュニケーションが取れなくなった場合、WeChat の友人を削除する必要がある場合があります。 WeChatの友達を削除するにはどうすればよいですか? WeChat友達を削除する最初のステップ:WeChatメインインターフェースで[アドレス帳]をタップします; 2番目のステップ:削除したい友達をクリックして[詳細]を入力します; 3番目のステップ:上部の[...]をクリックします右隅; ステップ 4: 下の [削除] をクリックします; ステップ 5: ページのプロンプトを理解した後、[連絡先を削除] をクリックします;

トマト ノベルは非常に人気のある小説閲覧ソフトウェアです。トマト ノベルでは、新しい小説や漫画を読むことができます。どの小説も漫画もとても面白いです。小説を書きたい友達もたくさんいます。お小遣いを稼いで、小説の内容を編集することもできます。 「テキストに文章を書きたいです。それで、小説はどうやって書くのですか?友達は知らないので、一緒にこのサイトに行きましょう。小説の書き方の入門を少し見てみましょう。」 Tomato Novels を使用して小説を書く方法に関するチュートリアルを共有します。 1. まず、携帯電話で Tomato Free Novels アプリを開き、パーソナル センター - ライター センターをクリックします。 2. Tomato Writer Assistant ページに移動し、次の場所で [新しい本の作成] をクリックします。小説の終わり

Colorful マザーボードは中国国内市場で高い人気と市場シェアを誇っていますが、Colorful マザーボードのユーザーの中には、設定のために BIOS を入力する方法がまだ分からない人もいます。この状況に対応して、編集者はカラフルなマザーボード BIOS に入る 2 つの方法を特別に提供しました。ぜひ試してみてください。方法 1: U ディスク起動ショートカット キーを使用して、U ディスク インストール システムに直接入ります。ワンクリックで U ディスクを起動する Colorful マザーボードのショートカット キーは ESC または F11 です。まず、Black Shark インストール マスターを使用して、Black Shark インストール マスターを作成します。 Shark U ディスク起動ディスクを選択し、コンピュータの電源を入れます。起動画面が表示されたら、キーボードの ESC キーまたは F11 キーを押し続けて、起動項目を順次選択するウィンドウに入ります。「USB」の場所にカーソルを移動します。 」と表示され、その後

残念ながら、WeChat は広く使用されているソーシャル ソフトウェアであり、何らかの理由で特定の連絡先を誤って削除してしまうことがよくあります。ユーザーがこの問題を解決できるように、この記事では、削除された連絡先を簡単な方法で取得する方法を紹介します。 1. WeChat の連絡先削除メカニズムを理解します。これにより、削除された連絡先を取得できるようになります。WeChat の連絡先削除メカニズムでは、連絡先がアドレス帳から削除されますが、完全には削除されません。 2. WeChat の組み込みの「連絡先帳復元」機能を使用します。WeChat には、この機能を通じて以前に削除した連絡先をすばやく復元できる「連絡先帳復元」機能が用意されています。 3. WeChat 設定ページに入り、右下隅をクリックし、WeChat アプリケーション「Me」を開き、右上隅にある設定アイコンをクリックして設定ページに入ります。

携帯電話が人々の日常生活において重要なツールになるにつれて、フォント サイズの設定は重要なパーソナライゼーション要件になりました。さまざまなユーザーのニーズを満たすために、この記事では、簡単な操作で携帯電話の使用体験を向上させ、携帯電話のフォントサイズを調整する方法を紹介します。携帯電話のフォント サイズを調整する必要があるのはなぜですか - フォント サイズを調整すると、テキストがより鮮明で読みやすくなります - さまざまな年齢のユーザーの読書ニーズに適しています - フォント サイズを使用すると、視力の悪いユーザーにとって便利です携帯電話システムの設定機能 - システム設定インターフェイスに入る方法 - 設定インターフェイスで「表示」オプションを見つけて入力します。 - 「フォント サイズ」オプションを見つけて、サードパーティでフォント サイズを調整します。アプリケーション - フォント サイズの調整をサポートするアプリケーションをダウンロードしてインストールします - アプリケーションを開いて、関連する設定インターフェイスに入ります - 個人に応じて

Win11 管理者権限の取得方法のまとめ. Windows 11 オペレーティング システムでは、管理者権限は、ユーザーがシステム上でさまざまな操作を実行できるようにする非常に重要な権限の 1 つです。ソフトウェアのインストールやシステム設定の変更など、一部の操作を完了するために管理者権限の取得が必要になる場合があります。以下にWin11の管理者権限を取得する方法をまとめましたので、お役に立てれば幸いです。 1. ショートカット キーを使用する Windows 11 システムでは、ショートカット キーを使用してコマンド プロンプトをすばやく開くことができます。

テクノロジーの発展に伴い、モバイルゲームは人々の生活に欠かせないものになりました。かわいいドラゴンエッグの画像と面白い孵化過程で多くのプレイヤーの注目を集めており、その中でも注目を集めているゲームの一つがモバイル版ドラゴンエッグです。プレイヤーがゲーム内で自分のドラゴンをより適切に育成し成長させることができるように、この記事ではモバイル版でドラゴンの卵を孵化させる方法を紹介します。 1. 適切な種類のドラゴン エッグを選択する プレイヤーは、ゲーム内で提供されるさまざまな種類のドラゴン エッグの属性と能力に基づいて、自分に適したドラゴン エッグの種類を慎重に選択する必要があります。 2. 孵化機のレベルをアップグレードします。プレイヤーはタスクを完了し、小道具を収集することで孵化機のレベルを向上させる必要があります。孵化機のレベルは孵化速度と孵化成功率を決定します。 3. プレイヤーはゲームに参加する必要がある孵化に必要なリソースを収集します。

Oracleバージョンのクエリ方法を詳しく解説 Oracleは、世界で最も人気のあるリレーショナルデータベース管理システムの1つで、豊富な機能と強力なパフォーマンスを提供し、企業で広く使用されています。データベースの管理と開発のプロセスでは、Oracle データベースのバージョンを理解することが非常に重要です。この記事では、Oracle データベースのバージョン情報をクエリする方法と具体的なコード例を詳しく紹介します。単純な SQL ステートメントを実行して、Oracle データベース内の SQL ステートメントのデータベース バージョンをクエリします。
