Biblioteka do generowania wizualizacji PDF faktur oraz UPO na podstawie plików XML.
Obsługuje serwer Node.js API (backend).
Projekt składa się z trzech głównych komponentów:
- Generowanie PDF po stronie klienta (przeglądarka)
- Eksportowana jako pakiet npm
- Używa pdfMake i fast-xml-parser
- Interfejs webowy do testowania biblioteki
- Uruchamiany przez Vite (dev server)
- Dostępny pod adresem
http://localhost:5173
- REST API do generowania PDF-ów po stronie serwera
- Używa tej samej biblioteki co frontend (dzięki browser polyfills)
- Port:
3000(domyślnie) - Technologie: Express.js, TypeScript, Docker
Przed rozpoczęciem upewnij się, że masz zainstalowane:
- Node.js w wersji 22.14.0 lub nowszej. Sprawdź wersję:
node --versionPobierz z: https://nodejs.org - npm (instalowany automatycznie z Node.js). Sprawdź wersję:
npm --versionZalecana: 10.x lub nowsza - Docker (opcjonalnie, dla konteneryzacji). Pobierz z: https://www.docker.com/ ### 0.2 Sklonuj repozytorium
git clone https://github.com/LeMobi-Software/ksef-pdf-generator
cd ksef-pdf-generatorPo sklonowaniu repozytorium, zainstaluj wszystkie wymagane pakiety:
# Instaluj zależności
npm installAlternatywnie (zalecane dla CI/CD i produkcji):
# npm ci instaluje dokładnie wersje z package-lock.json
npm ci| Komenda | Kiedy używać | Opis |
|---|---|---|
npm install |
Rozwój lokalny | Instaluje/aktualizuje zależności, może zmieniać package-lock.json |
npm ci |
CI/CD, produkcja | Instaluje dokładne wersje z package-lock.json, szybsze, deterministyczne |
Po instalacji sprawdź, czy wszystko działa:
# Sprawdź zainstalowane pakiety
npm list --depth=0
# Sprawdź czy nie ma problemów
npm audit
# Opcjonalnie: napraw podatności
npm audit fixOczekiwany output:
ksef-pdf-generator@0.0.42
├── @kmf/ksef-fe-invoice-converter@0.0.42
├── express@5.0.1
├── typescript@5.7.3
└── ... (pozostałe pakiety)`
Rozwiązanie 1: Wyczyść cache i node_modules
# Usuń node_modules i package-lock.json
rm -rf node_modules package-lock.json
# Wyczyść cache npm
npm cache clean --force
# Zainstaluj ponownie
npm installRozwiązanie 2: Użyj innej wersji Node.js
# Zainstaluj nvm (Node Version Manager)
# Windows: https://github.com/coreybutler/nvm-windows
# Linux/Mac: https://github.com/nvm-sh/nvm
# Zainstaluj Node.js 22
nvm install 22
nvm use 22
# Zainstaluj zależności
npm installRozwiązanie 3: Sprawdź uprawnienia (Linux/Mac)
# Jeśli błędy związane z uprawnieniami
sudo chown -R $(whoami) ~/.npm
sudo chown -R $(whoami) node_modules`Projekt zawiera następujące skrypty npm (zdefiniowane w package.json):
npm run build:lib # Zbuduj bibliotekę (frontend)
npm run build:server # Zbuduj serwer Node.js
npm run build # Zbuduj bibliotekę + serwer`npm start # Uruchom serwer produkcyjny (wymaga wcześniejszego buildu)npm test # Uruchom testy
npm run test:ui # Uruchom testy z interfejsem graficznym
npm run test:ci # Uruchom testy z raportem coverage`# Wyczyść projekt
rm -rf node_modules dist dist-server npm installSerwer Node.js pozwala generować PDF-y faktur i UPO poprzez REST API. Używa tej samej biblioteki co frontend, dzięki systemowi browser polyfills.
Biblioteka KSeF została pierwotnie stworzona dla przeglądarek i wykorzystuje Browser API:
Blob,File,FileReaderdocument.createElementURL.createObjectURL
Rozwiązanie: Plik src/server/browser-polyfills.ts emuluje te API w Node.js, dzięki czemu:
✅ Nie trzeba przepisywać kodu biblioteki
✅ Frontend i backend używają tej samej logiki
✅ Łatwa aktualizacja biblioteki bez zmian w backendzie
ksef-pdf-generator/
├── src/
│ └── server/ # Node.js API Server│
│ ├── pdfService.ts # Serwis generujący PDF (wrapper dla biblioteki)
│ └── browser-polyfills.ts # Emulacja Browser API dla Node.js
└── server.ts # Express server (REST API)
# Build serwera
npm run build:server
# Start serwera
npm startSerwer uruchomi się pod adresem: http://localhost:3000
Request:
curl -X POST http://localhost:3000/invoice \
-H "Content-Type: text/xml" \
-H "X-KSeF-Number: 1234567890-20260121-ABC123XYZ-12" \
-H "X-KSeF-QRCode: https://qr-test.ksef.mf.gov.pl/invoice/..." \
--data @examples/invoice.xml \
-o invoice.pdfHeaders (opcjonalne):
X-KSeF-Number- Numer referencyjny KSeF (fallback:"Numer faktury nie został przydzielony")X-KSeF-QRCode- Link do QR code (fallback: pusty string)
Response:
- 200 OK - PDF (application/pdf)
- 400 Bad Request - Pusty XML
- 500 Internal Server Error - Błąd generowania PDF
Request:
curl -X POST http://localhost:3000/upo \
-H "Content-Type: text/xml" \
--data @examples/upo.xml \
-o upo.pdfResponse:
- 200 OK - PDF (application/pdf)
- 400 Bad Request - Pusty XML
- 500 Internal Server Error - Błąd generowania PDF
curl http://localhost:3000/healthResponse:
{
"status": "ok",
"timestamp": "2026-01-21T10:30:15.123Z"
}Serwer można uruchomić w kontenerze Docker.
docker build -t ksef-pdf-generator .docker run -d -p 3000:3000 --name ksef-server ksef-pdf-generator# Health check
curl http://localhost:3000/health
# Generowanie PDF
curl -X POST http://localhost:3000/invoice \
-H "Content-Type: text/xml" \
--data @examples/invoice.xml \
-o invoice.pdfJeśli chcesz zapisać obraz jako plik .tar (np. do przeniesienia na inny serwer):
# Zapisz obraz do pliku
docker save ksef-pdf-generator:latest -o ksef-pdf-generator.tar
# Lub skompresowany
docker save ksef-pdf-generator:latest | gzip > ksef-pdf-generator.tar.gz`
# Przywrócenie obrazu na innej maszynie
docker load -i ksef-pdf-generator.tar
# Uruchom
docker run -d -p 3000:3000 --name ksef-server ksef-pdf-generator# Wyświetl logi kontenera
docker logs ksef-server -f
# Wejdź do kontenera
docker exec -it ksef-server /bin/sh
# Zatrzymaj i usuń kontener
docker stop ksef-server
docker rm ksef-servercurl -X POST http://localhost:3000/invoice \
-H "Content-Type: text/xml" \
-H "X-KSeF-Number: 5555555555-20250808-9231003CA67B-BE" \
--data @examples/invoice.xml \
-o invoice.pdfcurl -X POST http://localhost:3000/upo \
-H "Content-Type: text/xml" \
--data @examples/upo.xml \
-o upo.pdfProjekt wykorzystuje Vite i Vitest jako framework testowy.
# Uruchom wszystkie testy
npm run test
# Testy z interfejsem graficznym
npm run test:ui
# Testy w trybie CI z raportem pokrycia
npm run test:ciRaport pokrycia: /coverage/index.html
ksef-pdf-generator/
├── src/
│ ├── components/ # Komponenty React (frontend)
│ ├── lib-public/ # Biblioteka generująca PDF
│ │ ├── services/ # Logika generowania PDF
│ │ ├── types/ # TypeScript typy (FA, UPO)
│ │ └── index.ts # Public API
│ └── server/ # Node.js API Server│
│ ├── pdfService.ts # Wrapper dla biblioteki
│ └── browser-polyfills.ts # Emulacja Browser API
├── examples/
│ ├── invoice.xml # Przykładowa faktura
│ └── upo.xml # Przykładowe UPO
├── server.ts # Express REST API
├── Dockerfile # Docker image definition
├── package.json
├── tsconfig.json
├── tsconfig.server.json
└── README.md
- Polsko-angielskie nazwy wynikają ze struktury schematu XML faktury KSeF
- Zapewnia spójność z oficjalną definicją danych
- Interfejsy TypeScript odzwierciedlają strukturę XML
- Zachowuje hierarchię i logiczne powiązania
- Typy definiowane w
types/oraz plikach*.types.ts - Wspierają generowanie PDF i walidację danych
- Vitest - https://vitest.dev/guide/
- Vite - https://vitejs.dev/guide/
- TypeScript - https://www.typescriptlang.org/docs/
- Express.js - https://expressjs.com/
- Docker - https://docs.docker.com/
- pdfMake - https://pdfmake.github.io/docs/
- Pliki XML muszą być zgodne z odpowiednią schemą (FA lub UPO)
- W przypadku problemów z Node.js, użyj nvm: https://github.com/nvm-sh/nvm
- Browser polyfills umożliwiają uruchomienie biblioteki frontendowej w Node.js
- Domyślny fallback dla
nrKSeF:"Numer faktury nie został przydzielony"
W razie pytań lub problemów, otwórz Issue na GitHubie: https://github.com/LeMobi-Software/ksef-pdf-generator/issues