Every PDF went through Docling's layout, OCR and TableFormer models, about
3 s a page (5.5 on table pages) plus an 11 s cold start and 1 GB of RSS.
A born-digital PDF already carries its text: pdfium reads it in about
7 ms a page with the page check.
A PDF is now read from its text layer when every page passes a per-page
check (no scans, scanner OCR layers, garbled or margin-only text, rotated
pages or filled form fields); otherwise Docling reads it as before. Pages
are joined with a blank line, soft hyphens are rejoined. Text-read PDFs
keep their figures through the figures-only pass: on first request, and at
idle priority when the file has images.
Measured through the upload route on an idle Ryzen 5800X: Executive
Summary (12 pp) 16.7 s -> 1.4 s, Operating Budget (46 pp) 125.6 s -> 9.0 s,
a 33-page spec 73 s -> 3.8 s. In a Basic-mode A/B on the Boston budget
corpus the shipped text scored 0.70 strict against 0.60 for Docling's
markdown; a second, smaller corpus is 2.9 points behind on table cells.
SURFSENSE_LOCAL_PDF_TEXT_LAYER=off restores Docling for every PDF.
ADR 0059.
Docling ingest runs on the CPU: Windows and Linux torch is CPU-only and
ADR 0012 ships no CUDA payload. This records why, where parse time goes
on a CPU, and the GPU routes with their payload and trade-offs (CUDA
torch, onnxruntime-gpu, DirectML, the ONNX Runtime WebGPU plugin,
CoreML, and a VLM through the bundled Vulkan llama.cpp), so a GPU path
is chosen once, with measurements, rather than by adding a wheel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>