Der Webport vom Computertruhe Berechtigungsnachweis-Erstellungs-Assistenten Originaler Code unter: https://codeberg.org/computertruhe/BEA
  • JavaScript 79.9%
  • CSS 7.5%
  • Python 6.4%
  • HTML 6.2%
Find a file
Philipp Skotnik 5ee6a2b105 Merge branch 'main' of ssh://git.chch.it:2223/agentk/CT-BEA-Web
Merge Readme into local repo
2026-09-02 21:09:51 +02:00
assets Initial Commit 2026-09-02 20:44:03 +02:00
css Initial Commit 2026-09-02 20:44:03 +02:00
js Tweaked Formatting in Long Text Scenarios 2026-09-02 21:09:11 +02:00
test Tweaked Formatting in Long Text Scenarios 2026-09-02 21:09:11 +02:00
tools Initial Commit 2026-09-02 20:44:03 +02:00
vendor Initial Commit 2026-09-02 20:44:03 +02:00
index.html Initial Commit 2026-09-02 20:44:03 +02:00
LICENSE Initial Commit 2026-09-02 20:44:03 +02:00
manifest.webmanifest Initial Commit 2026-09-02 20:44:03 +02:00
README.md Merge branch 'main' of ssh://git.chch.it:2223/agentk/CT-BEA-Web 2026-09-02 21:09:51 +02:00
sw.js Initial Commit 2026-09-02 20:44:03 +02:00

BEA-Web

Browser-Portierung der GTK-Anwendung Berechtigungsnachweis-Erstellungs-Assistentin des Computertruhe e. V. Formular ausfüllen, Fotos oder PDF-Scans anhängen, PDF/A-3b exportieren.

Die Anwendung sendet nichts. Es gibt zur Laufzeit keine einzige Netzwerkanfrage: Bibliotheken, Schriften, Farbprofil und Logo liegen im Anwendungsverzeichnis, die PDF-Datei entsteht im Browser und wird über einen Blob-Download ausgegeben. Die Content-Security-Policy im <head> erlaubt keine externen Quellen und keine Formularziele.

Betrieb

Den Ordner auf einen beliebigen Webserver kopieren (auch Pages-Hosting). Zum Ausprobieren genügt:

python3 -m http.server -d bea-web 8000

Ein Webserver ist nötig, weil Schriften, Logo und Farbprofil per fetch geladen werden; das unterbindet der Browser bei file://.

Empfohlen wird für den Betrieb langfristig, einen Caddy Webserver aufzusetzen.

Ein Service Worker legt beim ersten Aufruf alle Dateien in den Cache. Danach läuft die Anwendung ohne Netzverbindung weiter, und über das Web-App-Manifest lässt sie sich auf dem Gerät installieren. Nach Änderungen an den Dateien die Zahl in CACHE = "bea-v1" in sw.js erhöhen, sonst liefert der Cache weiter die alte Fassung.

Aufbau

index.html            Formular, Anhänge, Export-Einstellungen
css/style.css
js/pdf-builder.js     Seitensatz – Portierung von draw_pdf() aus bea.c
js/pdfa.js            PDF/A-3b: XMP, OutputIntent, Dokument-ID, Anhänge
js/app.js             Oberfläche, Anhangsverwaltung, Vorschau, Export
sw.js                 Service Worker für den Offline-Betrieb
manifest.webmanifest
vendor/               pdf-lib, @pdf-lib/fontkit, pdf.js, bidi-js
assets/               DejaVu Sans, Logo, sRGB-Profil
tools/make-srgb-icc.py  erzeugt assets/sRGB.icc

js/pdf-builder.js und js/pdfa.js laufen auch unter Node, damit sich der Seitensatz ohne Browser testen lässt:

node test/layout-test.js    Geometrie, Umbruch, Bidi, PDF/A-Struktur
node test/ui-smoke.js       Oberfläche unter jsdom

Seitenaufteilung

Der Satz läuft in drei Blöcken:

  1. Seite 1 – Kopfdaten, Geräteliste und Notizen, soweit sie auf die Seite passen. Was nicht mehr hinpasst, wird nicht umbrochen, sondern zurückgestellt.
  2. Seite 2 – die Überschrift „Kopie des Berechtigungsnachweises", darunter 15 pt zusätzlicher Abstand, dann der erste Anhang, skaliert auf die verbleibende Fläche dieser Seite. Bei einem PDF-Anhang bleibt die Seite dabei vektoriell (drawPage mit Zielgröße), sofern die Rasterung abgeschaltet ist.
  3. Danach – weitere Anhänge je auf einer eigenen Seite, anschließend der zurückgestellte Rest des Formulars unter der Überschrift „Notizen / Anmerkungen", ebenfalls mit dem Zusatzabstand darunter.

Textblöcke, die höher sind als der verbleibende Platz, werden zeilenweise aufgeteilt und laufen auf der Folgeseite weiter. Der Rahmen wird dabei pro Seitenabschnitt gezeichnet. Ohne das stünde bei einem sehr langen Notiztext die Überschrift allein auf einer Seite und der Text erst auf der nächsten.

Der Nachweis liegt damit immer auf Seite 2, unabhängig davon, wie lang die Geräteliste oder die Notizen werden. Gibt es keinen Anhang, entfällt der erzwungene Umbruch und das Formular bleibt einseitig.

Gleich zur GTK-Fassung

Feldnamen, Gerätetypen, Seitengeometrie (A4 595×842 pt, 72 pt Rand, 10 pt Elementabstand), Schriftgrößen, Rahmen (0,3 pt, 50 % Grau), Bildskalierung (get_scaled_size 1:1 portiert), DPI- und JPEG-Einstellungen, Drehen und Umsortieren der Anhänge, seitenweise Übernahme weiterer PDF-Anhänge in Originalgröße, Vorschau-Zoom 64–1024 px, Strg+O und Strg+S.

Statt der Systemschrift über Pango wird DejaVu Sans eingebettet (Teilmenge, rund 10 kB pro PDF). Dieselbe Schrift zeigen auch die Eingabefelder, damit Bildschirm und PDF übereinstimmen.

PDF/A-3b

Der Export erzeugt standardmäßig PDF/A-3b:

  • XMP-Paket mit pdfaid:part=3, pdfaid:conformance=B, unkomprimiert
  • OutputIntent GTS_PDFA1 mit eingebettetem sRGB-Profil (ICC v2.1 – PDF/A verlangt Version ≤ 4.2). Das Profil wird von tools/make-srgb-icc.py aus den Kennwerten der IEC 61966-2-1 berechnet, es stammt also nicht aus einer fremden Quelle mit eigener Lizenz.
  • Datei-Kennung im Trailer, übereinstimmende Angaben in Info-Dictionary und XMP, vollständig eingebettete Schriften mit ToUnicode, keine Verschlüsselung
  • Originaldateien der Anhänge als eingebettete Dateien mit /AFRelationship /Source – dafür ist PDF/A-3 gemacht. Abschaltbar.

Wichtig: Fremde PDF-Anhänge erfüllen die Norm oft nicht (nicht eingebettete Schriften, geräteabhängige Farben, Transparenzgruppen). Werden sie unverändert übernommen, kann die Ausgabedatei die Norm verletzen. Die Voreinstellung wandelt PDF-Anhänge deshalb in Bilder um; Seitengröße und Drehung bleiben erhalten, der Textinhalt der Anhänge wird dabei aber zu Pixeln. Wer die Anhänge durchsuchbar braucht, schaltet die Umwandlung ab und prüft das Ergebnis.

Die Konformität ist gegen die Norm implementiert und strukturell getestet, aber nicht mit einem Prüfprogramm verifiziert

Leserichtung

Texte werden nach dem Unicode Bidi Algorithm (bidi-js) umgeordnet, arabische und hebräische Schrift von fontkit korrekt geformt und verbunden, Klammern gespiegelt. Zeilen brechen zeichengenau um und werden entsprechend der Absatzrichtung ausgerichtet.

Steht das Dokument auf rechts-nach-links, spiegelt sich das ganze Layout an der Seitenmitte: das Logo wandert nach links, Beschriftungen und Kästen tauschen die Spalten, Werte stehen rechtsbündig. Mittig gesetzte Elemente (dazu gehören alle angehängten Bilder und Scans) bleiben mittig, weil es an einer Zentrierung nichts zu spiegeln gibt.

Die Voreinstellung automatisch leitet die Richtung aus dem eingegebenen Text ab; sie lässt sich fest auf eine der beiden Richtungen stellen.

Lizenzen

Die Anwendung steht wie das Original unter GPL-3.0-or-later (LICENSE). Mitgelieferte Fremdbestandteile: pdf-lib und @pdf-lib/fontkit (MIT), pdf.js (Apache-2.0), bidi-js (MIT, vendor/LICENSE-bidi-js.txt), DejaVu Sans (Bitstream-Vera-Lizenz, assets/fonts/LICENSE-DejaVu.txt).