Spaces:
Sleeping
Sleeping
File size: 1,543 Bytes
3213f50 bbbfba8 3213f50 bbbfba8 3213f50 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | """reading_order_simple enricher — infers reading order from spatial position.
If a page has no reading order, orders text regions top-to-bottom,
left-to-right using the center of each region's bbox.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from src.app.enrichers import BaseEnricher
from src.app.geometry.bbox import center
if TYPE_CHECKING:
from src.app.domain.models import CanonicalDocument
from src.app.policies.document_policy import DocumentPolicy
class ReadingOrderSimpleEnricher(BaseEnricher):
@property
def name(self) -> str:
return "reading_order_simple"
def enrich(
self, doc: CanonicalDocument, policy: DocumentPolicy
) -> CanonicalDocument:
if not policy.allow_reading_order_inference:
return doc
new_pages = []
changed = False
for page in doc.pages:
if page.reading_order or not page.text_regions:
new_pages.append(page)
continue
# Sort regions by center-y then center-x (top-to-bottom, left-to-right)
sorted_regions = sorted(
page.text_regions,
key=lambda r: (center(r.geometry.bbox)[1], center(r.geometry.bbox)[0]),
)
new_order = [r.id for r in sorted_regions]
new_pages.append(page.model_copy(update={"reading_order": new_order}))
changed = True
if changed:
return doc.model_copy(update={"pages": new_pages})
return doc
|