Comparison
An Apache FOP alternative built on HTML and CSS
Apache FOP is a mature XML-to-PDF pipeline for enterprise Java applications. Developers who need to generate PDFs from dynamic HTML templates run into its biggest constraint quickly: FOP does not accept HTML. You write XSL-FO, a verbose XML page description language, and transform your data into it before FOP can render anything. PDFPipe takes HTML and CSS directly, through a REST API, with no Java runtime required.
How they compare
| PDFPipe | Apache FOP | |
|---|---|---|
| Input format | HTML and CSS | XSL-FO (XML page description language) |
| Rendering engine | Full browser rendering engine | Java-based FOP renderer |
| Language / runtime required | None (REST API) | Java runtime, XML/XSLT expertise |
| CSS support | Full: Grid, flexbox, web fonts, variables | Basic (no Grid, no flexbox) |
| URL-to-PDF | Yes, SSRF-sandboxed | No |
| Batch support | Yes, dedicated batch endpoint | No built-in batch API |
| Self-hosting required | No (managed API) | Yes (server, ops, upgrades) |
| AI agent tools | First-class MCP server | None |
Send a request from Java
FOP users are typically on a JVM stack. The Java 11+ HTTP client makes the PDFPipe call straightforward. No new runtime, no additional dependency beyond a JSON string.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
HttpClient client = HttpClient.newHttpClient();
String body = """
{
"html": "<h1>Invoice #1042</h1><p>Amount due: $250.00</p>",
"options": { "format": "A4" }
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.pdfpipe.xyz/v1/pdf"))
.header("Authorization", "Bearer pp_live_your_key")
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString(body))
.build();
HttpResponse<byte[]> response = client.send(
request, HttpResponse.BodyHandlers.ofByteArray()
);
Files.write(Path.of("invoice.pdf"), response.body());When FOP is still the right choice
FOP makes sense when your pipeline already produces XSL-FO and swapping the renderer would require rewriting the entire transformation layer. It is also the right tool when strict XSL-FO compliance is a hard requirement, for example in regulated publishing workflows that mandate the XSL-FO specification as the interchange format. If neither of those applies, HTML plus a browser-rendering API is almost always faster to build and cheaper to run.
Try PDFPipe on the live playground with no signup, then read the docs.
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.