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
13 changes: 9 additions & 4 deletions docling_jobkit/convert/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -1324,6 +1324,11 @@ def _create_options_from_preset(preset_id: str) -> Any:

def _parse_ocr_options(self, request: ConvertDocumentsOptions) -> OcrOptions:
"""Parse OCR options - preset OR custom config."""
shared_ocr_options = {
"force_full_page_ocr": request.force_ocr,
}
if getattr(request, "ocr_skip_text_layer_pages", False):
shared_ocr_options["skip_text_layer_pages"] = True

# Option 1: Preset (recommended, includes deprecated ocr_engine via validator)
# "auto" is the default sentinel — if ocr_custom_config is also set, defer to Option 2.
Expand Down Expand Up @@ -1355,7 +1360,7 @@ def _parse_ocr_options(self, request: ConvertDocumentsOptions) -> OcrOptions:
try:
ocr_options = self.ocr_factory.create_options( # type: ignore[assignment]
kind=kind,
force_full_page_ocr=request.force_ocr,
**shared_ocr_options,
**{k: v for k, v in config_dict.items() if k != "kind"},
)
except ImportError as err:
Expand All @@ -1381,7 +1386,7 @@ def _parse_ocr_options(self, request: ConvertDocumentsOptions) -> OcrOptions:
try:
ocr_options = self.ocr_factory.create_options( # type: ignore[assignment]
kind=kind,
force_full_page_ocr=request.force_ocr,
**shared_ocr_options,
)
except ImportError as err:
raise ImportError(
Expand Down Expand Up @@ -1422,7 +1427,7 @@ def _parse_ocr_options(self, request: ConvertDocumentsOptions) -> OcrOptions:
try:
return self.ocr_factory.create_options( # type: ignore[return-value]
kind=kind_value,
force_full_page_ocr=request.force_ocr,
**shared_ocr_options,
**{k: v for k, v in config_dict.items() if k != "kind"},
)
except ImportError as err:
Expand All @@ -1436,7 +1441,7 @@ def _parse_ocr_options(self, request: ConvertDocumentsOptions) -> OcrOptions:
# Option 3: Use default (should not reach here due to default="auto")
return self.ocr_factory.create_options( # type: ignore[return-value]
kind=self.config.default_ocr_kind,
force_full_page_ocr=request.force_ocr,
**shared_ocr_options,
)

def get_converter(self, pdf_format_option: PdfFormatOption) -> DocumentConverter:
Expand Down
15 changes: 15 additions & 0 deletions tests/test_pipeline_options_translation.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,21 @@ def test_ocr_options_translated(self, manager):
assert ocr_opts.transport == "grpc"
assert ocr_opts.force_full_page_ocr is True # from force_ocr=True in payload

def test_ocr_text_layer_skip_translated(self, manager, monkeypatch):
calls = []

def fake_create_options(**kwargs):
calls.append(kwargs)
return object()

options = ConvertDocumentsOptions.model_validate(PAYLOAD)
object.__setattr__(options, "ocr_skip_text_layer_pages", True)
monkeypatch.setattr(manager.ocr_factory, "create_options", fake_create_options)

manager._parse_ocr_options(options)

assert calls[0]["skip_text_layer_pages"] is True

def test_pdf_pipeline_options_flags(self, manager):
options = ConvertDocumentsOptions.model_validate(PAYLOAD)
pdf_format_option = manager.get_pdf_pipeline_opts(options)
Expand Down
Loading