Observed since 20 Oct, 17:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
abstract-ocr
A structured OCR pipeline designed for layout-aware text extraction from complex documents, combining preprocessing, column detection, region classification, PaddleOCR, and ordered OCR assembly.
This module provides layout-aware OCR as part of a larger media processing system.
abstract_ocr focuses on extraction:
Full system: https://github.com/AbstractEndeavors/abstract-media-intelligence
A structured OCR pipeline designed for layout-aware text extraction from complex documents, combining preprocessing, column detection, region classification, and ordered OCR assembly.
Built to handle:
This is not a simple OCR wrapper — it is a typed, multi-stage processing pipeline:
The system is designed for deterministic, reproducible extraction rather than heuristic text scraping.
PDF Input
↓
Slice / Decompose (images + text per page)
↓
OCR + Text Extraction (layout-aware engines)
↓
Metadata Generation
├─ summaries
├─ keywords
└─ descriptions
↓
Manifest Creation (per-page + per-document)
↓
HTML Generation
├─ PDF viewer pages
└─ gallery index pages
↓
Static Site Output (SEO-ready)
flowchart TD
A[Input Image / Page Image]
B[Preprocess\nDenoise + Binarize]
C[Layout Detection\nColumns + Header Cutoff]
D[Region Classification\nText / Figure / Caption]
E[Region OCR\nCrop + Tesseract]
F[Fallback OCR\nColumn-level OCR]
G[Reading Order Assembly]
H[Structured OCRResult\nBlocks + Raw Text + Layout]
A --> B --> C --> D --> E --> G --> H
D -->|No usable regions| F --> G
Layout Detection
Region Classification
Region-Level OCR
Reading Order Reconstruction
Typed Pipeline Execution
The pipeline is built around a step registry + type-safe execution chain:
Each step declares:
The pipeline validates compatibility before execution
Execution is explicit, deterministic, and observable
Example chain:
["preprocess", "detect_layout", "ocr_regions"]
Each step is independently replaceable and composable.
All intermediate results are structured dataclasses:
PageImagePreprocessedImageLayoutDetectionOCRResultNo ad-hoc dictionaries — ensures:
OCR is applied after structure is understood, not before.
This prevents:
If region detection fails:
Traditional OCR pipelines:
This system:
This module is designed to plug into:
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
abstract_utilitiesEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | abstract_utilities | runtime |
abstract_pdfsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | abstract_pdfs>=0.0.29 | runtime |
paddleocrEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | paddleocr>=3.5.0 | runtime |
paddlepaddleEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | paddlepaddle>=3.2.2 | runtime |
paddlexEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | paddlex>=3.5.2 | runtime |
pdf2imageEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pdf2image>=1.17.0 | runtime |
PyPDF2Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | PyPDF2>=3.0.1 | runtime |
PyMuPDFEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | PyMuPDF | runtime |
pypdfium2Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pypdfium2 | runtime |
pdfplumberEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pdfplumber | runtime |
pdfminer.sixEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pdfminer.six | runtime |
python-docxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | python-docx | runtime |
openpyxlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | openpyxl>=3.1.5 | runtime |
opencv-python-headlessEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | opencv-python-headless>=4.13.0.92 | runtime |
pillowEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pillow | runtime |
numpyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | numpy | runtime |
scikit-imageEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | scikit-image>=0.26.0 | runtime |
spacyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | spacy>=3.8.11 | runtime |
nltkEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | nltk>=3.9.4 | runtime |
beautifulsoup4Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | beautifulsoup4>=4.14.3 | runtime |
lxmlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | lxml>=6.0.2 | runtime |
requestsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | requests | runtime |
tqdmEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tqdm>=4.67.3 | runtime |
PyYAMLEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | PyYAML | runtime |
packagingEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | packaging | runtime |
typing_extensionsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | typing_extensions | runtime |
moviepyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | moviepy>=1.0.3 | runtime |
easyocrEnvironment{
"extras": "",
"marker": "extra == \"easyocr\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | easyocr>=1.7.2; extra == "easyocr" | runtime |
pytesseractEnvironment{
"extras": "",
"marker": "extra == \"tesseract\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytesseract>=0.3.13; extra == "tesseract" | runtime |
abstract_hugpyEnvironment{
"extras": "",
"marker": "extra == \"abstract-hugpy\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | abstract_hugpy; extra == "abstract-hugpy" | runtime |
easyocrEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | easyocr>=1.7.2; extra == "all" | runtime |
pytesseractEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytesseract>=0.3.13; extra == "all" | runtime |
bdist_wheel · 71.05 KB · Python py3
sdist · 50.84 KB · Python source
Observed since 20 Oct, 17:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:1ad1f0138cba81fb378e6ba94086b9d2c660dffbf19f44d4ec010052dcb6fe37