CDS pluginCDS plugintypeInstalls into a CAP project and extends the runtime. CAP loads it through cds.requires or the plugin hook.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

@salvatorela/cap-plugin-adobe-forms

A CAP plugin that wraps the SAP Forms service by Adobe on BTP as a CAP service, rendering a PDF from a form template with credentials from a destination or direct configuration.

Renders a PDF from a form template without hand-writing the BTP call: credentials come from a destination or direct config, the way CAP resolves everything else.

Facts

Latestv0.0.8ReleasedLast pushLicenceMIT

Where it sits

Lives in
Provides
Document outputCAPDocument outputcapabilityProducing a document a person receives — a printed form, a generated PDF, a filled template — and getting it to a printer or a queue rather than returning it as a payload.
Flavors
Node.jsfrom its runtime
Runs
Cloud Foundrylocal
Requires
@sap/cds^9.1.0@sap/cdsartifactThe peer range, as published.SAP Destination serviceSAP Destination serviceartifactNamed as a dependency in its documentation.

Who is behind it

SalvatoreLaSalvatoreLaPersonMaintains this
In the atlas: maintains 1, contributes to 1
@salvatorelaspata
maintainer

Before choosing this

Conditions

LicenceSAP Developer License Agreement 3.2 CAP§ 1, 2, 3A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.
  • § 1 License. Productive customer applications are limited to SAP BTP or another SAP-licensed platform, and mass extraction to a non-SAP product is restricted except where solely required for SAP interoperability.
  • § 2 Intellectual Property. The agreement retains SAP's rights in the covered materials and limits making APIs, tools or software available to third parties, while preserving ownership of customer applications subject to SAP's underlying rights.
  • § 3 Artificial Intelligence Training. The agreement prohibits use of the covered materials and customer applications for training artificial-intelligence models or systems.
SAP Developer License Agreement 3.2 CAP →

What it declares

Every artifact

Type
CDS plugin
Origin
Independently maintained
Runtime
Node.js
Runs on
Cloud Foundrylocal

As a CDS plugin

Declared for
^9.1.0
Distributed through
npm

Connections2

Install

npm add @salvatorela/cap-plugin-adobe-forms

Derived from the package name. No recipe recorded; the README has the configuration.

Where it sits in your app

Download
Your CAP applicationYour SAP BTP subaccountdocumentedrequires@salvatorela/cap-plugin-adobe-forms, module@salvatorela/cap-plu…SAP Destination service, service instanceSAP Destinationservice
SAPnot SAP's, or the project's owndocumented only

README

quoted from salvatorelaspata/cap-plugin-adobe-forms under MIT, read
salvatorelaspata/cap-plugin-adobe-forms/README.mdOn GitHub

cap-plugin-adobe-forms

Reusable SAP CAP Node.js plugin that wraps SAP Forms service by Adobe on SAP BTP.

Installation

npm install @salvatorela/cap-plugin-adobe-forms

Configuration

The plugin supports two authentication modes. Destination service is preferred for BTP deployments; direct credentials are useful for local development.

Configure an HTTP destination named ADOBE_FORMS_API with OAuth2ClientCredentials authentication in BTP Cockpit, then reference it in your CAP app:

{
  "cds": {
    "requires": {
      "adobeForms": {
        "destination": "ADOBE_FORMS_API"
      }
    }
  }
}

Recommended destination settings:

FieldValue
NameADOBE_FORMS_API
TypeHTTP
Proxy TypeInternet
AuthenticationOAuth2ClientCredentials
URLAdobe REST API base URL from the service key
Client IDuaa.clientid from the service key
Client Secretuaa.clientsecret from the service key
Token Service URLuaa.url + /oauth/token
Option 2 — Direct credentials (local development)
{
  "cds": {
    "requires": {
      "adobeForms": {
        "credentials": {
          "baseUrl": "https://<adsrestapi-host>",
          "tokenUrl": "https://<xsuaa-host>/oauth/token",
          "clientId": "<uaa.clientid>",
          "clientSecret": "<uaa.clientsecret>"
        }
      }
    }
  }
}

For local development with a .env file see TEST.md.


Usage

Programmatic API (CAP service handler)

Connect to the service with cds.connect.to and call methods directly:

const cds = require('@sap/cds')

module.exports = cds.service.impl(async function () {
  const adobeForms = await cds.connect.to('adobeForms')

  this.on('generateReport', async (req) => {
    // Render a PDF and return it as a Buffer
    const pdf = await adobeForms.renderPDF({
      templateName: 'MY_FORM',
      payload: {
        Header: { Title: 'Annual Report', Year: 2026 },
        Items: { Row: [{ Label: 'Revenue', Value: '1000' }] }
      },
      locale: 'it-IT'
    })
    return pdf // Buffer
  })

  this.on('listAvailableForms', async () => {
    return adobeForms.listForms()
  })

  this.on('getSchema', async (req) => {
    const { formId } = req.data
    return adobeForms.getFormSchema(formId)
  })
})
Render PDF as base64

Pass options.base64: true to get a base64 string instead of a Buffer (useful for JSON responses or email attachments):

const b64 = await adobeForms.renderPDF({
  templateName: 'MY_FORM',
  payload: { ... },
  options: { base64: true }
})
// b64 is a base64-encoded string
Raw XML payload

If your data is already valid XML, pass it as a string — no conversion is applied:

const pdf = await adobeForms.renderPDF({
  templateName: 'MY_FORM',
  payload: '<?xml version="1.0" encoding="UTF-8"?><FormData><Title>Hello</Title></FormData>'
})
HTTP / OData (REST endpoint)

The plugin also exposes a CAP OData service at /adobe/forms. Call it directly via HTTP:

# List all forms
curl -X POST https://<app>/adobe/forms/listForms

# Render a PDF
curl -X POST https://<app>/adobe/forms/renderPDF \
  -H 'Content-Type: application/json' \
  -d '{"templateName":"MY_FORM","payload":"{\"Header\":{\"Title\":\"Test\"}}","locale":"it-IT"}' \
  --output report.pdf

# Health checks
curl -X POST https://<app>/adobe/forms/health
curl -X POST https://<app>/adobe/forms/remoteHealth

Note: options.base64 is only available via the programmatic API. The OData action always returns binary (application/pdf).


CAP service

The plugin registers the service at path /adobe/forms.

@path: '/adobe/forms'
service AdobeFormsService {

  @Core.MediaType: 'application/pdf'
  action renderPDF(
    templateName : String(255),
    payload      : LargeString,
    locale       : String(10)
  ) returns LargeBinary;

  action listForms()                          returns LargeString;
  action getFormDetails(formId : String(255)) returns LargeString;
  action getFormSchema(formId  : String(255)) returns LargeString;

  action health()       returns HealthStatus;
  action remoteHealth() returns RemoteHealthStatus;
}

API reference

renderPDF({ templateName, payload, locale, options })

Renders a PDF for the given form template.

Internally the plugin:

  1. Fetches the form details (GET /v1/forms/{templateName}) to retrieve the available XDP templates
  2. Selects the template whose language matches the locale language code; falls back to the first template if no match is found
  3. Converts payload to XML and base64-encodes it
  4. Calls POST /v1/adsRender/pdf with xdpTemplate and templateName (from the selected template), then returns the decoded PDF as a Buffer
ParameterTypeRequiredDescription
templateNamestringyesForm name as returned by listForms
payloadobject | stringyesData to fill the form. JS objects are serialized to XML automatically. Strings are sent as-is (must be valid XML).
localestringnoLocale in ll, ll-LL or ll_LL format (e.g. it, it-IT). Defaults to en_US. Used to select the matching language template variant.
options.base64booleannoIf true, returns the PDF as a base64 string instead of a Buffer. Defaults to false.

Payload structure — JS objects are converted to XML with the root element FormData:

// Input
{
  Header: { NumeroDelibera: 'TEST-001', Anno: 2026, Data: '2026-04-23' },
  TabellaStringhe: { Riga: [{ Testo: 'Prima riga' }, { Testo: 'Seconda riga' }] }
}

// Serialized XML sent to the API
<?xml version="1.0" encoding="UTF-8"?>
<FormData>
  <Header>
    <NumeroDelibera>TEST-001</NumeroDelibera>
    <Anno>2026</Anno>
    <Data>2026-04-23</Data>
  </Header>
  <TabellaStringhe>
    <Riga><Testo>Prima riga</Testo></Riga>
    <Riga><Testo>Seconda riga</Testo></Riga>
  </TabellaStringhe>
</FormData>

Returns: Buffer (PDF binary)


listForms()

Returns all form templates available in the Adobe Forms tenant.

GET /v1/forms

Returns: array of form objects, each with formName, metaData, schema, and templates.


getFormDetails(formId)

Returns full details for a specific form, including the XSD schema and XDP templates.

GET /v1/forms/{formId}

ParameterTypeDescription
formIdstringForm name (URL-encoded automatically)

Returns: form object with formName, schema, templates, metaData.


getFormSchema(formId)

Returns the XSD schema of a form decoded as a plain string.

Internally calls getFormDetails and decodes schema.xsdSchema from base64.

ParameterTypeDescription
formIdstringForm name

Returns:

{
  formName:   'DELIBERA',
  schemaName: 'Schema',
  xsd:        '<?xml version="1.0"...>',  // decoded XSD
  metaData:   { objectId, versionNumber, creationDate, ... }
}

health()

Returns local plugin health without making any outbound call.

Returns: { status: 'UP', service: 'SAP Forms service by Adobe' }


remoteHealth()

Resolves the destination (or direct credentials) and performs a real call to the configured healthPath (default: GET /v1/forms) to verify end-to-end connectivity.

Returns:

{
  status:          'UP' | 'DOWN',
  service:         'SAP Forms service by Adobe',
  destinationName: 'ADOBE_FORMS_API',
  endpoint:        '/v1/forms',
  reachable:       true | false,
  authenticated:   true | false,
  details:         '...'
}

Error codes

CodeThrown byDescription
ADOBE_FORMS_API_FAILEDall API callsHTTP error from the Adobe REST API (includes status)
ADOBE_FORMS_CONFIG_MISSINGstartupRequired credential fields are missing
ADOBE_FORMS_XDP_NOT_FOUNDrenderPDFNo XDP template found for the form (or the selected language variant)
ADOBE_FORMS_SCHEMA_NOT_FOUNDgetFormSchemaThe form has no schema.xsdSchema field
ADOBE_FORMS_DESTINATION_NOT_FOUNDall API callsBTP destination resolved to null (destination mode)
ADOBE_FORMS_OAUTH_FAILEDall API callsOAuth token endpoint returned an error (direct mode)

Testing

See TEST.md for instructions on running unit tests and integration tests against a real BTP instance.

# Unit tests (no credentials needed)
npm test

# Integration test against real BTP service
node --env-file=.env test/integration.js
MIT, read

History

Latest

v0.0.8

  1. v0.0.7

  2. v0.0.6

  3. v0.0.5

  4. v0.0.4

  5. v0.0.3

  6. v0.0.2

  7. v0.0.1

On npm
0downloads per week, npm
Weekly downloads for @salvatorela/cap-plugin-adobe-forms26 complete calendar weeks from 2026-04-27 to 2026-10-25; the latest total is 0.27 Apr – 3 May: 294 May – 10 May: 2111 May – 17 May: 2418 May – 24 May: 1825 May – 31 May: 81 Jun – 7 Jun: 328 Jun – 14 Jun: 3715 Jun – 21 Jun: 422 Jun – 28 Jun: 3429 Jun – 5 Jul: 316 Jul – 12 Jul: 2213 Jul – 19 Jul: 1320 Jul – 26 Jul: 2427 Jul – 2 Aug: 83 Aug – 9 Aug: 3310 Aug – 16 Aug: 2017 Aug – 23 Aug: 1824 Aug – 30 Aug: 931 Aug – 6 Sept: 77 Sept – 13 Sept: 1314 Sept – 20 Sept: 1121 Sept – 27 Sept: 828 Sept – 4 Oct: 35 Oct – 11 Oct: 212 Oct – 18 Oct: 119 Oct – 25 Oct: 0
Document output
  1. @cap-js/printPrints documents held in CAP entities through SAP Print service

Details

Sources4
The maintainer, claiming itdiscovered herechecked
npm registry, @salvatorela/cap-plugin-adobe-formsversion, releases, installschecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
runtimesnode
declared for^9.1.0
deploymentCloud Foundry, local
latestv0.0.8
first release
releases and cadence8, ~0d median
discovered viaThe maintainer, claiming it
first seen in the atlas
ecosystem and domaincap, operations-and-runtime
History in the atlas1
  1. First seen.
For your agent
Ref
artifact:salvatorelaspata-cap-plugin-adobe-forms
JSON
/artifacts/salvatorelaspata-cap-plugin-adobe-forms.json
MCP
Connecting an agent