The most affordable way to turn SAP data into PDF documents
Invoices, credit notes, order confirmations and delivery notes — rendered on demand, multi-tenant by design, and priced so you only ever pay for the documents you actually generate.
Delivered and operated by the pdf4sap team.
NetWeaver AS Java reaches end of mainstream maintenance on 31 December 2027
Adobe Document Services (ADS) running on NetWeaver AS Java 7.5 needs a successor before then. SAP's own migration paths aren't cheap — a lower-cost alternative already exists, as SaaS or on-premise.
SAP Forms service by Adobe
The official cloud successor to ADS, delivered through SAP BTP. Solves the end-of-maintenance deadline, but comes with BTP consumption-based pricing and a migration project.
ADS on SAP HANA XSA, advanced model
The official on-premise successor — ADS moved off NetWeaver AS Java onto SAP HANA Extended Application Services, advanced model (XSA). Still Adobe-based infrastructure to license, run, and maintain yourself.
pdf4sap.com
One REST API for rendering documents, with your templates managed in our template store — available as a SaaS tenant or deployed on-premise. No NetWeaver Java, no ADS licensing, a fraction of the cost.
Both official paths solve the deadline. Neither solves the cost. pdf4sap.com does.
Two ways to run it — one team behind both
Whether your SAP landscape is on-premise, in SAP BTP, or a hybrid of both, pdf4sap fits into it without forcing you to change how your systems already work.
Dedicated SaaS tenant
A private, isolated tenant hosted and operated by the pdf4sap team. Your SAP system (on-premise or cloud) calls a single HTTPS endpoint with your own API key — nothing to install, patch or scale.
- Live in days, not months
- Your own rate limits and document quotas
- Zero infrastructure on your side
Microservice inside your SAP BTP
The pdf4sap team configures and hands over the same service as a microservice running inside your own SAP BTP subaccount. Your document data never has to leave your cloud landscape.
- Deployed & configured by the pdf4sap team
- Runs under your BTP entitlements
- Fits existing SAP BTP security & networking policies
From SAP document data to a finished PDF
A simple, predictable request/response flow — easy to call from ABAP, a BTP extension app, or any middleware you already use.
Send the document as JSON
Your system posts the SAP document (invoice, credit note, order confirmation, delivery note) to the API, authenticated with your customer API key.
Validated against your rules
The payload is schema-checked, and only the document types and limits you've been assigned are accepted.
Rendered on the fly
A branded, print-ready A4 PDF is generated in your document language of choice.
Only success counts
Rejected or failed requests never consume your daily or monthly document quota — you only pay for PDFs you actually receive.
Three ways to plug this into your SAP landscape
Real configuration examples for the three most common integration paths — copy them, adapt the hostname and API key, and you're calling the service.
Set up a plain HTTP connection to the service in SM59 — no custom ABAP report or Z-class required — then verify it end-to-end from SA38 using the standard connection test program FP_TEST_00.
Transaction SM59
RFC Destination ZPDF4SAP_SERVICE
Connection Type G (HTTP Connection to External Server)
Technical Settings
Target Host www.pdf4sap.com
Service No. 443
Path Prefix /api/v1/pdf
Logon & Security
SSL Active
SSL Certificate DFAULT SSL Client (Standard)
Special Options -> HTTP Fields (Header Fields)
X-API-Key <your-customer-api-key>
Content-Type application/json
Connection Test "Connection Test" button in SM59
-> expects HTTP 200 or 404 (reachable)
Transaction SA38
Program FP_TEST_00
Destination ZPDF4SAP_SERVICE
Run the program and confirm:
- the connection is established (no ICM / SSL handshake errors)
- a valid HTTP response is returned from www.pdf4sap.com
Once green, any ABAP program in your system can call the
destination via cl_http_client=>create_by_destination( ... ).
Store the URL and the API key as a destination in the BTP cockpit (or via the Destination service API). Custom headers such as the API key are added as additional properties — no code ever hard-codes the key.
Name ZPDF4SAP-SERVICE
Type HTTP
Description pdf4sap SAP PDF document service
URL https://www.pdf4sap.com
Proxy Type Internet
Authentication NoAuthentication
Additional Properties
URL.headers.X-API-Key <your-customer-api-key>
URL.headers.Content-Type application/json
HTML5.DynamicDestination true
In Cloud Integration, a Content Modifier sets the headers and JSON body, then a Request-Reply step with an HTTPS receiver adapter calls the service — optionally through Cloud Connector if your BTP account needs to reach an on-premise-hosted tenant.
iFlow step Request-Reply -> HTTPS Receiver Adapter
Address https://www.pdf4sap.com/api/v1/pdf
(or bind to destination ZPDF4SAP-SERVICE)
Proxy Type Internet (or On-Premise via Cloud Connector)
Authentication None - key is sent as a header, see below
Content Modifier (before Request-Reply) - Message Headers
Content-Type application/json
X-API-Key <read from Security Material -> User Credentials>
Timeout 30000 ms
Example only — adjust naming conventions, credential storage and proxy type to your own landscape and security policy.
API reference
Everything your integration needs to call the endpoint correctly on the first try.
Authentication
Every request must include your customer API key in the X-API-Key header. Missing, invalid or disabled keys are rejected with 401 UNAUTHORIZED.
X-API-Key: <your-customer-api-key>
Custom branded templates
This isn't a generic text-to-PDF converter. Every customer can have their own document layout — logo, brand colors, structure — resolved automatically from the authenticated API key. No extra field in the request: the same POST /api/v1/pdf call renders with your template.
This is what lets an SAP S/4HANA customer replace their NetWeaver Java stack and Adobe Document Services (ADS) with a plain HTTP call from ABAP — the visual output stays as branded as the original SAP Form, but rendering happens entirely outside SAP. Templates are designed by the pdf4sap team as part of onboarding, not a self-service upload.
templates/<your-customer-id>/<documentType>.hbs (most specific)
templates/<your-customer-id>/document.hbs (your general layout)
templates/document.hbs (shared default)
/api/v1/pdf
Renders one SAP business document to PDF. The daily and monthly quota is only consumed once rendering succeeds.
Request body
{
"documentType": "INVOICE",
"documentNumber": "9000123456",
"documentDate": "2026-07-30",
"language": "en",
"currency": "EUR",
"company": {
"name": "Example Energy Sp. z o.o.",
"country": "Poland",
"vatId": "PL1234567890"
},
"recipient": {
"name": "SAP Customer A/S",
"country": "Denmark"
},
"items": [
{
"position": "10",
"description": "Electric energy settlement",
"quantity": 1250.5,
"unit": "MWH",
"unitPrice": 82.75,
"netAmount": 103479.88
}
],
"totals": { "net": 103479.88, "tax": 23800.37, "gross": 127280.25 }
}
curl --fail-with-body \
-X POST https://www.pdf4sap.com/api/v1/pdf \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
--data-binary @invoice.json \
--output invoice.pdf
Success response
On success, the response body is the binary PDF itself. Rate-limit and quota headers are attached to every response, success or error.
| Header | Example | Meaning |
|---|---|---|
Content-Type | application/pdf | Binary PDF payload |
Content-Disposition | inline; filename="INVOICE-9000123456.pdf" | Suggested filename for the browser or caller |
X-Customer-ID | customer-a | The authenticated customer's id |
X-RateLimit-Limit-Minute / X-RateLimit-Remaining-Minute | 30 / 29 | Per-minute request budget and what's left |
X-Quota-Limit-Day / X-Quota-Remaining-Day / X-Quota-Day | 500 / 499 / 2026-07-31 | Daily successful-document quota, remaining, and the day it applies to |
X-Quota-Limit-Month / X-Quota-Remaining-Month / X-Quota-Month | 10000 / 9999 / 2026-07 | Monthly successful-document quota, remaining, and the month it applies to |
X-Correlation-ID | client-supplied or generated UUID | Trace id echoed on every response, useful for support requests |
Error responses
| Status | Error | When |
|---|---|---|
| 400 | INVALID_SAP_DOCUMENT | The document payload fails schema validation (see details in the response) |
| 401 | UNAUTHORIZED | Missing, invalid or disabled API key |
| 403 | DOCUMENT_TYPE_NOT_ALLOWED | documentType isn't enabled for this customer |
| 413 | PAYLOAD_TOO_LARGE | Request body exceeds your maxPayloadBytes limit |
| 413 | TOO_MANY_DOCUMENT_ITEMS | items.length exceeds your maxItemsPerDocument limit |
| 429 | RATE_LIMIT_EXCEEDED | Per-minute request limit exceeded |
| 429 | DAILY_QUOTA_EXCEEDED | Daily successful-document quota exceeded |
| 429 | MONTHLY_QUOTA_EXCEEDED | Monthly successful-document quota exceeded |
| 500 | INTERNAL_ERROR | Unexpected server-side failure |
/api/v1/usage
Returns the current rate-limit and quota status for the authenticated customer — call it any time, it never consumes quota.
{
"customer": { "id": "customer-a", "name": "Customer A" },
"usage": {
"minute": { "used": 1, "limit": 30, "remaining": 29 },
"day": { "key": "2026-07-31", "used": 12, "limit": 500, "remaining": 488 },
"month": { "key": "2026-07", "used": 340, "limit": 10000, "remaining": 9660 },
"allowed": true
}
}
Built for finance and IT teams, not just developers
Everything a shared, multi-customer document service needs — nothing you have to build yourself.
Per-customer isolation
Every customer gets its own hashed API key, its own rate limits and its own document quotas — never shared, never mixed up.
Daily & monthly quotas
Set exactly how many documents a customer can generate per day and per calendar month — ideal for tiered commercial plans.
Multi-language output
Documents render natively in English, German and Polish, with correct date, number and currency formatting per language.
Document type control
Invoices, credit notes, order confirmations, delivery notes — enable exactly the types each customer is allowed to generate.
Secure by default
Hardened HTTP headers, constant-time key comparison, request correlation IDs and structured audit logging out of the box.
Fast, predictable rendering
Print-ready A4 PDFs with a bounded rendering timeout, so a slow document never blocks your process.
Pricing built around the document, not the seat
No platform licenses, no per-user fees. You get a plan sized to your document volume — and a straight promise: we work hard to keep the cost per document the lowest you'll find for SAP.
Starter
For a single company code getting started
- Low, fixed daily & monthly document quota
- Dedicated SaaS tenant
- Standard document types
Business
For growing document volumes across markets
- Higher daily & monthly quotas
- SaaS tenant or SAP BTP microservice
- All document types & languages
Enterprise
For multi-entity or high-volume landscapes
- Custom quotas per legal entity
- Runs inside your own SAP BTP subaccount
- Priority support & onboarding
Tell us your expected document volume and we'll come back with a per-document price that beats building and maintaining this in-house — guaranteed.
Get a tailored quoteEnterprise habits, without the enterprise price tag
Built the way SAP teams expect a shared service to behave: predictable, auditable, and strict about tenant boundaries.
- API keys are never stored in plain text — only their SHA-256 hash is kept
- Every request carries a correlation ID for end-to-end traceability
- Hardened HTTP headers and strict payload validation on every call
- Hosted in the EU or deployed directly inside your own SAP BTP subaccount
"We believe great SAP document output shouldn't require an enterprise budget or a multi-month project. pdf4sap makes it a single API call — fast to set up, and still fully your own brand."
— The pdf4sap team
Ready to stop overpaying for SAP document output?
Tell us about your SAP landscape and expected document volume. We'll recommend the deployment option and plan that fits — usually within one working day.
Contact AGG Systemssap@agg-systems.eu · replies within one business day
+48 661 923 280 · English / Polish