Worum es geht
Jede Vorlage hat einen Ausgabetyp. Er sagt, was die Vorlage erzeugt, und damit, in welche Formate sie gerendert werden kann. Ein Format ist die Dateiart, die du am Ende bekommst, etwa PDF oder XLSX.
CRMS errät keine Struktur. Eine Tabelle entsteht nicht, indem CRMS ein HTML-Dokument zerlegt. Wer eine Excel-Datei will, schreibt eine Vorlage vom Typ TABLE.
Die drei Ausgabetypen
| DOCUMENT | TABLE | WORD | |
|---|---|---|---|
| Die Vorlage schreibt | XHTML | das CRMS-Tabellendokument (kleines XML) | WordprocessingML als Flat OPC (das ganze Paket als eine XML-Datei) |
| Formate | HTML, PDF | XLSX, CSV, ODS | DOCX |
| Escaping in der Vorlage | XHTML | XML | XML |
| Eigene Dateien (Assets) | asset:<name> in src, href, CSS url() | – | asset:<name> in <pkg:binaryData> |
| Bilder aus der Anfrage | bei PDF | nein | nein |
| SVG mit crms.svg | als Vektorgrafik (PDF) bzw. inline (HTML) | nein | als eingebettetes Bild |
Escaping heißt: Sonderzeichen aus der Payload, etwa < oder &, landen als Text im Dokument und nie als Markup. Das gilt für jeden Ausgabetyp automatisch. Markup aus der Payload kommt nur über crms.svg ins Dokument, siehe Bilder und SVG.
Assets sind Dateien, die zu einer Revision der Vorlage gehören, etwa ein Logo oder eine Schrift. Sie sind mit der Vorlage freigegeben. Mehr unter Wie eine Vorlage aufgebaut ist.
DOCUMENT: HTML und PDF
Die Vorlage schreibt XHTML. HTML gibt dieses XHTML zurück und macht es eigenständig: Jedes asset:<name> wird zu einer data:-Adresse, sodass die Seite ohne CRMS und ohne Netz ihr Logo zeigt.
PDF setzt das XHTML mit openhtmltopdf in Seiten. Schriften werden eingebettet. Text ohne eigene Schrift der Vorlage bekommt DejaVu Sans aus CRMS, nie eine Schrift des Servers. Hat das <html>-Element kein lang, setzt CRMS die Sprache des Dokuments ein.
TABLE: XLSX, CSV, ODS
Die Vorlage schreibt das CRMS-Tabellendokument:
<workbook>
<sheet name="Positionen">
<column width="30"/>
<row header="true"><cell>Position</cell><cell>Betrag</cell><cell>Fällig</cell></row>
<#list items as item>
<row>
<cell>${item.label}</cell>
<cell type="number" format="#,##0.00">${item.amount?c}</cell>
<cell type="date">2026-10-17</cell>
</row>
</#list>
</sheet>
</workbook>
- Zelltypen:
string(Standard),number,date(ISO),datetime(ISO mit Versatz),boolean. formatist ein Zahlen- oder Datumsformat für XLSX und ODS.column widthist die Breite in Zeichen,row header="true"eine fette Kopfzeile.- Ein Blattname hat höchstens 31 Zeichen, keines von
[ ] : * ? / \und ist im Dokument eindeutig. - Formeln gibt es nicht. Jeder Wert ist vorbereitet. In CSV bekommt Text, der mit
=,+,-,@, Tab oder Wagenrücklauf beginnt, ein führendes', damit eine Tabellenkalkulation ihn nicht als Formel ausführt. - CSV hat genau ein Blatt. Ein Dokument mit mehr Blättern ist
render-csv-single-sheet. CSV ist UTF-8 ohne BOM, mit Komma und CRLF.
Ein kaputtes Tabellendokument (unbekanntes Element, DOCTYPE, kein Blatt) ist render-table-invalid|<zeile>|<spalte>.
WORD: DOCX
Die Vorlage schreibt das ganze Word-Paket als eine XML-Datei (Flat OPC). CRMS packt daraus die DOCX-Datei. <pkg:binaryData>asset:logo.png</pkg:binaryData> füllt CRMS mit dem Asset der Revision. Eine externe Beziehung außer einem Hyperlink, etwa ein extern angehängtes Template oder ein Bild aus dem Netz, ist render-resource-refused. Kaputtes XML ist render-word-invalid|<zeile>|<spalte>.
Welche Formate eine Installation anbietet
Nicht jede Installation bietet jedes Format an. Zwei Dinge entscheiden:
- Welche Format-Module installiert sind. HTML ist immer dabei. PDF kommt aus dem Formatmodul für PDF, DOCX aus dem Formatmodul für DOCX, XLSX, CSV und ODS aus dem Formatmodul für Tabellen.
- Was die Konfiguration anbietet.
CODAMAI_CRMS_FORMATSlistet die angebotenen Formate. Leer heißt: alle installierten. Nennt die Liste ein Format, für das kein Modul installiert ist, startet die Anwendung nicht.
Im Hub wählst du die Formate am CRMS-Modul, siehe Das CRMS-Modul im Hub. Welche Formate gerade angeboten werden, sagt GET /crms/capabilities.
| Format angeboten und installiert? | Passt zum Ausgabetyp der Vorlage? | Ergebnis |
|---|---|---|
| nein | – | 422 format-not-offered|<format> |
| ja | nein | 422 format-not-for-template|<format>|<ausgabetyp>, z. B. format-not-for-template|docx|document |
| ja | ja | CRMS rendert |
PDF-Profile
Ein PDF-Profil legt fest, welche Norm ein PDF erfüllt. Du wählst es mit pdfProfile in der Anfrage, nur bei format: PDF. Fehlt es, gilt das Standardprofil der Installation (CODAMAI_CRMS_PDF_PROFILE, Standard PDF_A_3A).
| Profil | Norm | Getaggt | Wofür |
|---|---|---|---|
NONE | einfaches PDF | nein | schnelle Ansicht |
PDF_A_3A | PDF/A-3a (ISO 19005-3), mit sRGB-Farbprofil | ja | Langzeitarchivierung |
PDF_UA | PDF/UA-1 (ISO 14289-1) | ja | Barrierefreiheit |
PDF_A_3A_UA | PDF/A-3a und PDF/UA-1 zugleich | ja | archivierbar und barrierefrei |
Getaggt heißt: Das PDF enthält eine Struktur aus Überschriften, Absätzen und Tabellen, die etwa ein Bildschirmleser vorlesen kann.