Guides · Ruby · Net::HTTP
Turn an online registration form into a fillable PDF in Ruby with Net::HTTP
Every event eventually meets a participant who cannot — or will not — register online: no account, a locked-down work laptop, a school that wants paper on file. The usual answer is maintaining a second, Word-document copy of the form that drifts out of sync with the web one. The better answer is generating the paper copy from the web form, so there is exactly one source of truth.
Below is a complete, runnable Ruby program using Net::HTTP, no third-party dependency needed. It reads your API key from the SNAPDOK_KEY environment variable — free keys take about thirty seconds and need no card.
require "json"
require "net/http"
require "uri"
uri = URI("https://snapdok.io/v1/render")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 90) do |http|
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("SNAPDOK_KEY")}"
req["Content-Type"] = "application/json"
req.body = JSON.generate({
url: "https://your-app.com/events/spring-workshop/register",
format: "pdf",
pdf_forms: true,
pdf_form_only: true,
})
http.request(req)
end
raise "snapdok error #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
File.binwrite("registration.pdf", res.body)
puts "#{res["X-Form-Fields"]} # fields on the printed form"
Radio groups are the detail to check on registration forms: a set of <input type="radio"> sharing a name becomes a proper PDF radio group — pick one and the others clear, same as on the page. Checkbox consents ("email me about future workshops") stay independently tickable. A <select> of ticket types becomes a dropdown in the PDF reader.
With pdf_form_only the render drops your site's navigation and prints just the form block with its headings — hand that straight to a printer. And because fields keep their HTML names, a filled copy that comes back to you can be read programmatically with any PDF library and fed into the same handler your web form posts to.
Notes for Net::HTTP
Stdlib only — no gems. The traps Net::HTTP is famous for, all handled in the sample: TLS is not automatic (set use_ssl: true or you will POST in the clear to port 80 and get a redirect); the default read_timeout of 60 s is close enough to real render times that raising it is wise; and the response body is a binary-ready String, but write it with File.binwrite — plain File.write on Windows would mangle line-ending bytes in the PDF. Check is_a?(Net::HTTPSuccess): Net::HTTP never raises on HTTP error statuses.
Response headers worth reading
| Header | Meaning |
|---|---|
X-Form-Fields | How many controls made it into the PDF. |
X-Form-Skipped | Anything skipped — compare against your form. |
X-Form-Extracted | Whether the page was pruned to the form. |
Full parameter reference: the docs. Hard numbers on caps and timeouts: limits.
Related guides
Same task, other stacks
- Turn an online registration form into a fillable PDF in Python with requests
- Turn an online registration form into a fillable PDF in Node.js with built-in fetch
- Turn an online registration form into a fillable PDF in PHP with cURL extension
More with Ruby + Net::HTTP
- Convert an HTML form to a fillable PDF
- Get a fillable PDF of just the form — no nav, no footer
- Generate a fillable invoice PDF from a web page
- Wait for a JavaScript-rendered form, then make it fillable
- Verify a fillable PDF render without opening the file
- Convert a URL to PDF
- Take a full-page screenshot
- Capture very tall pages as numbered tiles
- Take a retina-quality (2x) screenshot
- Take a JPEG screenshot at a custom viewport size
- Use the 24-hour render cache to cut costs
- Take a screenshot of a URL
- Capture a JavaScript-heavy page after it settles
- Wait for a specific element before capturing
- Add page numbers and headers to a PDF