- JavaScript 79.9%
- CSS 7.5%
- Python 6.4%
- HTML 6.2%
|
|
||
|---|---|---|
| assets | ||
| css | ||
| js | ||
| test | ||
| tools | ||
| vendor | ||
| index.html | ||
| LICENSE | ||
| manifest.webmanifest | ||
| README.md | ||
| sw.js | ||
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:
- Seite 1 – Kopfdaten, Geräteliste und Notizen, soweit sie auf die Seite passen. Was nicht mehr hinpasst, wird nicht umbrochen, sondern zurückgestellt.
- 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 (
drawPagemit Zielgröße), sofern die Rasterung abgeschaltet ist. - 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_PDFA1mit eingebettetem sRGB-Profil (ICC v2.1 – PDF/A verlangt Version ≤ 4.2). Das Profil wird vontools/make-srgb-icc.pyaus 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).