# html2pdf-rails
PDF generator (from HTML) gem for Ruby on Rails.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'html2pdf-rails'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install html2pdf-rails
## Usage
### Basic Usage
Controller
```ruby
class ThingsController < ApplicationController
def show
respond_to do |format|
format.html
format.pdf do
render_to_pdf pdf: 'file_name' # Excluding ".pdf" extension.
end
end
end
end
```
Layout
```haml
!!!
%html
%head
%meta{ charset: 'utf-8' }
= html2pdf_base_tag
= stylesheet_link_tag 'pdf', media: 'all'
%body
#header= image_tag 'logo.jpg'
#content= yield
```
### Put PDF to Cloud Storage and return signed url
You can get signed url of Cloud Storage if your Cloud Funciton code support it.
```ruby
pdf_url = render_pdf_and_get_url pdf: 'file_name'
redirect_to pdf_url
```
### Advanced Usage with all available options
```ruby
class ThingsController < ApplicationController
def show
respond_to do |format|
format.html
format.pdf do
render_to_pdf(
pdf: 'file_name', # Excluding ".pdf" extension.
disposition: 'attachment', # default 'inline'
template: 'things/show',
layout: 'pdf', # for a pdf.pdf.erb file
show_as_html: params.key?('debug'), # allow debugging based on url param
pdf_options: { # SEE: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions
margin: {
top: '30px'
bottom: '30px',
}
}
)
end
end
end
end
```
### Cloud Functions for Firebase Sample
```javascript
const functions = require("firebase-functions");
const puppeteer = require("puppeteer");
const runOptions = {
timeoutSeconds: 20,
memory: "1GB"
};
exports.html2pdf = functions
.runWith(runOptions)
.https.onRequest(
async ({ method, body: { html = "", putToStorage = false, pdfOptions = {} } }, res) => {
const browser = await puppeteer.launch({
headless: true,
args: ["--no-sandbox"]
});
const page = await browser.newPage();
await page.emulateMedia("print");
await page.goto("data:text/html;charset=UTF-8," + html, {
waitUntil: "networkidle0"
});
const pdf = await page.pdf(pdfOptions);
if (putToStorage) {
// Code for Cloud Storage is omitted.
} else {
res.header({ "Content-Type": "application/pdf" });
res.send(pdf);
}
}
);
```
## Configuration
In `config/initializers/html2pdf_rails.rb`, you can configure the following values.
```ruby
Html2Pdf.configure do |config|
config.endpoint = 'YOUR_HTTP_TRIGGER_ENDPOINT'
end
```
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/SonicGarden/html2pdf-rails. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).