Reinstate "Work around Ghostscript 10.6.0 JPEG encoding issue by forcing optimization.""

This reverts commit fc30cb8903.
It turns out that both fixes were necessary.
This commit is contained in:
James R. Barlow
2025-12-23 15:41:34 -08:00
parent de63d6eac9
commit 195344d307
+13 -10
View File
@@ -17,6 +17,7 @@ from typing import Any, NamedTuple, NewType
from zlib import compress
import img2pdf
from packaging.version import Version
from pikepdf import (
Dictionary,
Name,
@@ -32,7 +33,7 @@ from pikepdf.models.image import HifiPrintImageNotTranscodableError
from PIL import Image
from ocrmypdf._concurrent import Executor, SerialExecutor
from ocrmypdf._exec import jbig2enc, pngquant
from ocrmypdf._exec import ghostscript, jbig2enc, pngquant
from ocrmypdf._jobcontext import PdfContext
from ocrmypdf._progressbar import ProgressBar
from ocrmypdf.exceptions import OutputFileAccessError
@@ -190,6 +191,16 @@ 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:
@@ -203,15 +214,7 @@ def extract_image_generic(
if pim.bits_per_component == 1:
return None
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
if filtdp[0] == Name.DCTDecode and _should_optimize_jpeg(options, filtdp):
try:
imgname = root / f'{xref:08d}'
with imgname.open('wb') as f: