Zum Inhalt

Absolute Druckpositionen

Für millimetergenaue Nachbauten amtlicher Vordrucke reicht der fließende Druck nicht: Briefkopf, Anschriftsblock und Unterschriftszeile müssen exakt dort stehen, wo sie auf der Vorlage stehen. Dafür kann jedes Feld eine Druckposition in Millimetern bekommen (kc:printPos).

Die drei Layout-Modi

In den Formular-Eigenschaften → Layout-Modus (Schlüssel kc:document.layoutMode):

Modus Web PDF Wofür
Fließend (Standard) responsiv: Raster, Abschnitte fließend die meisten Formulare
Hybrid — Web fließend, PDF mm-genau responsiv positionierte Felder mm-genau bequeme Erfassung am Bildschirm, amtlicher Ausdruck
Absolut — Position in Millimetern A4-Blatt mit denselben Positionen mm-genau Web soll aussehen wie der Druck

Datenmodell, Prüfungen, Lookups, Skripte und Speichern sind in allen Modi gleich — nur die Darstellung wechselt. Der Wechsel ist verlustfrei: Die Fluss-Einstellungen (kc:layout, kc:colspan, Abschnitte) bleiben erhalten und greifen wieder, sobald du zurück auf Fließend stellst.

Im Hybrid-Modus stellt sich die Frage, was mit Feldern ohne Druckposition geschieht — Formular-Eigenschaften → Felder ohne Druck-Position (kc:document.printUnplaced):

Einstellung Wirkung
Im Fluss mitdrucken (Standard) sie erscheinen im fließenden Druck, getrennt vom gestalteten Blatt
Weglassen nur das gestaltete Blatt wird gedruckt
Als Block darunter anhängen sie folgen als Block unter dem gestalteten Inhalt

Schmale Bildschirme

Unter 1024 px Breite zeigt das Web auch ein Absolut-Formular fließend — ein A4-Blatt passt dort nicht. Der Druck bleibt mm-genau.

Wo pflege ich die Werte?

Am bequemsten im Druck-Canvas (siehe unten): Felder mit der Maus platzieren. Die Zahlen stehen außerdem in den Feld-Eigenschaften im Reiter Druck (nur im Hybrid- und Absolut-Modus):

  • X / Y in Millimetern, Ursprung links oben.
  • Breite / Höhe in Millimetern.
  • Stil-Klasse — Default, Default_8pt, Default_9pt, Default_12pt oder eine eigene.
  • Seite — überstimmt kc:page für das PDF (leer = Seite des Feldes).
  • Z-Reihenfolge — höhere Werte werden später (also darüber) gezeichnet. Standard 0.
  • Leittext im Ausdruck und Wenn der Text nicht passt — siehe unten.

Erst wenn X, Y, Breite und Höhe gesetzt sind, gilt das Feld als positioniert. Unvollständige Angaben werden ignoriert, damit beim Tippen keine kaputten Zwischenstände entstehen.

Schema

"Nachname": {
  "type": "string",
  "title": "Nachname",
  "kc:maxLength": 30,
  "kc:printPos": {
    "x": 21.18,
    "y": 198.52,
    "width": 66,
    "height": 5,
    "styleClass": "Default",
    "zOrder": 2,
    "label": "left",
    "labelWidthMm": 30
  }
}

label steuert den Leittext und ist optional; ohne den Schlüssel druckt nur der Wert. Erlaubt sind "left" und "above"; die Spaltenbreite kommt aus labelWidthMm (Standard 55 mm). Die Langform "label": { "position": "left", "widthMm": 30, "heightMm": 4.5 } hält die Geometrie zusammen. Ein unbekannter Wert wirkt wie „nicht gesetzt". Details unter Leittexte im Ausdruck.

Stilklassen (kc:printStyleClasses)

Schriftgrößen und -farben definierst du zentral als Stilklassen; die Felder verweisen über styleClass darauf:

"kc:printStyleClasses": {
  "Default": {
    "fontFamily": "Arial",
    "fontSize": 10,
    "color": "#000000",
    "verticalAlign": "top",
    "overflow": "wrap"
  },
  "Default_8pt":  { "base": "Default", "fontSize": 8  },
  "Default_9pt":  { "base": "Default", "fontSize": 9  },
  "Default_12pt": { "base": "Default", "fontSize": 12 }
}

base vererbt: Default_8pt übernimmt alles von Default und ändert nur die Schriftgröße. Aufgelöst wird in dieser Reihenfolge:

  1. Stilklassen des Formulars (dieser Block; im Formular-Editor unter Formular-Eigenschaften → Druck → Druck-Stilklassen),
  2. globale Stilklassen (app_settings, Schlüssel print.styleClasses),
  3. eingebauter Standard (Arial 10 pt schwarz).

Einzelne Abweichungen gehen in kc:printPos.inlineStyle:

"kc:printPos": {
  "x": 20.32, "y": 169.51, "width": 183.68, "height": 5.93,
  "styleClass": "Default_12pt",
  "inlineStyle": { "font-weight": "bold" }
}

Linien und Rahmen

Zu einem Vordruck gehören auch Rahmen um Abschnitte und Trennlinien.

kc:line — Linie

"line_person_h": {
  "type": "string",
  "kc:line": { "lineColor": "#000000", "lineWidth": 0.1, "dashType": "solid" },
  "kc:printPos": { "x": 20.15, "y": 204.15, "width": 183, "height": 0, "zOrder": 1 }
}

dashType: solid, dashed oder dotted (bei dashed zusätzlich dashSize und gapSize). Höhe 0 = waagrecht, Breite 0 = senkrecht, beides gesetzt = diagonal.

kc:box — Rechteck

"box_person": {
  "type": "string",
  "kc:box": { "lineColor": "#000000", "fillColor": "transparent", "lineWidth": 0.1 },
  "kc:printPos": { "x": 20.15, "y": 194.15, "width": 183, "height": 20, "zOrder": 0 }
}

fillColor: "transparent" (oder leer) zeichnet nur den Umriss, eine Farbe füllt den Hintergrund. Z-Reihenfolge 0 legt Rahmen unter Texte und Linien.

Im Baukasten gibt es dafür im Ordner Layout „Trennlinie (horizontal)", „Trennlinie (vertikal)" und „Rahmen-Box". Linien und Rahmen zeichnet auch das Web-Formular (im Absolut-Modus an ihrer Position); Eingabefelder liegen dabei immer über den Rahmen.

Nur-Druck- und Nur-Web-Elemente

  • kc:visible: false blendet ein Element im Web aus; gedruckt wird es trotzdem (der Druck prüft nur kc:printable). So entstehen reine Druck-Beschriftungen.
  • Umgekehrt: Abschnittsüberschriften, die nur der Web-Gliederung dienen, bekommen kc:printable: false — im PDF liefert das gestaltete Blatt seine eigenen Überschriften.

Beispiel: Hybrid

Eine bequeme Web-Erfassung mit Abschnitten und 3-Spalten-Raster und ein millimetergenauer Ausdruck aus demselben Formular:

{
  "type": "object",
  "kc:layout": "horizontal-3",
  "kc:document": { "layoutMode": "hybrid" },
  "kc:pdfFieldBorders": false,
  "kc:printStyleClasses": { },
  "kc:pages": [{ "id": "Seite1", "title": "Antrag", "format": "A4" }],
  "properties": {
    "_web_sec_person": {
      "type": "string", "kc:section": true, "title": "I. Angaben zur Person",
      "kc:colspan": "full", "kc:printable": false
    },
    "Nachname": {
      "type": "string", "title": "Nachname", "kc:maxLength": 30,
      "kc:printPos": { "x": 21.18, "y": 198.52, "width": 66, "height": 5,
                       "styleClass": "Default", "zOrder": 2 }
    },
    "lbl_nachname": {
      "type": "string", "kc:visible": false,
      "kc:text": { "content": "Nachname:", "level": "p" },
      "kc:printPos": { "x": 21.18, "y": 194.44, "width": 19.98, "height": 3.78,
                       "styleClass": "Default_8pt", "zOrder": 1 }
    }
  }
}

Das Web zeigt den Abschnitt „I. Angaben zur Person" und das Feld „Nachname" in der ersten Spalte. Das PDF zeichnet die Beschriftung „Nachname:" und darunter den Wert — an den Millimeter-Positionen der Vorlage.

Beispielformular

Das Beispielformular Reiterplakette Stadt Hagen (Katalog Öffentlich, installierbar unter System-Administration → Formular-Bausteine → Beispiele) nutzt alle Mechaniken dieser Seite: Stilklassen, Druckpositionen, reine Druck-Beschriftungen, Linien und Rahmen, dazu eine parallele Web-Gliederung. Öffne es im Formular-Editor, um den Druck-Canvas mit fertig platzierten Feldern zu sehen.


Der Druck-Canvas im Formular-Editor

Im Hybrid- und Absolut-Modus zeigt den Formular-Editor statt der fließenden Vorschau ein Blatt Papier: Felder mit der Maus ziehen, Lineale am Rand, Einrastraster.

Was du im Canvas siehst

  • Ein A4-Blatt (210 × 297 mm) bei 96 dpi — 1 mm = 3,78 Pixel. Standard-Zoom 100 %.
  • Lineale oben und links in mm: beschriftete Striche alle 10 mm, Mittelstriche alle 5 mm, ab 75 % Zoom Millimeterstriche.
  • Eine Leiste oben: Status („A4 hochkant · X platziert · Y offen"), Raster („aus / 1 / 5 / 10 mm"), Zoom (50–150 %).
  • „Noch nicht platziert", sobald Felder ohne Druckposition vorliegen — mit Knopf zur automatischen Platzierung.
  • Kopf- und Fußbereich als schraffierte Zonen, wenn eine Kopf- oder Fußzeile definiert ist.

Felder bewegen

Klick auf ein Feld wählt es aus; acht Anfasser erscheinen rundum.

Ziehen auf der Feldfläche verschiebt das Feld; die Koordinaten stehen live darunter („45,3, 102,7 mm"). Loslassen übernimmt die Position.

Ziehen an einem Anfasser ändert die Größe (Mindestgröße 5 × 5 mm, höchstens bis zum Papier- bzw. Kopf-/Fußrand).

Esc während des Ziehens bricht ab; das Feld springt zurück.

Mehrere Felder gleichzeitig

Strg-/Cmd-Klick fügt ein Feld der Auswahl hinzu. Ziehen auf einem ausgewählten Feld bewegt die ganze Gruppe.

Auf freier Fläche ziehen zeichnet einen Auswahlrahmen; Felder, die ihn berühren, kommen in die Auswahl. Mit Umschalt beim Start wird die Auswahl erweitert statt ersetzt.

Ab zwei ausgewählten Feldern erscheint eine Leiste zum Ausrichten und Verteilen:

Symbol Funktion
⫷ linksbündig
⇔ horizontal zentriert
⫸ rechtsbündig
⫶ oben/unten bündig
⇕ vertikal zentriert
⇿ horizontal gleichmäßig verteilen (ab 3 Feldern)
⇳ vertikal gleichmäßig verteilen (ab 3 Feldern)

Jeder Schritt lässt sich mit Strg+Z rückgängig machen.

Einrastraster

Standardmäßig rastet Ziehen und Größenänderung auf 5 mm ein — umschaltbar auf aus / 1 / 5 / 10 mm; das aktive Raster erscheint als Punktmuster.

Umschalt während des Ziehens kehrt das Verhalten um: bei aktivem Raster frei, bei ausgeschaltetem Raster auf 1 mm.

Das Raster wirkt auf die Bewegung, nicht auf die Endposition. Felder mit krummen Koordinaten (z. B. 23,7 mm aus einem Import) behalten ihren Versatz und bewegen sich in 5-mm-Schritten von dort weg.

Felder neu hinzufügen

Ein Element aus dem Baukasten auf das Papier ziehen — das Blatt bekommt einen farbigen Rand. Loslassen legt das Feld an der Mausposition an, mit Standardgröße:

  • Texteingabe, Zahl, Datum: 60 × 8 mm
  • Abschnitt, Leittext: 100 × 6 mm
  • Textbereich: 80 × 30 mm

Ein fließendes Formular umstellen

Felder ohne Druckposition stehen unter „Noch nicht platziert". „Alle automatisch platzieren" packt sie von oben nach unten auf das Blatt:

  • Start 20 mm unter dem oberen Rand (bzw. unter der Kopfzeile).
  • Links 20 mm, Breite 170 mm.
  • Höhe nach Art: 6 mm für Abschnitte und Leittexte, 30 mm für Textbereiche, sonst 8 mm; vor Überschriften 4 mm Luft.
  • Reihenfolge wie im Schema.

Bereits positionierte Felder bleiben unverändert. Strg+Z nimmt die ganze Platzierung in einem Schritt zurück.

Leittexte im Ausdruck

Ein positioniertes Feld druckt standardmäßig nur seinen Wert — Vordrucke bringen ihre Beschriftung meist als eigene Textelemente mit. Für selbst gebaute Druckbilder gibt es im Reiter Druck die Einstellung „Leittext im Ausdruck":

Einstellung Wirkung
kein Leittext (Standard) nur der Wert
links neben dem Wert Titel in eigener Spalte links (Standard 55 mm), Wert rechts
über dem Wert Titel in einem 4,5 mm hohen Band über dem Wert

Der Leittext liegt innerhalb des Rechtecks — das Feld wird dadurch nicht größer. Der Canvas zeigt die Aufteilung mit einer gestrichelten Trennlinie, genau wie sie gedruckt wird.

„Alle automatisch platzieren" setzt bei Eingabefeldern von sich aus links. Überschriften und Leittexte bekommen keine Spalte.

Zwei Knöpfe in der Canvas-Leiste

  • „Leittexte anschalten (n)" — gibt allen platzierten Eingabefeldern ohne Leittext auf einmal eine Leittext-Spalte.
  • „Leittexte ausleiten (n)" — macht aus jeder Leittext-Spalte ein eigenes kc:text-Element an derselben Stelle. Danach lässt es sich frei verschieben, mehrzeilig setzen und eigens gestalten.

Das ist eine Einbahnstraße: Aus freien Textelementen wird keine Spalte mehr. Solange du keinen Feinschliff brauchst, ist die Spalte am Feld die bessere Wahl — sie zieht beim Verschieben, Umbenennen und Übersetzen mit.

Abschnittsüberschriften

Ein Feld mit kc:section druckt an seiner Position als Überschrift: feine Linie an der Oberkante, darunter der Titel in Abschnittsfarbe. Die Schriftgröße folgt kc:sectionLevel (18/15/13 pt) und wird verkleinert, wenn das Rechteck zu flach ist. kc:sectionStyle: "spacing" lässt die Linie weg.

Wenn der Text nicht passt

Ein positioniertes Feld hat eine feste Höhe, sein Inhalt nicht. Was passiert, wenn mehr Text eingegeben wird, als der Kasten fasst, legst du im Reiter Druck unter „Wenn der Text nicht passt" fest — oder für das ganze Formular in den Formular-Eigenschaften unter „Text passt nicht in sein Druckfeld". Die Einstellung am Feld schlägt die des Formulars.

Einstellung Schlüssel Was im Ausdruck passiert
Überdrucken (keiner) Der Text läuft über den Kasten hinaus. Der Server schreibt eine Warnung ins Log.
Abschneiden clip Nur die Zeilen, die in den Kasten passen; die letzte endet mit „…".
Schrift verkleinern shrink Die Schrift wird in halben Punkten verkleinert, bis der Text passt — höchstens bis zur kleinsten Schrift (Standard 7 pt). Reicht das nicht, greift die Folgestufe „Reicht auch das nicht" in Originalgröße.
Wachsen bis zur Fußzeile grow Der Kasten wird so hoch wie nötig, höchstens bis zur Fußzeile. Alles darunter rückt nach. Was dann noch nicht passt, wird abgeschnitten.
Wachsen + Fortsetzungsseite continue Wie Wachsen; der Rest kommt auf eine Fortsetzungsseite mit Standardkopf und -fuß, unter der Überschrift „Feldtitel (Fortsetzung)" über die volle Breite. Felder, die durch das Nachrücken nicht mehr aufs Blatt passen, wandern mit — mit unveränderten Abständen untereinander.
Kasten bleibt, Rest als Anlage annex Das Blatt bleibt exakt unverändert. Im Kasten steht der Anfang und „… Fortsetzung siehe Anlage 1", der volle Text folgt am Dokumentende auf einer eigenen Seite „Anlage 1 – Feldtitel". Die Wahl für amtliche Vordrucke, deren Layout sich nicht verschieben darf.

Im Schema:

"kc:printPos": {
  "x": 20, "y": 190, "width": 170, "height": 30,
  "overflow": "shrink",
  "overflowMinSizePt": 8,
  "overflowThen": "continue"
}

Formular-Standard: "kc:document": { "printOverflow": "continue" }.

Was nachrückt

Alles, was unterhalb des wachsenden Feldes beginnt — unabhängig davon, ob es direkt darunter liegt oder seitlich versetzt. Nur so bleiben getrennt gesetzte Leittexte bei ihrem Wert. Was in derselben Zeile wie das wachsende Feld steht (etwa ein Leittext links daneben), bleibt stehen. Wachsen zwei Felder nebeneinander unterschiedlich weit, rückt der Inhalt darunter um das größere Wachstum nach.

Ein Element, das schon ohne Nachrücken über die Fußzeile ragt, bleibt, wo es ist — das gilt als Gestaltung des Vordrucks, nicht als Überlauf.

Grenzen

  • Die Seitenzahl ${document:pages} in positionierten Texten zählt Fortsetzungs- und Anlagenseiten mit, allerdings geschätzt. Die Seitenzahlen in Kopf- und Fußzeilen stimmen immer exakt.
  • Ein Element, das nicht wachsen darf und höher ist als eine ganze Seite (etwa ein großes Bild), wird nicht geteilt.
  • Die Schrift im Absolut-Druck ist Helvetica; Messung und Druck nutzen dieselbe Schrift, damit die geplanten Höhen stimmen.

Lange Texte laufen über so viele Fortsetzungsseiten wie nötig. Stehen mehrere lange Felder untereinander, setzen sie sich nacheinander fort: erst der Rest des oberen Feldes, dann das nächste Feld, das dort wieder wächst und bei Bedarf eine weitere Folgeseite beginnt — bis alles gedruckt ist.

Kopf- und Fußbereich

Hat das Formular eine Kopf- oder Fußzeile (eigene oder aus einer Druckvorlage), berücksichtigt der Canvas das automatisch:

  • Die Höhen kommen aus kc:document.header.heightMm / footer.heightMm bzw. aus der Druckvorlage.
  • Beide Zonen erscheinen schraffiert; der Tooltip nennt die Höhe.
  • Felder lassen sich nicht in diese Zonen ziehen. Soll ein Feld bewusst darüber liegen, das Band kleiner machen oder die Position im JSON-Editor eintragen.
  • Die automatische Platzierung beginnt unter der Kopfzeile.

Im Ausfüllmodus

Im Absolut-Modus zeigt auch das Web-Formular ein A4-Blatt mit denselben Positionen — der Anwender sieht dasselbe Bild wie beim Bearbeiten im Formular-Editor und später im PDF (ab 1024 px Fensterbreite). Das ältere Schema-Flag kc:absoluteLayout: true wirkt weiterhin wie der Absolut-Modus.

Tastatur

Taste Wirkung
Strg-/Cmd-Klick Feld zur Auswahl hinzufügen / entfernen
Umschalt beim Auswahlrahmen Auswahl erweitern
Umschalt beim Ziehen Raster umkehren (an ↔ aus)
Esc beim Ziehen abbrechen, zurück zur Ausgangsposition
Strg+Z / Strg+Y Rückgängig / Wiederholen

Was der Canvas nicht kann

  • Eine Canvas-Seite = eine Druckseite. Mehrseitige Vordrucke baust du über kc:pages und wechselst über die Seiten-Tabs.
  • Keine gemeinsame Größenänderung mehrerer Felder.
  • Keine Drehung — Felder bleiben achsparallel.
  • Kein Zoom einzelner Felder — der Zoom skaliert das ganze Blatt.