Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docling/models/base_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
45 changes: 44 additions & 1 deletion tests/test_backend_pptx.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
from collections.abc import Iterable
from pathlib import Path
from types import SimpleNamespace

import pytest
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
Expand All @@ -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."""
Expand Down Expand Up @@ -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.

Expand Down