Sign inSign up

adamopoa/pdf-accessibility

By adamopoa

•Updated 5 months ago

Drop a PDF in, get a WCAG 2.2 / PDF/UA-1 / WTPDF-compliant one back. All local. veraPDF-verified.

Image
Integration & delivery
Machine learning & AI
1

1.6K

adamopoa/pdf-accessibility repository overview

⁠pdf-accessibility — Programmatic PDF Accessibility Remediation

Drop in any untagged PDF → get back a WCAG 2.2 / PDF/UA-1 (ISO 14289-1) / WTPDF 1.0 Accessibility compliant document. 100% local. No Adobe subscription, no cloud round-trip, no data leaves your network.

pdf_a11y web app — upload form with VLM connection check and the remediation start button


⁠Quick start

docker run -d --name pdf-a11y -p 8000:8000 \
  -e VLM_BASE_URL="http://your-vlm-host:1234/v1" \
  -e VLM_MODEL="qwen/qwen3-vl-30b" \
  -v pdf-a11y-jobs:/data/jobs \
  adamopoa/pdf-accessibility:latest

Open http://<host>:8000 — that's the upload form pictured above.

Also published on GitHub Container Registry as ghcr.io/adamopoulosa1980/pdf-accessibility:latest if you prefer GHCR (no pull-rate limits).


⁠What's inside the image

  • Python 3.11 + the pdf_a11y remediation pipeline
  • default-jre-headless for the opendataloader-pdf structure tagger (local, Apache 2.0)
  • veraPDF 1.30.1 for PDF/UA-1 and WTPDF 1.0 Accessibility validation
  • FastAPI web app on port 8000 — browser UI and a headless OpenAPI at /docs
  • The bundled example PDF at /app/examples/ so you can try it without supplying one

The only external dependency at runtime is a vision-model endpoint (any OpenAI-compatible server — LM Studio, vLLM, llama.cpp server, Ollama, …) for image alt text. Cloud Anthropic / OpenAI are supported via the config file.

⁠The pipeline

opendataloader tagging → artifact-wrap pass → shared-Form-XObject cleanup → reading-order analysis → table header detection → VLM-driven alt text → form-field labels → contrast remediation → language-of-parts detection → WTPDF profile fixes → veraPDF validation.

On the bundled European Commission A short guide to the EU (36 pages, ~10 MB): veraPDF PDF/UA-1 0/106 failures, veraPDF WTPDF 1.0 Accessibility 0/1723 failures.

⁠Live progress in the UI

Remediation progress — green-tick checklist of completed pipeline stages with an active veraPDF validation pass

⁠Compliance pills + downloads

Remediation complete — both PDF/UA-1 and WTPDF 1.0 Accessibility show "compliant" pills, with download cards for the remediated PDF and the two veraPDF reports

⁠Human-in-the-loop review

Optional Review image descriptions screen lets a non-technical reviewer audit every AI-generated alt text, edit it, or mark images decorative — then re-run with the corrections merged in.

Review image descriptions grid

⁠Headless API for CI/CD

Interactive OpenAPI docs are at /docs:

FastAPI auto-generated OpenAPI docs — every endpoint of the headless API listed with try-it-out forms

Endpoints include POST /api/jobs, GET /api/jobs/{id}, GET /api/jobs/{id}/download/{kind}, POST /api/jobs/{id}/refine, and POST /api/test-vlm for VLM-endpoint health checks.


⁠Tags

TagSource
:latestMost recent GitHub release
:v2.3, :v2.4, …Pinned versions — one per GitHub release tag (recommended for production)

⁠Environment variables

VarDefaultPurpose
VLM_BASE_URLhttp://localhost:1234/v1Vision-model server pre-filled in the UI
VLM_MODELqwen/qwen3-vl-30bVision-model name pre-filled in the UI
VLM_API_KEY(unset)Deployment-wide VLM API key (used when a user leaves it blank)
MAX_CONCURRENT_JOBS1Documents processed in parallel
JOB_RETENTION_HOURS24How long finished jobs survive before cleanup
MAX_UPLOAD_MB200Upload size cap
VERAPDF_PATH/opt/verapdf/verapdfveraPDF launcher inside the image
JOBS_DIR/data/jobsWhere uploads/results live — mount a volume here

⁠Volume

Mount /data/jobs to a named volume (-v pdf-a11y-jobs:/data/jobs) so uploads and results survive container restarts.

⁠Healthcheck

Built-in: GET /health → {"status":"ok","verapdf":true}. Docker reports the container as healthy once veraPDF is reachable on the wired-in path.


⁠Source, sponsor, contact


© 2026 ASSERT I.K.E. — Maintained by Alex Adamopoulos.

Tag summary

Content type

Image

Digest

sha256:c27ae6393…

Size

244.9 MB

Last updated

5 months ago

docker pull adamopoa/pdf-accessibility