From 5b03a1b99523e76a720a072dc133c5424f1aecf3 Mon Sep 17 00:00:00 2001 From: debaditya Date: Sun, 26 Jul 2026 02:55:20 +0530 Subject: [PATCH] fix: skip image enrichment without pages Signed-off-by: debaditya --- docling/models/base_model.py | 2 +- tests/test_backend_pptx.py | 45 +++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/docling/models/base_model.py b/docling/models/base_model.py index d48bc2d9c7..5001546092 100644 --- a/docling/models/base_model.py +++ b/docling/models/base_model.py @@ -191,7 +191,7 @@ def prepare_element( embedded_im = element.get_image(conv_res.document) if embedded_im is not None: return ItemAndImageEnrichmentElement(item=element, image=embedded_im) - elif len(element.prov) == 0: + elif len(element.prov) == 0 or not conv_res.pages: return None # Crop the image form the page diff --git a/tests/test_backend_pptx.py b/tests/test_backend_pptx.py index badd74603a..c3c79324a5 100644 --- a/tests/test_backend_pptx.py +++ b/tests/test_backend_pptx.py @@ -1,3 +1,4 @@ +from collections.abc import Iterable from pathlib import Path from types import SimpleNamespace @@ -5,16 +6,21 @@ from docling_core.types.doc import ( ContentLayer, GroupItem, + NodeItem, PictureClassificationLabel, + PictureItem, TextItem, ) from docling.backend.docx.drawingml.utils import get_libreoffice_cmd from docling.backend.mspowerpoint_backend import MsPowerpointDocumentBackend from docling.datamodel.backend_options import MsPowerpointBackendOptions -from docling.datamodel.base_models import InputFormat +from docling.datamodel.base_models import InputFormat, ItemAndImageEnrichmentElement from docling.datamodel.document import ConversionResult, DoclingDocument +from docling.datamodel.pipeline_options import ConvertPipelineOptions from docling.document_converter import DocumentConverter, PowerpointFormatOption +from docling.models.base_model import BaseItemAndImageEnrichmentModel +from docling.pipeline.simple_pipeline import SimplePipeline from .test_data_gen_flag import GEN_TEST_DATA from .verify_utils import verify_document, verify_export @@ -24,6 +30,27 @@ CHART_PPTX = Path("./tests/data/pptx/sources/pptx_chart.pptx") +class _PictureEnrichmentModel(BaseItemAndImageEnrichmentModel): + images_scale = 1.0 + + def is_processable(self, doc: DoclingDocument, element: NodeItem) -> bool: + return isinstance(element, PictureItem) + + def __call__( + self, + doc: DoclingDocument, + element_batch: Iterable[ItemAndImageEnrichmentElement], + ) -> Iterable[NodeItem]: + for element in element_batch: + yield element.item + + +class _ChartEnrichmentPipeline(SimplePipeline): + def __init__(self, pipeline_options: ConvertPipelineOptions) -> None: + super().__init__(pipeline_options) + self.enrichment_pipe = [_PictureEnrichmentModel()] + + @pytest.fixture(scope="module") def libreoffice_available() -> bool: """Return True when a working LibreOffice installation is detected.""" @@ -305,6 +332,22 @@ def test_chart_image_not_rendered_by_default(): ) +def test_chart_enrichment_skips_image_when_pages_empty(): + """Image enrichment skips native charts without an embedded or page image.""" + format_options = { + InputFormat.PPTX: PowerpointFormatOption(pipeline_cls=_ChartEnrichmentPipeline) + } + converter = DocumentConverter( + allowed_formats=[InputFormat.PPTX], format_options=format_options + ) + + result = converter.convert(CHART_PPTX, raises_on_error=True) + + pictures = list(result.document.pictures) + assert len(pictures) == 1 + assert pictures[0].image is None + + def test_chart_image_rendering(libreoffice_available): """render_chart_images=True attaches a LibreOffice-rendered image.