From 6206687e8b6a5218988e677fbdbd7f50c68a2327 Mon Sep 17 00:00:00 2001 From: Matteo Omenetti Date: Thu, 23 Jan 2025 04:34:00 -0500 Subject: [PATCH] added if statement for backend Signed-off-by: Matteo Omenetti --- docling/datamodel/pipeline_options.py | 14 +- docling/models/code_formula_model.py | 274 ++++++++++++++++++++++ docling/pipeline/base_pipeline.py | 8 +- docling/pipeline/standard_pdf_pipeline.py | 21 +- poetry.lock | 56 ++--- pyproject.toml | 2 +- tests/data/code_and_formula.pdf | Bin 0 -> 94301 bytes tests/test_code_formula.py | 67 ++++++ 8 files changed, 398 insertions(+), 44 deletions(-) create mode 100644 docling/models/code_formula_model.py create mode 100644 tests/data/code_and_formula.pdf create mode 100644 tests/test_code_formula.py diff --git a/docling/datamodel/pipeline_options.py b/docling/datamodel/pipeline_options.py index eeec6bab..efdf3b1c 100644 --- a/docling/datamodel/pipeline_options.py +++ b/docling/datamodel/pipeline_options.py @@ -1,17 +1,11 @@ import logging import os -import warnings from enum import Enum from pathlib import Path -from typing import Annotated, Any, Dict, List, Literal, Optional, Tuple, Type, Union +from typing import Any, List, Literal, Optional, Union -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator -from pydantic_settings import ( - BaseSettings, - PydanticBaseSettingsSource, - SettingsConfigDict, -) -from typing_extensions import deprecated +from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic_settings import BaseSettings, SettingsConfigDict _log = logging.getLogger(__name__) @@ -225,6 +219,8 @@ class PdfPipelineOptions(PipelineOptions): artifacts_path: Optional[Union[Path, str]] = None do_table_structure: bool = True # True: perform table structure extraction do_ocr: bool = True # True: perform OCR, replace programmatic PDF text + do_code_enrichment: bool = False # True: perform code OCR + do_formula_enrichment: bool = False # True: perform formula OCR, return Latex code table_structure_options: TableStructureOptions = TableStructureOptions() ocr_options: Union[ diff --git a/docling/models/code_formula_model.py b/docling/models/code_formula_model.py new file mode 100644 index 00000000..ca48980d --- /dev/null +++ b/docling/models/code_formula_model.py @@ -0,0 +1,274 @@ +import re +from pathlib import Path +from typing import Iterable, List, Literal, Optional, Tuple + +from docling_core.types.doc import CodeItem, DoclingDocument, NodeItem, TextItem +from docling_core.types.doc.base import BoundingBox +from docling_core.types.doc.labels import CodeLanguageLabel, DocItemLabel +from PIL import Image +from pydantic import BaseModel + +from docling.datamodel.base_models import ItemAndImageEnrichmentElement +from docling.datamodel.document import ConversionResult +from docling.datamodel.pipeline_options import AcceleratorOptions +from docling.models.base_model import BaseItemAndImageEnrichmentModel +from docling.utils.accelerator_utils import decide_device + + +class CodeFormulaModelOptions(BaseModel): + """ + Configuration options for the CodeFormulaModel. + + Attributes + ---------- + kind : str + Type of the model. Fixed value "code_formula". + do_code_enrichment : bool + True if code enrichment is enabled, False otherwise. + do_formula_enrichment : bool + True if formula enrichment is enabled, False otherwise. + """ + + kind: Literal["code_formula"] = "code_formula" + do_code_enrichment: bool = True + do_formula_enrichment: bool = True + + +class CodeFormulaModel(BaseItemAndImageEnrichmentModel): + """ + Model for processing and enriching documents with code and formula predictions. + + Attributes + ---------- + enabled : bool + True if the model is enabled, False otherwise. + options : CodeFormulaModelOptions + Configuration options for the CodeFormulaModel. + code_formula_model : CodeFormulaPredictor + The predictor model for code and formula processing. + + Methods + ------- + __init__(self, enabled, artifacts_path, accelerator_options, code_formula_options) + Initializes the CodeFormulaModel with the given configuration options. + is_processable(self, doc, element) + Determines if a given element in a document can be processed by the model. + __call__(self, doc, element_batch) + Processes the given batch of elements and enriches them with predictions. + """ + + images_scale = 1.66 # = 120 dpi, aligned with training data resolution + + def __init__( + self, + enabled: bool, + artifacts_path: Optional[Path], + options: CodeFormulaModelOptions, + accelerator_options: AcceleratorOptions, + ): + """ + Initializes the CodeFormulaModel with the given configuration. + + Parameters + ---------- + enabled : bool + True if the model is enabled, False otherwise. + artifacts_path : Path + Path to the directory containing the model artifacts. + options : CodeFormulaModelOptions + Configuration options for the model. + accelerator_options : AcceleratorOptions + Options specifying the device and number of threads for acceleration. + """ + self.enabled = enabled + self.options = options + + if self.enabled: + device = decide_device(accelerator_options.device) + + from docling_ibm_models.code_formula_model.code_formula_predictor import ( + CodeFormulaPredictor, + ) + + if artifacts_path is None: + artifacts_path = self.download_models_hf() + + self.code_formula_model = CodeFormulaPredictor( + artifacts_path=artifacts_path, + device=device, + num_threads=accelerator_options.num_threads, + ) + + @staticmethod + def download_models_hf( + local_dir: Optional[Path] = None, force: bool = False + ) -> Path: + from huggingface_hub import snapshot_download + from huggingface_hub.utils import disable_progress_bars + + disable_progress_bars() + download_path = snapshot_download( + repo_id="ds4sd/CodeFormula", + force_download=force, + local_dir=local_dir, + revision="v1.0.0", + ) + + return Path(download_path) + + def is_processable(self, doc: DoclingDocument, element: NodeItem) -> bool: + """ + Determines if a given element in a document can be processed by the model. + + Parameters + ---------- + doc : DoclingDocument + The document being processed. + element : NodeItem + The element within the document to check. + + Returns + ------- + bool + True if the element can be processed, False otherwise. + """ + return self.enabled and ( + (isinstance(element, CodeItem) and self.options.do_code_enrichment) + or ( + isinstance(element, TextItem) + and element.label == DocItemLabel.FORMULA + and self.options.do_formula_enrichment + ) + ) + + def _extract_code_language(self, input_string: str) -> Tuple[str, Optional[str]]: + """Extracts a programming language from the beginning of a (possibly multi-line) string. + + This function checks if the input string starts with a pattern of the form + ``<_some_language_>``. If it does, it extracts the language string and returns + a tuple of (remainder, language). Otherwise, it returns the original string + and `None`. + + Args: + input_string (str): The input string, which may start with ``<_language_>``. + + Returns: + Tuple[str, Optional[str]]: + A tuple where: + - The first element is either: + - The remainder of the string (everything after ``<_language_>``), + if a match is found; or + - The original string, if no match is found. + - The second element is the extracted language if a match is found; + otherwise, `None`. + """ + # Explanation of the regex: + # ^<_([^>]+)> : match "<_something>" at the start, capturing "something" (Group 1) + # \s* : optional whitespace + # (.*) : capture everything after that in Group 2 + # + # We also use re.DOTALL so that the (.*) part can include newlines. + pattern = r"^<_([^>]+)_>\s*(.*)" + match = re.match(pattern, input_string, flags=re.DOTALL) + if match: + language = str(match.group(1)) # the captured programming language + remainder = str(match.group(2)) # everything after the <_language_> + return remainder, language + else: + return input_string, None + + def _get_code_language_enum(self, value: Optional[str]) -> CodeLanguageLabel: + """ + Converts a string to a corresponding `CodeLanguageLabel` enum member. + + If the provided string does not match any value in `CodeLanguageLabel`, + it defaults to `CodeLanguageLabel.UNKNOWN`. + + Args: + value (Optional[str]): The string representation of the code language or None. + + Returns: + CodeLanguageLabel: The corresponding enum member if the value is valid, + otherwise `CodeLanguageLabel.UNKNOWN`. + """ + if not isinstance(value, str): + return CodeLanguageLabel.UNKNOWN + + try: + return CodeLanguageLabel(value) + except ValueError: + return CodeLanguageLabel.UNKNOWN + + def prepare_element( + self, conv_res: ConversionResult, element: NodeItem + ) -> Optional[ItemAndImageEnrichmentElement]: + if not self.is_processable(doc=conv_res.document, element=element): + return None + + assert isinstance(element, TextItem) + + element_prov = element.prov[0] + + expansion_factor = 0.03 # Adjust the expansion percentage as needed + bbox = element_prov.bbox + width = bbox.r - bbox.l + height = bbox.t - bbox.b + + # Create the expanded bounding box + expanded_bbox = BoundingBox( + l=bbox.l - width * expansion_factor, # Expand left + t=bbox.t + height * expansion_factor, # Expand top + r=bbox.r + width * expansion_factor, # Expand right + b=bbox.b - height * expansion_factor, # Expand bottom + coord_origin=bbox.coord_origin, # Preserve coordinate origin + ) + + page_ix = element_prov.page_no - 1 + cropped_image = conv_res.pages[page_ix].get_image( + scale=self.images_scale, cropbox=expanded_bbox + ) + return ItemAndImageEnrichmentElement(item=element, image=cropped_image) + + def __call__( + self, + doc: DoclingDocument, + element_batch: Iterable[ItemAndImageEnrichmentElement], + ) -> Iterable[NodeItem]: + """ + Processes the given batch of elements and enriches them with predictions. + + Parameters + ---------- + doc : DoclingDocument + The document being processed. + element_batch : Iterable[NodeItem] + A batch of elements to be processed. + + Returns + ------- + Iterable[Any] + An iterable of enriched elements. + """ + if not self.enabled: + for element in element_batch: + yield element.item + return + + labels: List[str] = [] + images: List[Image.Image] = [] + elements: List[TextItem] = [] + for el in element_batch: + assert isinstance(el.item, TextItem) + elements.append(el.item) + labels.append(el.item.label) + images.append(el.image) + + outputs = self.code_formula_model.predict(images, labels) + + for item, output in zip(elements, outputs): + if isinstance(item, CodeItem): + output, code_language = self._extract_code_language(output) + item.code_language = self._get_code_language_enum(code_language) + item.text = output + + yield item diff --git a/docling/pipeline/base_pipeline.py b/docling/pipeline/base_pipeline.py index 034e6d42..656c3bc3 100644 --- a/docling/pipeline/base_pipeline.py +++ b/docling/pipeline/base_pipeline.py @@ -3,7 +3,7 @@ import time import traceback from abc import ABC, abstractmethod -from typing import Callable, Iterable, List +from typing import Any, Callable, Iterable, List from docling_core.types.doc import DoclingDocument, NodeItem @@ -18,7 +18,7 @@ from docling.datamodel.document import ConversionResult, InputDocument from docling.datamodel.pipeline_options import PipelineOptions from docling.datamodel.settings import settings -from docling.models.base_model import BaseEnrichmentModel +from docling.models.base_model import BaseEnrichmentModel, GenericEnrichmentModel from docling.utils.profiling import ProfilingScope, TimeRecorder from docling.utils.utils import chunkify @@ -30,7 +30,7 @@ def __init__(self, pipeline_options: PipelineOptions): self.pipeline_options = pipeline_options self.keep_images = False self.build_pipe: List[Callable] = [] - self.enrichment_pipe: List[BaseEnrichmentModel] = [] + self.enrichment_pipe: List[GenericEnrichmentModel[Any]] = [] def execute(self, in_doc: InputDocument, raises_on_error: bool) -> ConversionResult: conv_res = ConversionResult(input=in_doc) @@ -66,7 +66,7 @@ def _assemble_document(self, conv_res: ConversionResult) -> ConversionResult: def _enrich_document(self, conv_res: ConversionResult) -> ConversionResult: def _prepare_elements( - conv_res: ConversionResult, model: BaseEnrichmentModel + conv_res: ConversionResult, model: GenericEnrichmentModel[Any] ) -> Iterable[NodeItem]: for doc_element, _level in conv_res.document.iterate_items(): prepared_element = model.prepare_element( diff --git a/docling/pipeline/standard_pdf_pipeline.py b/docling/pipeline/standard_pdf_pipeline.py index 758f4e94..0340a51b 100644 --- a/docling/pipeline/standard_pdf_pipeline.py +++ b/docling/pipeline/standard_pdf_pipeline.py @@ -1,7 +1,7 @@ import logging import sys from pathlib import Path -from typing import Iterable, Optional +from typing import Optional from docling_core.types.doc import DocItem, ImageRef, PictureItem, TableItem @@ -17,8 +17,8 @@ TesseractCliOcrOptions, TesseractOcrOptions, ) -from docling.models.base_model import BasePageModel from docling.models.base_ocr_model import BaseOcrModel +from docling.models.code_formula_model import CodeFormulaModel, CodeFormulaModelOptions from docling.models.ds_glm_model import GlmModel, GlmOptions from docling.models.easyocr_model import EasyOcrModel from docling.models.layout_model import LayoutModel @@ -93,8 +93,25 @@ def __init__(self, pipeline_options: PdfPipelineOptions): self.enrichment_pipe = [ # Other models working on `NodeItem` elements in the DoclingDocument + # Code Formula Enrichment Model + CodeFormulaModel( + enabled=pipeline_options.do_code_enrichment + or pipeline_options.do_formula_enrichment, + artifacts_path=None, + options=CodeFormulaModelOptions( + do_code_enrichment=pipeline_options.do_code_enrichment, + do_formula_enrichment=pipeline_options.do_formula_enrichment, + ), + accelerator_options=pipeline_options.accelerator_options, + ), ] + if ( + self.pipeline_options.do_formula_enrichment + or self.pipeline_options.do_code_enrichment + ): + self.keep_backend = True + @staticmethod def download_models_hf( local_dir: Optional[Path] = None, force: bool = False diff --git a/poetry.lock b/poetry.lock index 1ae80adb..73fc85db 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -888,13 +888,13 @@ chunking = ["semchunk (>=2.2.0,<3.0.0)", "transformers (>=4.34.0,<5.0.0)"] [[package]] name = "docling-ibm-models" -version = "3.2.0" +version = "3.2.1" description = "This package contains the AI models used by the Docling PDF conversion package" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "docling_ibm_models-3.2.0-py3-none-any.whl", hash = "sha256:9de784dc00f8e6db4f2acaf934bad133477b5a230f19d030e3d9ebb44e453c8e"}, - {file = "docling_ibm_models-3.2.0.tar.gz", hash = "sha256:b0329256fb1464d51854f1654a4e09cbb812edfeaa104b45677952c7135c5ef8"}, + {file = "docling_ibm_models-3.2.1-py3-none-any.whl", hash = "sha256:55bca5673381cc5862f4de584345020d071414c46bc1b9f6436d674e3610ec97"}, + {file = "docling_ibm_models-3.2.1.tar.gz", hash = "sha256:abd1bdc58f00600065eedbfbd34876704d5004cd20884a2c0a61ca2ee5a927dd"}, ] [package.dependencies] @@ -1074,18 +1074,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.16.1" +version = "3.17.0" description = "A platform independent file lock." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, - {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, + {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, + {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -1134,13 +1134,13 @@ dev = ["pyTest", "pyTest-cov"] [[package]] name = "flatbuffers" -version = "24.12.23" +version = "25.1.21" description = "The FlatBuffers serialization format for Python" optional = true python-versions = "*" files = [ - {file = "flatbuffers-24.12.23-py2.py3-none-any.whl", hash = "sha256:c418e0d48890f4142b92fd3e343e73a48f194e1f80075ddcc5793779b3585444"}, - {file = "flatbuffers-24.12.23.tar.gz", hash = "sha256:2910b0bc6ae9b6db78dd2b18d0b7a0709ba240fb5585f286a3a2b30785c22dac"}, + {file = "flatbuffers-25.1.21-py2.py3-none-any.whl", hash = "sha256:0e9736098ba8f4e48246a0640390f4992c0b1a734e7322a9463d5c3eea00558b"}, + {file = "flatbuffers-25.1.21.tar.gz", hash = "sha256:e24a34dcd9fb4e0ea8cc0fc8ef9c5cd61c9d21527a6d536967587a37a4ff9676"}, ] [[package]] @@ -3823,10 +3823,10 @@ files = [ numpy = [ {version = ">=1.21.0", markers = "python_version == \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -3849,10 +3849,10 @@ files = [ numpy = [ {version = ">=1.21.0", markers = "python_version == \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -4037,8 +4037,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4818,13 +4818,13 @@ testutils = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "10.14" +version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.14-py3-none-any.whl", hash = "sha256:202481f716cc8250e4be8fce997781ebf7917701b59652458ee47f2401f818b5"}, - {file = "pymdown_extensions-10.14.tar.gz", hash = "sha256:741bd7c4ff961ba40b7528d32284c53bc436b8b1645e8e37c3e57770b8700a34"}, + {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, + {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, ] [package.dependencies] @@ -4836,13 +4836,13 @@ extra = ["pygments (>=2.19.1)"] [[package]] name = "pymilvus" -version = "2.5.3" +version = "2.5.4" description = "Python Sdk for Milvus" optional = false python-versions = ">=3.8" files = [ - {file = "pymilvus-2.5.3-py3-none-any.whl", hash = "sha256:64ca63594284586937274800be27a402f3be2d078130bf81d94ab8d7798ac9c8"}, - {file = "pymilvus-2.5.3.tar.gz", hash = "sha256:68bc3797b7a14c494caf116cee888894ffd6eba7b96a3ac841be85d60694cc5d"}, + {file = "pymilvus-2.5.4-py3-none-any.whl", hash = "sha256:3f7ddaeae0c8f63554b8e316b73f265d022e05a457d47c366ce47293434a3aea"}, + {file = "pymilvus-2.5.4.tar.gz", hash = "sha256:611732428ff669d57ded3d1f823bdeb10febf233d0251cce8498b287e5a10ce8"}, ] [package.dependencies] @@ -7175,13 +7175,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.2" +version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, - {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, ] [[package]] @@ -7751,4 +7751,4 @@ tesserocr = ["tesserocr"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d326d96280673e5b8bed4536aea277fe88eb503872a91c59d11e43e859b003e6" +content-hash = "8bb0b67294a50c0340c5cc02ce60d3608ef4d1968ae50f7e0b8b4c8a26c34734" diff --git a/pyproject.toml b/pyproject.toml index 237b080d..c3e1fa67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ packages = [{include = "docling"}] python = "^3.9" pydantic = "^2.0.0" docling-core = { version = "^2.15.1", extras = ["chunking"] } -docling-ibm-models = "^3.1.0" +docling-ibm-models = "^3.2.1" deepsearch-glm = "^1.0.0" docling-parse = "^3.1.0" filetype = "^1.2.0" diff --git a/tests/data/code_and_formula.pdf b/tests/data/code_and_formula.pdf new file mode 100644 index 0000000000000000000000000000000000000000..82cd834321a6fc0b14b02d75cb94bd99e36d843b GIT binary patch literal 94301 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 literal 0 HcmV?d00001 diff --git a/tests/test_code_formula.py b/tests/test_code_formula.py new file mode 100644 index 00000000..f7843286 --- /dev/null +++ b/tests/test_code_formula.py @@ -0,0 +1,67 @@ +from pathlib import Path + +from docling_core.types.doc import CodeItem, TextItem +from docling_core.types.doc.labels import CodeLanguageLabel, DocItemLabel + +from docling.backend.docling_parse_backend import DoclingParseDocumentBackend +from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend +from docling.datamodel.base_models import InputFormat +from docling.datamodel.document import ConversionResult +from docling.datamodel.pipeline_options import PdfPipelineOptions +from docling.document_converter import DocumentConverter, PdfFormatOption +from docling.pipeline.standard_pdf_pipeline import StandardPdfPipeline + + +def get_converter(): + + pipeline_options = PdfPipelineOptions() + pipeline_options.generate_page_images = True + + pipeline_options.do_ocr = False + pipeline_options.do_table_structure = False + pipeline_options.do_code_enrichment = True + pipeline_options.do_formula_enrichment = True + + converter = DocumentConverter( + format_options={ + InputFormat.PDF: PdfFormatOption( + backend=DoclingParseV2DocumentBackend, + pipeline_cls=StandardPdfPipeline, + pipeline_options=pipeline_options, + ) + } + ) + + return converter + + +def test_code_and_formula_conversion(): + pdf_path = Path("tests/data/code_and_formula.pdf") + converter = get_converter() + + print(f"converting {pdf_path}") + + doc_result: ConversionResult = converter.convert(pdf_path) + + results = doc_result.document.texts + + code_blocks = [el for el in results if isinstance(el, CodeItem)] + assert len(code_blocks) == 1 + + gt = 'public static void print() {\n System.out.println("Java Code");\n}' + print(gt) + + predicted = code_blocks[0].text.strip() + assert predicted == gt, f"mismatch in text {predicted=}, {gt=}" + assert code_blocks[0].code_language == CodeLanguageLabel.JAVA + + formula_blocks = [ + el + for el in results + if isinstance(el, TextItem) and el.label == DocItemLabel.FORMULA + ] + assert len(formula_blocks) == 1 + + gt = "a ^ { 2 } + 8 = 1 2" + predicted = formula_blocks[0].text + assert predicted == gt, f"mismatch in text {predicted=}, {gt=}"