# XRechnungLeser

Wandelt eingehende E-Rechnungen in eine PDF/A-3b-Sichtfassung um, die jedes DMS wie eine normale PDF anzeigt,
zum Beispiel WINYARD. Die elektronische Rechnung selbst geht dabei nicht verloren: Sie steckt unverändert in der PDF.

| Eingang | Ausgang |
|---|---|
| XRechnung 3.0 / EN 16931 als UBL Invoice, UBL CreditNote oder UN/CEFACT CII | PDF/A-3b, Darstellung nach KoSIT-Visualisierung |
| ZUGFeRD-/Factur-X-PDF (XML wird aus dem Anhang gelesen) | Anhang `xrechnung.xml`: Original, byte-identisch |
| | Anhang `pruefbericht-kosit.xml`: Bericht des KoSIT-Validators |
| | Anhänge der Rechnung selbst (BT-125) |
| | letzte Seite „Prüfvermerk“ mit Prüfergebnis und SHA-256 |
| | optional `.json` mit Kerndaten für die Indexierung |

## Voraussetzungen

- Python 3.10 oder neuer, `pip install -r requirements.txt` (lxml, pypdf)
- Java 11 oder neuer, getestet mit Temurin 17. Gefunden wird es über `XRL_JAVA`, dann `vendor/jre/`, dann `PATH`.
- `python -m xrechnung_leser selbsttest` zeigt, ob alles da ist.

## Benutzung

```
xrechnung-leser.cmd umwandeln rechnung.xml [-a ZIELORDNER] [--metadaten] [--tabellarisch] [--ohne-pruefung]
xrechnung-leser.cmd ueberwachen EINGANG AUSGANG [--ungueltige ORDNER] [--metadaten] [--intervall 5] [--einmal]
```

Exit-Codes von `umwandeln`:
- 0: alles umgewandelt, alle Rechnungen gültig
- 2: alles umgewandelt, mindestens eine Rechnung vom Validator abgelehnt
- 1: mindestens eine Datei war nicht verarbeitbar

Bei `ueberwachen` landen die Originale nach der Verarbeitung in `EINGANG/erledigt/JJJJ-MM/`. Was nicht lesbar ist,
kommt nach `EINGANG/fehler/`, zusammen mit einer `.fehler.txt`. Gelöscht wird nichts. Fertige PDFs erscheinen im
Ausgang erst, wenn sie vollständig geschrieben sind (Zwischenname, danach Umbenennen). Das Protokoll steht in
`EINGANG/xrechnung-leser.log`.

## Wie es funktioniert

1. Saxon wandelt UBL/CII mit den KoSIT-Stylesheets in das syntaxneutrale xr-Format um.
2. Aus dem xr-Format erzeugt `xr-pdf.xsl` XSL-FO.
3. Das FO wird ergänzt: Anhänge, Metadaten, Seite „Prüfvermerk“.
4. Apache FOP setzt das FO im Modus PDF/A-3b, mit eingebetteter Schrift und ohne Ligaturen.

Parallel dazu prüft der KoSIT-Validator die Rechnung (Szenarien XRechnung 3.0.2 und EN 16931).

## Mitgelieferte Bausteine (`vendor/`)

| Baustein | Version | Lizenz | Quelle |
|---|---|---|---|
| KoSIT XRechnung-Visualisierung | 2026-08-31 (XRechnung 3.0.2) | Apache 2.0, Schrift Source Serif: OFL | github.com/itplr-kosit/xrechnung-visualization |
| KoSIT Validator + Konfiguration XRechnung | 1.6.3 / 3.0.2 (2026-08-31) | Apache 2.0 | github.com/itplr-kosit/validator |
| Saxon-HE + xmlresolver | 12.8 / 6.0.19 | MPL 2.0 / Apache 2.0 | Maven Central, SHA-1 geprüft |
| Apache FOP | 2.10 | Apache 2.0 | archive.apache.org, SHA-512 geprüft |

## Tests

```
pip install pytest
python -m pytest -q
```

Die Tests laufen gegen Rechnungen aus der offiziellen KoSIT-Testsuite. Die PDF/A-Konformität bestätigt veraPDF,
wenn `XRL_VERAPDF` gesetzt ist.
