Een Kubernetes-gebaseerde pipeline voor het converteren van PDF en DOCX documenten naar toegankelijke HTML documenten volgens de NLdoc specificatie.
- 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
βββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β 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 β
ββββββββββββββββββββ
| 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 |
station-document-source: Ontvangt uploads, start pipelinestation-spec-html: CoΓΆrdineert spec β HTML conversiehtml-writer: Converteert NLdoc spec JSON naar toegankelijke HTML
- Kubernetes cluster met:
- ArgoCD
- RabbitMQ Operator
- MinIO
# Deploy de NLdoc applicatie
kubectl apply -f gitops/apps/nldoc/application.yaml
# Deploy custom workers
kubectl apply -f folio-spec-worker-pod.yaml# 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.pycurl -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"
}]
}curl -L https://api.nldoc.commonground.nu/file/{output-id}.html -o output.htmlDe 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| 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 |
# 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 -fkubectl -n nldoc exec rabbitmq-server-0 -c rabbitmq -- rabbitmqctl list_queues name messages# 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-conversion.ps1 -TestFile "document.docx"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>Dit project maakt deel uit van het NLdoc ecosysteem voor toegankelijke overheidsdocumenten.
EUPL-1.2