--- title: "ubl-tools" description: "Læs e-fakturaer i UBL (Peppol BIS 3.0 og OIOUBL) i terminalen eller som en side du kan printe, og træk den vedhæftede PDF ud. Alt foregår på din egen maskine." date: 2026-09-30 updated: 2026-10-01 extra: lang: da repo: ubl-tools sprog: Rust licens: MIT OR Apache-2.0 platforme: [Linux, macOS, Windows] aur: [ubl-tools, ubl-tools-bin] tags: [peppol, oioubl, nemhandel, e-faktura, rust] alternates: [{lang: da, path: /projekter/ubl-tools}, {lang: en, path: /en/projects/ubl-tools}] --- En e-faktura er en XML-fil. Vil man læse en, skal man enten scrolle gennem et par hundrede linjer `cbc:` og `cac:`, eller uploade den til en online viewer. Viewerne virker fint, men de vil have hele fakturaen, og den indeholder navne, CVR-numre, bankoplysninger og hvad kunden har købt. Det har jeg det lidt stramt med at sende til en fremmed server bare for at kunne læse den. Så jeg skrev `ubl`. Den læser filen lokalt og viser den som en almindelig faktura: sælger og køber med deres identifikatorer navngivet ordentligt (CVR, GLN, SE-nr. og Peppol-endpoints i stedet for skemakoder som `0184`), linjerne med antal, enhed, pris og moms, momsopgørelsen pr. kategori og totalerne. Betalingsoplysningerne kommer med, også danske FI-kort i den velkendte `+71<…+…<`-notation. Er fakturaen pakket ind i en Peppol-kuvert (SBDH), pakker den den selv ud. Den forstår Peppol BIS Billing 3.0, OIOUBL 2.1 og andre EN 16931-fakturaer og kreditnotaer. OIOUBL har en lille finte, hvor `TaxExclusiveAmount` faktisk er momsbeløbet og ikke beløbet før moms.. det har den lært at tage højde for, så tallene passer. ## Installation På Arch Linux ligger den på AUR, både som kildepakke og som færdigbygget binær: ```bash yay -S ubl-tools # bygges fra kildekoden yay -S ubl-tools-bin # færdigbygget binær ``` På macOS via min Homebrew-tap: ```bash brew tap asger-weirsoee/tap brew install ubl-tools ``` På Windows 10/11 med Scoop: ```powershell scoop install https://asger.weirsoe.dk/tarballz/ubl-tools.json ``` Du kan også hente zip-filen fra [tarballz](/tarballz/) og pakke den ud. Binæren er ikke kodesigneret, så Windows spørger måske første gang den køres. ## Brug ```bash ubl view faktura.xml # i terminalen ubl view faktura.xml --open # som side i browseren ubl view faktura.xml --lang da # danske labels ubl extract faktura.xml anden.xml # gem PDF'en ved hver fil ubl extract *.xml -o ./bilag # eller alle i én mappe ubl open faktura.xml # gem bilag og åbn i browser ``` `ubl extract` overskriver aldrig noget. Ligger der allerede en identisk fil, genbruges den, og er den anderledes, får den nye et andet navn. På Windows kan du trække en eller flere XML-filer direkte over på `ubl.exe` i Stifinder, så gemmes PDF'erne og fakturaerne åbnes, og vinduet bliver stående til du har læst resultatet. HTML-siden er én selvstændig fil uden eksterne forespørgsler, sat op til A4, så den printer pænt. Skal du bare have afkodet en CustomizationID eller se hvilken profil en faktura følger, kan [UBL-tjekket](/ubl) her på siden gøre det direkte i browseren.