Press

Press is a dependency-free Elixir library for rendering HTML+CSS into PDF, targeting structured business documents: invoices, delivery notes, payslips, and reports. "Dependency-free" means zero runtime dependencies — only modules that ship with OTP itself (e.g. :zlib) are used.

Usage

html = """
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; font-size: 12pt; }
h1 { color: #1a56db; }
</style>
</head>
<body>
<h1>Hello from Press!</h1>
<p>Render HTML and CSS directly to PDF with zero dependencies.</p>
</body>
</html>
"""
{:ok, pdf_binary} = Press.render(html)
File.write!("document.pdf", pdf_binary)

Images (PNG and JPEG) can be referenced via data URIs or passed in an :images lookup map:

logo_data = File.read!("logo.png")
{:ok, pdf_binary} = Press.render(html, images: %{"./assets/logo.png" => logo_data})
File.write!("invoice.pdf", pdf_binary)

Examples

Invoice

examples/invoice.exs renders a business invoice (examples/invoice.html) with company branding, itemized table, tax breakdown, and payment details (mix run examples/invoice.exs):

html = File.read!("examples/invoice.html")
logo = File.read!("examples/assets/novatech_logo.png")
{:ok, pdf} = Press.render(html, images: %{"./assets/novatech_logo.png" => logo})
File.write!("examples/invoice.pdf", pdf)

Invoice example

Delivery Note

examples/delivery_note.exs renders a goods delivery note (examples/delivery_note.html) with sender/recipient blocks, SKU table, weight summary, and signature areas (mix run examples/delivery_note.exs):

html = File.read!("examples/delivery_note.html")
logo = File.read!("examples/assets/freshgoods_logo.png")
{:ok, pdf} = Press.render(html, images: %{"./assets/freshgoods_logo.png" => logo})
File.write!("examples/delivery_note.pdf", pdf)

Delivery Note example

Payslip

examples/payslip.exs renders an employee payslip (examples/payslip.html) with earnings, tax deductions, and net pay summary (mix run examples/payslip.exs):

html = File.read!("examples/payslip.html")
logo = File.read!("examples/assets/paycorp_logo.png")
{:ok, pdf} = Press.render(html, images: %{"./assets/paycorp_logo.png" => logo})
File.write!("examples/payslip.pdf", pdf)

Payslip example

Installation

The package can be installed by adding press to your list of dependencies in mix.exs:

def deps do
[
{:press, "~> 0.1.0"}
]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/press.

License

Press is licensed under the MIT License.