diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 22e51a7f..58739755 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -194,7 +194,6 @@ jobs: choco install --yes --no-progress tesseract choco install --yes --no-progress --ignore-checksums ghostscript --version 9.56.1 choco install --yes --no-progress poppler --version=25.11.0 - choco install --yes --no-progress noto - name: Install Python packages run: | diff --git a/src/ocrmypdf/_validation.py b/src/ocrmypdf/_validation.py index b1d0ecdb..e28b1a2c 100644 --- a/src/ocrmypdf/_validation.py +++ b/src/ocrmypdf/_validation.py @@ -49,6 +49,17 @@ def check_platform() -> None: def check_options_languages( options: OcrOptions, ocr_engine_languages: list[str] ) -> None: + # Check for blocked languages first, before checking if they're installed + DENIED_LANGUAGES = {'equ', 'osd'} + blocked = DENIED_LANGUAGES & set(options.languages) + if blocked: + raise BadArgsError( + "The following languages are for Tesseract's internal use and " + "should not be issued explicitly: " + f"{', '.join(blocked)}\n" + "Remove them from the -l/--language argument." + ) + if not ocr_engine_languages: return diff --git a/src/ocrmypdf/_validation_coordinator.py b/src/ocrmypdf/_validation_coordinator.py index d208fcd4..d5440475 100644 --- a/src/ocrmypdf/_validation_coordinator.py +++ b/src/ocrmypdf/_validation_coordinator.py @@ -72,17 +72,9 @@ class ValidationCoordinator: "--tesseract-downsample-large-images is also given." ) - # Check for blocked languages - from ocrmypdf.exceptions import BadArgsError - - DENIED_LANGUAGES = {'equ', 'osd'} - if DENIED_LANGUAGES & set(options.languages): - raise BadArgsError( - "The following languages are for Tesseract's internal use and " - "should not be issued explicitly: " - f"{', '.join(DENIED_LANGUAGES & set(options.languages))}\n" - "Remove them from the -l/--language argument." - ) + # Note: blocked languages (equ, osd) are checked earlier in + # check_options_languages() to ensure the check runs before + # the missing language check. def _validate_optimize_options(self, options: OcrOptions) -> None: """Validate optimization options.""" diff --git a/tests/test_multilingual_direct.py b/tests/test_multilingual_direct.py index e1d76429..c0105e34 100644 --- a/tests/test_multilingual_direct.py +++ b/tests/test_multilingual_direct.py @@ -208,6 +208,21 @@ class TestArabicScript: # ============================================================================= +def _latin_font_works(multi_font_manager) -> bool: + """Check if Latin font is available.""" + return multi_font_manager.has_all_glyphs('NotoSans-Regular', 'A') + + +def _arabic_font_works(multi_font_manager) -> bool: + """Check if Arabic font is available.""" + return multi_font_manager.has_all_glyphs('NotoSansArabic-Regular', 'م') + + +def _devanagari_font_works(multi_font_manager) -> bool: + """Check if Devanagari font is available.""" + return multi_font_manager.has_all_glyphs('NotoSansDevanagari-Regular', 'न') + + def _cjk_font_works(multi_font_manager) -> bool: """Check if CJK font is working (not corrupted).""" return multi_font_manager.has_all_glyphs('NotoSansCJK-Regular', '你') @@ -515,6 +530,9 @@ class TestFontCoverage: def test_noto_sans_latin_coverage(self, multi_font_manager): """Test NotoSans covers common Latin characters and diacritics.""" + if not _latin_font_works(multi_font_manager): + pytest.skip("NotoSans font not available") + latin_samples = [ "Hello World", "Café résumé naïve", @@ -530,6 +548,9 @@ class TestFontCoverage: def test_noto_sans_arabic_coverage(self, multi_font_manager): """Test NotoSansArabic covers Arabic characters.""" + if not _arabic_font_works(multi_font_manager): + pytest.skip("NotoSansArabic font not available") + arabic_samples = [ "مرحبا", # Hello "بالعالم", # World @@ -543,6 +564,9 @@ class TestFontCoverage: def test_noto_sans_devanagari_coverage(self, multi_font_manager): """Test NotoSansDevanagari covers Devanagari characters.""" + if not _devanagari_font_works(multi_font_manager): + pytest.skip("NotoSansDevanagari font not available") + devanagari_samples = [ "नमस्ते", # Hello "हिंदी", # Hindi