Comparison
A PHP alternative to mPDF
mPDF is one of the most-used PHP PDF libraries. It ships its own HTML and CSS parser, which means its rendering output depends on mPDF's own interpretation of your markup, not a browser's. The result: CSS properties that work in your browser sometimes produce wrong or missing output in mPDF. PDFPipe renders with a real browser engine and returns the PDF over HTTP, so what you see in the browser is what you get in the PDF.
mPDF versus browser rendering
| PDFPipe | mPDF | |
|---|---|---|
| Rendering engine | Modern browser | Custom HTML/CSS parser |
| CSS Flexbox | Yes | No |
| CSS Grid | Yes | No |
| CSS custom properties | Yes | No |
| Web fonts | Any URL | Needs font files on disk |
| Memory on large docs | None in PHP process | High (all layout in PHP memory) |
| SVG support | Full | Partial |
| Emoji / Unicode | Full | Incomplete in some ranges |
| Composer dependency | None | Required |
The custom parser gap
mPDF's parser was written to handle the HTML and CSS that existed when the library was first built. Modern CSS layout systems (Flexbox, Grid, custom properties, logical properties) are not supported because adding them would require rewriting the layout engine from scratch. Any template that uses modern CSS needs to be reworked to use only the subset mPDF understands, which in practice means maintaining a separate print stylesheet alongside your normal one.
Memory and timeouts on large documents
mPDF runs the entire layout and rendering process inside your PHP process. On documents with many pages, images, or complex tables, PHP memory usage climbs steeply and requests can time out before the PDF is returned. PDFPipe renders on its own infrastructure, outside your PHP process. Your PHP process only makes one HTTP call, regardless of how large the document is.
PHP replacement
<?php
$html = renderView('invoices.show', ['invoice' => $invoice]);
$response = Http::withToken(config('services.pdfpipe.key'))
->post('https://api.pdfpipe.xyz/v1/pdf', [
'html' => $html,
'options' => ['format' => 'A4'],
]);
abort_unless($response->successful(), 502, 'PDF render failed.');
return response($response->body(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="invoice.pdf"',
]);More PHP examples on the PHP guide and the Laravel guide.
See pricing →Competitor pricing and features on this page were last reviewed on 21 September 2026. Vendors change their plans, so check their own pricing page before deciding. If something here is out of date, tell us and we will correct it.