Skip to content

ConductionNL/NL_doc

Repository files navigation

NLdoc Document Conversion Pipeline

Een Kubernetes-gebaseerde pipeline voor het converteren van PDF en DOCX documenten naar toegankelijke HTML documenten volgens de NLdoc specificatie.

🎯 Functionaliteit

  • PDF β†’ HTML: Upload een PDF en ontvang een toegankelijk HTML document
  • DOCX β†’ HTML: Upload een Word document en ontvang een toegankelijk HTML document
  • Structuurbehoud: Headings, paragrafen en opmaak worden behouden
  • Toegankelijkheid: Output voldoet aan WCAG richtlijnen met ARIA attributen

πŸ—οΈ Architectuur

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Editor    │────▢│   NLdoc API      │────▢│   RabbitMQ      β”‚
β”‚  (Frontend) β”‚     β”‚   (Elixir)       β”‚     β”‚   (Message Bus) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                      β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚                                 β”‚                                 β”‚
                    β–Ό                                 β–Ό                                 β–Ό
           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
           β”‚ document-sourceβ”‚              β”‚ folio-spec      β”‚              β”‚ html-writer      β”‚
           β”‚     shim       │──────────────▢    worker       │──────────────▢   (Elixir)       β”‚
           β”‚   (Python)     β”‚              β”‚   (Python)      β”‚              β”‚                  β”‚
           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚                                                                β”‚
                    β”‚ Detecteert PDF/DOCX                                           β”‚
                    β”‚ en routeert naar                                              β–Ό
                    β”‚ juiste pipeline                                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚                                                      β”‚   MinIO          β”‚
                    └─────────────────────────────────────────────────────▢│   (Output)       β”‚
                                                                           β”‚   .html files    β”‚
                                                                           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“¦ Componenten

Custom Workers (in /workers/)

Worker Taal Functie
document-source-shim Python Detecteert bestandstype (PDF/DOCX) via magic bytes en routeert naar juiste pipeline
folio-spec-worker Python Extraheert tekst uit PDF (PyMuPDF) of DOCX (python-docx) en genereert NLdoc spec JSON
sse-bridge Python Bridgt SSE events naar de API met juiste filter headers

Kimi Stations (upstream)

  • station-document-source: Ontvangt uploads, start pipeline
  • station-spec-html: CoΓΆrdineert spec β†’ HTML conversie
  • html-writer: Converteert NLdoc spec JSON naar toegankelijke HTML

πŸš€ Deployment

Prerequisites

  • Kubernetes cluster met:
    • ArgoCD
    • RabbitMQ Operator
    • MinIO

Deploy via GitOps

# Deploy de NLdoc applicatie
kubectl apply -f gitops/apps/nldoc/application.yaml

# Deploy custom workers
kubectl apply -f folio-spec-worker-pod.yaml

Worker Pods

# folio-spec-worker (PDF/DOCX tekst extractie)
kubectl -n nldoc apply -f folio-spec-worker-pod.yaml

# SSE bridge (optioneel, voor editor events)
kubectl -n nldoc apply -f workers/sse-bridge/app.py

πŸ“‘ API Endpoints

Upload Document

curl -X POST https://api.nldoc.commonground.nu/conversion \
  -H "X-Target-Content-Type: text/html" \
  -F "file=@document.pdf"

Response:

{
  "data": [{
    "uuid": "abc123...",
    "filename": "document.pdf",
    "targetContentType": "text/html"
  }]
}

Download Result

curl -L https://api.nldoc.commonground.nu/file/{output-id}.html -o output.html

πŸ”§ Configuratie

RabbitMQ Bindings

De pipeline vereist de volgende bindings:

nldoc.topics β†’ results (specs.*)
nldoc.topics β†’ results (documents.*)

Deze kunnen worden toegevoegd via:

kubectl -n nldoc apply -f add-sse-binding.py  # Als Kubernetes Job

Environment Variables

Variable Default Beschrijving
AMQP_HOST rabbitmq.nldoc.svc.cluster.local RabbitMQ host
AMQP_PORT 5672 RabbitMQ port
MINIO_ENDPOINT minio.nldoc.svc.cluster.local:9000 MinIO endpoint

πŸ“Š Monitoring

Logs bekijken

# Document source shim
kubectl -n nldoc logs -l app.kubernetes.io/component=worker.document-source -f

# Folio spec worker
kubectl -n nldoc logs folio-spec-worker -f

# HTML writer
kubectl -n nldoc logs -l app.kubernetes.io/component=worker.elixir-workers -f

Queue status

kubectl -n nldoc exec rabbitmq-server-0 -c rabbitmq -- rabbitmqctl list_queues name messages

πŸ§ͺ Testing

Test DOCX conversie

# Upload
curl -s -X POST "https://api.nldoc.commonground.nu/conversion" \
  -H "X-Target-Content-Type: text/html" \
  -F "file=@document.docx" | jq .data[0].uuid

# Wacht op conversie (~10 sec)

# Download output
curl -L "https://api.nldoc.commonground.nu/file/{uuid}.html" -o output.html

Test script

./test-conversion.ps1 -TestFile "document.docx"

πŸ“ Output Formaat

De gegenereerde HTML bevat:

  • Semantische heading structuur (role="heading", aria-level)
  • Paragrafenindeling
  • Toegankelijke markup volgens WCAG

Voorbeeld output:

<!DOCTYPE html>
<html lang="nl">
<head><title>Document</title></head>
<body>
  <p role="heading" aria-level="1">Titel</p>
  <p>Eerste paragraaf...</p>
  <p role="heading" aria-level="2">Subtitel</p>
  <p>Meer content...</p>
</body>
</html>

🀝 Bijdragen

Dit project maakt deel uit van het NLdoc ecosysteem voor toegankelijke overheidsdocumenten.

πŸ“„ Licentie

EUPL-1.2

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages