Quick Guide to PDF generation in Ruby
Tags: ruby, beginners, html, css
Published: 2020-11-30 21:05:31

I recently learned about some additional controller functionality that expanded beyond the simple `render 'view'` that I used in my first Rails project.  Since my project had to do with generating lists for a user, I was understandably excited when I learned about the `send_file` method.  The possibility of sending a user data via a PDF was always a stretch-goal, but I had no idea where to start.

Though the `send_file` method gave me a good starting point, I still had a huge issue: ***how do I create a custom PDF?***

Luckily, with some google-magic, I stumbled on some great articles that helped me out, particularly [this great video from Upcase] (https://thoughtbot.com/upcase/videos/generating-pdfs-with-rails).  We're going to look specifically at creating custom PDFs, but I'd highly suggest checking out the video for a more in-depth look at adding this to your own Rails project

### Where We're Going

We're going to take a look at the process for setting up creating a custom PDF in Ruby, including:
* The tools/gem dependencies needed
* How to use the tools to generate a simple test PDF
* Customizing the layout/data of your PDF

### Tools / Gems

To get started, we are going to need to install wkhtmltopdf.  In your terminal, use brew to complete the install process:

```Bash
$ brew install --cask wkhtmltopdf
```

**wkhtmltopdf** is a straightforward tool that works by taking HTML and CSS, and converting it into a PDF document.

Unfortunately, wkhtmltopdf cannot be used directly in our Ruby application.  This is where we will need the `PDFKit` gem.  Either install globally, or add it to your gemfile in a rails application:

```Bash
$ gem install pdfkit
```

### Generating a simple test PDF

**PDFKit** allows us access to very simply take a string of HTML code, and convert it into a PDF document, that we can download to a file location.

```Ruby
require 'pdfkit'

def generate_pdf_from_html(html, route)
    kit = PDFKit.new(html)
    kit.to_file(route)
end
```

With our basic PDF converter method defined, let's give it some data and see what happens!

```Ruby
html = '<h1>Hello, Globe!</h1>'
route = './hello.pdf'

generate_pdf_from_html(html, route)
```

Running this application, I now should have a *new* pdf document in the current directory with the name **hello.pdf**:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mxa5z69z2n9s2tx3oraw.gif)

### Spruce things up with CSS!

The great thing about this process is that **wkhtmltopdf** and **PDFKit** can take any viable HTML and convert it to PDF format.  Let's take advantage of that by adding `<style>` to the head of our HTML!

```Ruby
html = "
    <head>
        <style>
            body {
                text-align: center;
                background-color: gray;
            }
            h1 {
                color: white;
            }
        </style>
    </head>
    <body>
        <h1>Doggos are cool</h1>
        <p>I like doggos, they are very cool.</p>
    </body
    "
```

Now if we run our application again, we will get a stylized PDF as the result!

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/pufrztxavsrwpmhdohjr.png)

Keep in mind, these all default to an 8.5 x 11 document, which is convenient for if we want to make anything printable!

I hope this helps add a nifty tool to your belt.  Again, I would highly suggest watching [this video from Upcase] (https://thoughtbot.com/upcase/videos/generating-pdfs-with-rails), which gives an in-depth look at integrating this functionality into a Rails application.

Cheers.