From fc30cb8903c9c91ea64e0d0ee9302dc8ebb8c178 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 23 Dec 2025 15:03:51 -0800 Subject: [PATCH] Revert "Work around Ghostscript 10.6.0 JPEG encoding issue by forcing optimization." This reverts commit f4c6c8121ba8178ff3a1cb8f70037bbc3a31391b. The issue is now resolved by correcting the encoidng issue directly. --- src/ocrmypdf/optimize.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/ocrmypdf/optimize.py b/src/ocrmypdf/optimize.py index 41a1a385..a7c6cded 100644 --- a/src/ocrmypdf/optimize.py +++ b/src/ocrmypdf/optimize.py @@ -17,7 +17,6 @@ from typing import Any, NamedTuple, NewType from zlib import compress import img2pdf -from packaging.version import Version from pikepdf import ( Dictionary, Name, @@ -33,7 +32,7 @@ from pikepdf.models.image import HifiPrintImageNotTranscodableError from PIL import Image from ocrmypdf._concurrent import Executor, SerialExecutor -from ocrmypdf._exec import ghostscript, jbig2enc, pngquant +from ocrmypdf._exec import jbig2enc, pngquant from ocrmypdf._jobcontext import PdfContext from ocrmypdf._progressbar import ProgressBar from ocrmypdf.exceptions import OutputFileAccessError @@ -191,16 +190,6 @@ def extract_image_jbig2( return None -def _should_optimize_jpeg(options, filtdp): - if options.optimize >= 2: - return True - if options.optimize < 2 and ghostscript.version() >= Version('10.6.0'): - # Ghostscript 10.6.0+ introduced some sort of JPEG encoding issue. - # To resolve this, re-optimize the JPEG anyway. - return True - return False - - def extract_image_generic( *, pdf: Pdf, root: Path, image: Stream, xref: Xref, options ) -> XrefExt | None: @@ -214,7 +203,15 @@ def extract_image_generic( if pim.bits_per_component == 1: return None - if filtdp[0] == Name.DCTDecode and _should_optimize_jpeg(options, filtdp): + if filtdp[0] == Name.DCTDecode and options.optimize >= 2: + # This is a simple heuristic derived from some training data, that has + # about a 70% chance of guessing whether the JPEG is high quality, + # and possibly recompressible, or not. The number itself doesn't mean + # anything. + # bytes_per_pixel = int(raw_jpeg.Length) / (w * h) + # jpeg_quality_estimate = 117.0 * (bytes_per_pixel ** 0.213) + # if jpeg_quality_estimate < 65: + # return None try: imgname = root / f'{xref:08d}' with imgname.open('wb') as f: