Skip to content

Commit

Permalink
Reorganize imports from docling-core
Browse files Browse the repository at this point in the history
Signed-off-by: Christoph Auer <[email protected]>
  • Loading branch information
cau-git committed Sep 20, 2024
1 parent 6dd1e91 commit abb6ddd
Show file tree
Hide file tree
Showing 15 changed files with 90 additions and 185 deletions.
5 changes: 3 additions & 2 deletions docling/backend/abstract_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
from pathlib import Path
from typing import TYPE_CHECKING, Any, Iterable, Optional, Union

from docling_core.types.experimental.base import BoundingBox, Size
from PIL import Image

if TYPE_CHECKING:
from docling.datamodel.base_models import BoundingBox, Cell, PageSize
from docling.datamodel.base_models import Cell


class PdfPageBackend(ABC):
Expand All @@ -30,7 +31,7 @@ def get_page_image(
pass

@abstractmethod
def get_size(self) -> "PageSize":
def get_size(self) -> "Size":
pass

@abstractmethod
Expand Down
7 changes: 4 additions & 3 deletions docling/backend/docling_parse_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
from typing import Iterable, List, Optional, Union

import pypdfium2 as pdfium
from docling_core.types.experimental.base import BoundingBox, CoordOrigin, Size
from docling_parse.docling_parse import pdf_parser
from PIL import Image, ImageDraw
from pypdfium2 import PdfPage

from docling.backend.abstract_backend import PdfDocumentBackend, PdfPageBackend
from docling.datamodel.base_models import BoundingBox, Cell, CoordOrigin, PageSize
from docling.datamodel.base_models import Cell

_log = logging.getLogger(__name__)

Expand Down Expand Up @@ -177,8 +178,8 @@ def get_page_image(

return image

def get_size(self) -> PageSize:
return PageSize(width=self._ppage.get_width(), height=self._ppage.get_height())
def get_size(self) -> Size:
return Size(width=self._ppage.get_width(), height=self._ppage.get_height())

def unload(self):
self._ppage = None
Expand Down
7 changes: 4 additions & 3 deletions docling/backend/pypdfium2_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@

import pypdfium2 as pdfium
import pypdfium2.raw as pdfium_c
from docling_core.types.experimental.base import BoundingBox, CoordOrigin, Size
from PIL import Image, ImageDraw
from pypdfium2 import PdfPage, PdfTextPage
from pypdfium2._helpers.misc import PdfiumError

from docling.backend.abstract_backend import PdfDocumentBackend, PdfPageBackend
from docling.datamodel.base_models import BoundingBox, Cell, CoordOrigin, PageSize
from docling.datamodel.base_models import Cell

_log = logging.getLogger(__name__)

Expand Down Expand Up @@ -222,8 +223,8 @@ def get_page_image(

return image

def get_size(self) -> PageSize:
return PageSize(width=self._ppage.get_width(), height=self._ppage.get_height())
def get_size(self) -> Size:
return Size(width=self._ppage.get_width(), height=self._ppage.get_height())

def unload(self):
self._ppage = None
Expand Down
117 changes: 2 additions & 115 deletions docling/datamodel/base_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from io import BytesIO
from typing import Annotated, Any, Dict, List, Optional, Tuple, Union

from docling_core.types.experimental.base import BoundingBox, Size
from PIL.Image import Image
from pydantic import BaseModel, ConfigDict, Field, model_validator
from typing_extensions import Self
Expand All @@ -24,11 +25,6 @@ class DocInputType(str, Enum):
STREAM = auto()


class CoordOrigin(str, Enum):
TOPLEFT = auto()
BOTTOMLEFT = auto()


class DoclingComponentType(str, Enum):
PDF_BACKEND = auto()
MODEL = auto()
Expand All @@ -41,115 +37,6 @@ class ErrorItem(BaseModel):
error_message: str


class PageSize(BaseModel):
width: float = 0.0
height: float = 0.0


class BoundingBox(BaseModel):
l: float # left
t: float # top
r: float # right
b: float # bottom

coord_origin: CoordOrigin = CoordOrigin.TOPLEFT

@property
def width(self):
return self.r - self.l

@property
def height(self):
return abs(self.t - self.b)

def scaled(self, scale: float) -> "BoundingBox":
out_bbox = copy.deepcopy(self)
out_bbox.l *= scale
out_bbox.r *= scale
out_bbox.t *= scale
out_bbox.b *= scale

return out_bbox

def normalized(self, page_size: PageSize) -> "BoundingBox":
out_bbox = copy.deepcopy(self)
out_bbox.l /= page_size.width
out_bbox.r /= page_size.width
out_bbox.t /= page_size.height
out_bbox.b /= page_size.height

return out_bbox

def as_tuple(self):
if self.coord_origin == CoordOrigin.TOPLEFT:
return (self.l, self.t, self.r, self.b)
elif self.coord_origin == CoordOrigin.BOTTOMLEFT:
return (self.l, self.b, self.r, self.t)

@classmethod
def from_tuple(cls, coord: Tuple[float, ...], origin: CoordOrigin):
if origin == CoordOrigin.TOPLEFT:
l, t, r, b = coord[0], coord[1], coord[2], coord[3]
if r < l:
l, r = r, l
if b < t:
b, t = t, b

return BoundingBox(l=l, t=t, r=r, b=b, coord_origin=origin)
elif origin == CoordOrigin.BOTTOMLEFT:
l, b, r, t = coord[0], coord[1], coord[2], coord[3]
if r < l:
l, r = r, l
if b > t:
b, t = t, b

return BoundingBox(l=l, t=t, r=r, b=b, coord_origin=origin)

def area(self) -> float:
return (self.r - self.l) * (self.b - self.t)

def intersection_area_with(self, other: "BoundingBox") -> float:
# Calculate intersection coordinates
left = max(self.l, other.l)
top = max(self.t, other.t)
right = min(self.r, other.r)
bottom = min(self.b, other.b)

# Calculate intersection dimensions
width = right - left
height = bottom - top

# If the bounding boxes do not overlap, width or height will be negative
if width <= 0 or height <= 0:
return 0.0

return width * height

def to_bottom_left_origin(self, page_height) -> "BoundingBox":
if self.coord_origin == CoordOrigin.BOTTOMLEFT:
return self
elif self.coord_origin == CoordOrigin.TOPLEFT:
return BoundingBox(
l=self.l,
r=self.r,
t=page_height - self.t,
b=page_height - self.b,
coord_origin=CoordOrigin.BOTTOMLEFT,
)

def to_top_left_origin(self, page_height):
if self.coord_origin == CoordOrigin.TOPLEFT:
return self
elif self.coord_origin == CoordOrigin.BOTTOMLEFT:
return BoundingBox(
l=self.l,
r=self.r,
t=page_height - self.t, # self.b
b=page_height - self.b, # self.t
coord_origin=CoordOrigin.TOPLEFT,
)


class Cell(BaseModel):
id: int
text: str
Expand Down Expand Up @@ -266,7 +153,7 @@ class Page(BaseModel):

page_no: int
page_hash: Optional[str] = None
size: Optional[PageSize] = None
size: Optional[Size] = None
cells: List[Cell] = []
predictions: PagePredictions = PagePredictions()
assembled: Optional[AssembledUnit] = None
Expand Down
2 changes: 1 addition & 1 deletion docling/datamodel/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
from typing import ClassVar, Dict, Iterable, List, Optional, Tuple, Type, Union

from docling_core.types import BaseCell, BaseText
from docling_core.types import BoundingBox as DsBoundingBox
from docling_core.types import Document as DsDocument
from docling_core.types import DocumentDescription as DsDocumentDescription
from docling_core.types import FileInfoObject as DsFileInfoObject
from docling_core.types import PageDimensions, PageReference, Prov, Ref
from docling_core.types import Table as DsSchemaTable
from docling_core.types import TableCell
from docling_core.types.doc.base import BoundingBox as DsBoundingBox
from docling_core.types.doc.base import Figure
from pydantic import BaseModel
from typing_extensions import deprecated
Expand Down
3 changes: 2 additions & 1 deletion docling/models/base_ocr_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@

import numpy
import numpy as np
from docling_core.types.experimental.base import BoundingBox, CoordOrigin
from PIL import Image, ImageDraw
from rtree import index
from scipy.ndimage import find_objects, label

from docling.datamodel.base_models import BoundingBox, CoordOrigin, OcrCell, Page
from docling.datamodel.base_models import OcrCell, Page

_log = logging.getLogger(__name__)

Expand Down
3 changes: 2 additions & 1 deletion docling/models/ds_glm_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
from docling_core.types import BaseText
from docling_core.types import Document as DsDocument
from docling_core.types import Ref
from docling_core.types.experimental.base import BoundingBox, CoordOrigin
from PIL import ImageDraw

from docling.datamodel.base_models import BoundingBox, Cluster, CoordOrigin
from docling.datamodel.base_models import Cluster
from docling.datamodel.document import ConversionResult


Expand Down
3 changes: 2 additions & 1 deletion docling/models/easyocr_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
from typing import Iterable

import numpy
from docling_core.types.experimental.base import BoundingBox, CoordOrigin

from docling.datamodel.base_models import BoundingBox, CoordOrigin, OcrCell, Page
from docling.datamodel.base_models import OcrCell, Page
from docling.models.base_ocr_model import BaseOcrModel

_log = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion docling/models/layout_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
import time
from typing import Iterable, List

from docling_core.types.experimental.base import CoordOrigin
from docling_ibm_models.layoutmodel.layout_predictor import LayoutPredictor
from PIL import ImageDraw

from docling.datamodel.base_models import (
BoundingBox,
Cell,
Cluster,
CoordOrigin,
LayoutPrediction,
Page,
)
Expand Down
2 changes: 1 addition & 1 deletion docling/models/table_structure_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
from typing import Iterable, List

import numpy
from docling_core.types.experimental.base import BoundingBox
from docling_ibm_models.tableformer.data_management.tf_predictor import TFPredictor
from PIL import ImageDraw

from docling.datamodel.base_models import (
BoundingBox,
Page,
TableCell,
TableElement,
Expand Down
14 changes: 11 additions & 3 deletions docling/utils/export.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import logging
from typing import Any, Dict, Iterable, List, Tuple, Union

from docling_core.types.doc.base import BaseCell, BaseText, Ref, Table, TableCell

from docling.datamodel.base_models import BoundingBox, CoordOrigin, OcrCell
from docling_core.types.doc.base import (
BaseCell,
BaseText,
BoundingBox,
Ref,
Table,
TableCell,
)
from docling_core.types.experimental.base import CoordOrigin

from docling.datamodel.base_models import OcrCell
from docling.datamodel.document import ConversionResult, Page

_log = logging.getLogger(__name__)
Expand Down
Loading

0 comments on commit abb6ddd

Please sign in to comment.