From f2781cf9a22f122455792d8ba77b5507c2faf092 Mon Sep 17 00:00:00 2001 From: Todd Hagen Date: Mon, 10 Aug 2026 03:35:23 +0200 Subject: [PATCH 1/3] Fix jpg_quality/jpeg_quality field mismatch with OCRmyPDF >=17.10; detect which name is used to work with old and new versions of OCRmyPDF. OcrOptions field rename in 17.10 causes dpsprep to crash with a pydantic ValidationError when calling OCRmyPDF optimization (-O flag). --- src/dpsprep/ocrmypdf_adapter.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dpsprep/ocrmypdf_adapter.py b/src/dpsprep/ocrmypdf_adapter.py index c88b2fa..60099a9 100644 --- a/src/dpsprep/ocrmypdf_adapter.py +++ b/src/dpsprep/ocrmypdf_adapter.py @@ -33,6 +33,9 @@ def run_ocrmypdf_optimizer(options: DpsPrepOptions) -> bool: quality = options.quality_overrides.get_global_value() workdir = options.workdir + # Detect the OcrOptions JPEG quality key: was renamed in OCRmyPDF 17.10 + jpg_quality_key = 'jpeg_quality' if 'jpeg_quality' in OcrOptions.model_fields else 'jpg_quality' + omp_options = OcrOptions( input_file=workdir.combined_pdf_without_text_path, output_file=workdir.combined_pdf_path, @@ -40,8 +43,8 @@ def run_ocrmypdf_optimizer(options: DpsPrepOptions) -> bool: jobs=options.pool_size, optimize=options.optlevel, # When set to 0, OCRmyPDF's "optimize" function attempts to adjust them - jpg_quality=quality or 0, png_quality=quality or 0, + **{jpg_quality_key: quality or 0}, ) info = PdfInfo(workdir.combined_pdf_path) From d176ddfc249d90ee04058c26a223c3c548eebdd8 Mon Sep 17 00:00:00 2001 From: Todd Hagen Date: Mon, 10 Aug 2026 13:35:51 +0200 Subject: [PATCH 2/3] Revert "Fix jpg_quality/jpeg_quality field mismatch with OCRmyPDF >=17.10; detect" This reverts commit f2781cf9a22f122455792d8ba77b5507c2faf092. --- src/dpsprep/ocrmypdf_adapter.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/dpsprep/ocrmypdf_adapter.py b/src/dpsprep/ocrmypdf_adapter.py index 60099a9..c88b2fa 100644 --- a/src/dpsprep/ocrmypdf_adapter.py +++ b/src/dpsprep/ocrmypdf_adapter.py @@ -33,9 +33,6 @@ def run_ocrmypdf_optimizer(options: DpsPrepOptions) -> bool: quality = options.quality_overrides.get_global_value() workdir = options.workdir - # Detect the OcrOptions JPEG quality key: was renamed in OCRmyPDF 17.10 - jpg_quality_key = 'jpeg_quality' if 'jpeg_quality' in OcrOptions.model_fields else 'jpg_quality' - omp_options = OcrOptions( input_file=workdir.combined_pdf_without_text_path, output_file=workdir.combined_pdf_path, @@ -43,8 +40,8 @@ def run_ocrmypdf_optimizer(options: DpsPrepOptions) -> bool: jobs=options.pool_size, optimize=options.optlevel, # When set to 0, OCRmyPDF's "optimize" function attempts to adjust them + jpg_quality=quality or 0, png_quality=quality or 0, - **{jpg_quality_key: quality or 0}, ) info = PdfInfo(workdir.combined_pdf_path) From 09908a1954c2a50e7062e4e1b86bb0ddad5fef14 Mon Sep 17 00:00:00 2001 From: Todd Hagen Date: Wed, 12 Aug 2026 15:31:46 +0200 Subject: [PATCH 3/3] Fix jpg_quality/jpeg_quality field mismatch via backwards-compatible setter OCRmyPDF 17.10 renamed OcrOptions.jpg_quality to jpeg_quality. Set it now via (backwards-compatible) attribute instead of constructor kwarg; 'jpg_quality' is now an alias and works across OMP versions. Re-enable mypy checking of ocrmypdf --- pyproject.toml | 2 +- src/dpsprep/ocrmypdf_adapter.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 27d6f1c..7ca2595 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -142,7 +142,7 @@ strict_bytes = false module = [ "click_man.*", "djvu.*", - "ocrmypdf.*", + #"ocrmypdf.*", "pdfrw.*", "uv_build.*", ] diff --git a/src/dpsprep/ocrmypdf_adapter.py b/src/dpsprep/ocrmypdf_adapter.py index c88b2fa..6492c21 100644 --- a/src/dpsprep/ocrmypdf_adapter.py +++ b/src/dpsprep/ocrmypdf_adapter.py @@ -40,10 +40,12 @@ def run_ocrmypdf_optimizer(options: DpsPrepOptions) -> bool: jobs=options.pool_size, optimize=options.optlevel, # When set to 0, OCRmyPDF's "optimize" function attempts to adjust them - jpg_quality=quality or 0, png_quality=quality or 0, ) + # Set jpg_quality via attribute (backwards-compatible setter) rather than constructor kwarg, since the kwarg differs across OMP versions. + omp_options.jpg_quality = quality or 0 + info = PdfInfo(workdir.combined_pdf_path) context = PdfContext(omp_options, workdir.ocrmypdf_tmp_path, workdir.combined_pdf_path, info, None)