Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

There is no single “Ruby PDF SDK” that fits every project. Choose Prawn or HexaPDF when you want to define the PDF in Ruby. Choose PDFKit or Wicked PDF when your team already builds documents as HTML and CSS. HexaPDF is the better fit when you must also merge, inspect, encrypt, optimize, or otherwise manipulate existing PDFs; Wicked PDF is the Rails-oriented option in the HTML-to-PDF group.

This guide shows how each approach works, where its runtime dependencies matter, how to install it, and how to decide without relying on stale compatibility claims.

Choose the authoring model first

The most important decision is not the gem name. It is how your team wants to author and maintain the document.

Option Authoring model Best fit Runtime considerations
Prawn Ruby drawing and layout API New PDFs whose layout is controlled directly in Ruby Pure Ruby
HexaPDF Ruby PDF creation and document manipulation Creation plus merging, extraction, encryption, optimization, or other edits Pure Ruby
PDFKit HTML/CSS rendered by wkhtmltopdf Teams with existing HTML templates Gem plus an external wkhtmltopdf executable
Wicked PDF HTML/CSS rendered by wkhtmltopdf through a Rails integration Rails views and Rails asset workflows Gem, Rails integration, and wkhtmltopdf

A Ruby layout API gives you explicit control over coordinates, flow, fonts, and drawing. HTML conversion lets designers work with familiar templates and CSS, but introduces a browser-like conversion process and an executable that must exist in every deployment environment.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall

Prawn: direct PDF authoring in Ruby

Prawn is a pure-Ruby PDF writer. Its documented feature set includes text rendering, vector drawing, image embedding, TrueType fonts, encryption, headers and footers, and internationalization support. It is a strong starting point when the PDF itself—not an HTML page—is your source format.

Install Prawn

gem install prawn

In a Bundler application, add gem "prawn" to your Gemfile and run bundle install. Resolve the gem version against the Ruby version used by development, CI, and production.

Minimal document

require "prawn"

Prawn::Document.generate("hello.pdf") do
  text "Hello World!"
end

Prawn::Document.generate writes the file after the block completes. Treat the block as the document definition: create headings, paragraphs, tables, images, and page decorations there.

A more realistic invoice-style example

require "prawn"

Prawn::Document.generate("invoice.pdf", page_size: "A4", margin:  Forty = 40) do
  font_size 20
  text "Invoice 1007", style: :bold
  move_down 12

  font_size 11
  text "Acme Example Ltd."
  text "Issued: 2026-09-29"
  move_down 18

  data = [
    ["Description", "Qty", "Unit", "Total"],
    ["Consulting", "2", "$150", "$300"],
    ["Support", "1", "$75", "$75"]
  ]

  table(data, header: true, width: bounds.width) do
    row(0).font_style = :bold
    columns(1..3).align = :right
  end

  move_down 18
  text "Subtotal: $375", align: :right
end

Replace the illustrative values with your own data and test the output with the fonts, languages, and page lengths your application actually receives. Long unbroken strings, wide tables, and missing glyphs are common causes of layout surprises.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

HexaPDF: create and manipulate PDF documents

HexaPDF is also a pure-Ruby library, but its scope extends beyond writing a new file. It is relevant when a workflow must create PDFs and then merge pages, extract content, apply encryption, optimize files, or make other document-level changes.

Version and Ruby compatibility

A HexaPDF 1.7.0 RubyGems listing required Ruby 2.7 or newer, while the same listing showed later releases through 1.9.1. Those facts are historical listing details, not a guarantee for the current release. Check the selected version’s gem metadata and changelog before pinning it.

Use it when post-processing is part of the job

  • Generate a document, then merge it with an existing PDF.
  • Inspect or extract content from an incoming PDF.
  • Apply document encryption or optimize output as a final pipeline step.
  • Keep the entire workflow in Ruby instead of invoking an HTML renderer.

The exact API depends on the HexaPDF release you select. Read that release’s documentation and run a small fixture through creation, manipulation, and output validation before migrating production documents.

PDFKit and Wicked PDF: HTML/CSS through wkhtmltopdf

PDFKit and Wicked PDF take a different route: they pass HTML to wkhtmltopdf, which uses WebKit to render the page into a PDF. This is attractive when your application already has stable HTML templates and CSS styling.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

PDFKit

PDFKit documents installing both the Ruby gem and wkhtmltopdf. Your deployment therefore has two versioned components: the Ruby dependency and the external executable. Verify that the executable is installed, discoverable, and permitted to run in containers, workers, and production hosts.

Wicked PDF

Wicked PDF is specifically a Rails integration. It describes saving HTML and assets to temporary files and then executing wkhtmltopdf. That makes Rails view integration convenient, but it also means asset paths, temporary-directory permissions, and executable availability are part of reliability.

Compatibility claims are bounded

The PDFKit README listed Ruby 2.5–3.1 and Rails 4.2–7.0. Wicked PDF said it had been verified with Ruby 2.2–3.2 and Rails 4–7.0. These are project statements for the cited documentation, not promises about today’s releases. Recheck the current README, gem metadata, and your exact Rails version before adopting either library.

How to decide between the four

Pick Prawn when Ruby is the source of truth

Use Prawn for reports, receipts, certificates, and other layouts that are naturally expressed as a sequence of Ruby drawing and flow operations. You avoid an external renderer and can keep deployment simple.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Pick HexaPDF when the workflow includes existing files

If your requirements include merging, extraction, encryption, optimization, or other manipulation, HexaPDF’s broader document scope is a better match than a generator-only API.

Pick PDFKit when you need generic HTML conversion

PDFKit is suitable when HTML/CSS templates are shared with a web experience or maintained by a front-end-oriented team. Budget for wkhtmltopdf installation, resource loading, and process supervision.

Pick Wicked PDF for Rails views

Wicked PDF is the natural candidate when the source is a Rails view and you want Rails-specific integration. Confirm that the gem, Rails release, Ruby release, and wkhtmltopdf build work together.

Do not choose on license or maintenance assumptions

The available project material does not establish a current apples-to-apples license comparison, maintenance health, security status, or production suitability. Before adoption, inspect the selected version’s license text, release history, dependency tree, security advisories, and issue tracker.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Installation and deployment checklist

  1. Record the Ruby, Rails, operating-system, and container versions that will run the job.
  2. Pin the gem version in your Gemfile or gemspec and resolve dependencies in CI.
  3. For PDFKit or Wicked PDF, install the matching wkhtmltopdf executable in every runtime that generates PDFs.
  4. Verify fonts, image files, stylesheets, and other assets are available from the PDF worker’s network and filesystem context.
  5. Generate representative documents in CI, including long tables, page breaks, non-ASCII text, images, and empty data sets.
  6. Open the resulting files with a PDF parser or validator and check page count, metadata, text extraction, and expected visual output.
  7. Apply resource limits and timeouts around background jobs; a renderer that waits on an unreachable asset should not hold a worker forever.

Troubleshooting common failures

“Command not found” or executable errors

Cause: PDFKit or Wicked PDF cannot find wkhtmltopdf, or the process lacks execute permission. Fix: install the executable in the same image or host as the worker, configure its absolute path, and run that command as the application user.

Styles or images are missing

Cause: the converter cannot resolve relative URLs, protected routes, or local files. Fix: use reachable absolute asset URLs or an explicitly supported local-file configuration, provide required authentication, and test from the worker environment rather than your laptop.

Text is cut off or overlaps

Cause: fixed dimensions, an unexpected font, a long unbroken value, or a table wider than the printable area. Fix: embed or configure the intended fonts, allow wrapping, calculate widths from the page bounds, and test the longest realistic values.

Non-Latin characters render as boxes

Cause: the selected font lacks the glyphs or is unavailable to the runtime. Fix: install a font with the required coverage, register it according to the library’s documentation, and include that font in the deployment image.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Pages are blank or incomplete

Cause: an exception occurred before finalization, a renderer timed out, or a remote resource failed. Fix: capture stderr and application logs, reproduce with a minimal fixture, eliminate remote dependencies, and retry only failures that are safe to retry.

Ruby or Rails dependency conflicts

Cause: the selected gem’s supported range does not include your runtime, or transitive dependencies conflict. Fix: inspect gem metadata for the exact release, update within a tested compatibility window, or choose another approach rather than forcing an unsupported combination.

Performance, reliability, and cost considerations

Prawn and HexaPDF avoid starting an HTML-rendering executable, which can simplify process management. HTML-to-PDF pipelines may still be the fastest way for a team to deliver complex CSS layouts, but they add startup, asset-loading, and temporary-file behavior to each job. Measure your own documents; the supplied project documentation does not establish a common benchmark.

  • Generate PDFs asynchronously when documents contain many pages or images.
  • Cache stable assets and avoid network calls during rendering where possible.
  • Set job timeouts and retain converter stderr for diagnosis.
  • Keep output deterministic by pinning gem, executable, font, and template versions.
  • Review generated files for sensitive metadata and access controls before serving them.

Licensing, security posture, and maintenance must be checked for the exact versions you deploy. Do not treat an old README compatibility range as a current support guarantee.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup: ScreenshotNeo

If your actual requirement is to turn a public URL into a PDF rather than authoring a PDF inside Ruby, ScreenshotNeo provides a website screenshot API. A single request can return a PDF, PNG, JPEG, or WebP. It accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the result with X-Page-Verdict and X-Billed headers.

For developers and AI workflows, it also offers an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. Every plan includes the same feature set, including PDF paper size, margins, landscape mode, page ranges, custom CSS and JavaScript, waits, headers, cookies, user agents, geolocation, caching, signed links, asynchronous webhooks, bulk capture, and a usage API.

Ruby

require "net/http"
require "uri"

uri = URI("https://api.screenshotneo.com/v1/shot")
uri.query = URI.encode_www_form(access_key: "YOUR_API_KEY", url: "https://stripe.com")
response = Net::HTTP.get_response(uri)
File.binwrite("shot.pdf", response.body)
abort "HTTP #{response.code}" unless response.is_a?(Net::HTTPSuccess)

See the ScreenshotNeo documentation for response formats and options. To request PDF output, add the documented PDF parameters for your paper size, margins, orientation, or page range.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

The Free plan includes 1,000 shots per month with no card. Paid plans start at $5 for 3,000 shots; yearly billing gives two months free. Create a free ScreenshotNeo account to try it without a card.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Final selection checklist

  • Use Prawn for a Ruby-defined layout and straightforward generation.
  • Use HexaPDF when creation and manipulation belong in one Ruby workflow.
  • Use PDFKit for general HTML/CSS conversion, accepting the wkhtmltopdf dependency.
  • Use Wicked PDF when Rails views are the source and Rails integration is valuable.
  • Validate current compatibility, licensing, security, and deployment requirements for the exact versions you select.

Frequently Asked Questions

Can I use Prawn and HexaPDF in the same application?

Yes. They solve different parts of the problem, but test font handling, metadata, and page-processing behavior when passing files between libraries.

Do PDFKit and Wicked PDF render modern browser CSS?

They delegate rendering to wkhtmltopdf, so behavior is determined by that WebKit-based executable and its supported CSS features, not by a current browser engine.

Which option is best for a Rails application?

Wicked PDF is the Rails-specific integration among these choices, while PDFKit is the more general HTML-to-PDF wrapper. Confirm current gem, Rails, Ruby, and wkhtmltopdf compatibility before choosing.

Is ScreenshotNeo a replacement for a Ruby PDF layout library?

No. It is an API for capturing a URL as an image or PDF. Use Prawn or HexaPDF for programmatic PDF document authoring; use ScreenshotNeo when the source is a web page or an AI-driven capture workflow.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.