Compare commits

...
7 Commits
6 changed files with 757 additions and 620 deletions
+5
View File
@@ -25,6 +25,11 @@ about a forthcoming release that has not been tagged yet. A release is only
official when it's tagged and posted to PyPI. official when it's tagged and posted to PyPI.
::: :::
## v16.10.3
- Blocked optimization of images with pre-blended soft masks. {issue}`1536`
- Fixed warning from hypothesis on running tests.
## v16.10.2 ## v16.10.2
- Blacklist pikepdf 9.8.0 due to an incompatible change. - Blacklist pikepdf 9.8.0 due to an incompatible change.
+2 -3
View File
@@ -16,8 +16,8 @@ dependencies = [
"img2pdf>=0.5", "img2pdf>=0.5",
"packaging>=20", "packaging>=20",
"pdfminer.six>=20220319", "pdfminer.six>=20220319",
"pi-heif", # Heif image format - maintainers: if this is removed, it will NOT break "pi-heif", # Heif image format - maintainers: if this is removed, it will NOT break
"pikepdf>=8.10.1, != 9.8.0", "pikepdf>=8.10.1,!=9.8.0",
"Pillow>=10.0.1", "Pillow>=10.0.1",
"pluggy>=1", "pluggy>=1",
"rich>=13", "rich>=13",
@@ -102,7 +102,6 @@ exclude_lines = [
[tool.pytest.ini_options] [tool.pytest.ini_options]
minversion = "6.0" minversion = "6.0"
norecursedirs = ["lib", ".pc", ".git", "venv", "output", "cache", "resources"]
testpaths = ["tests"] testpaths = ["tests"]
addopts = "-n auto" addopts = "-n auto"
markers = ["slow"] markers = ["slow"]
+3 -2
View File
@@ -78,6 +78,7 @@ def run(args=None):
if __name__ == '__main__': if __name__ == '__main__':
multiprocessing.freeze_support() multiprocessing.freeze_support()
if os.name == 'posix': if sys.platform not in ('win32', 'darwin'):
multiprocessing.set_start_method('forkserver') with suppress(RuntimeError):
multiprocessing.set_start_method('forkserver')
sys.exit(run()) sys.exit(run())
+7
View File
@@ -126,6 +126,13 @@ def extract_image_filter(
if Name.Decode in image: if Name.Decode in image:
log.debug(f"xref {xref}: skipping image with Decode table") log.debug(f"xref {xref}: skipping image with Decode table")
return None # Don't mess with custom Decode tables return None # Don't mess with custom Decode tables
if image.get(Name.SMask, Dictionary()).get(Name.Matte, None) is not None:
# https://github.com/ocrmypdf/OCRmyPDF/issues/1536
# Do not attempt to optimize images that have a SMask with a Matte.
# That means alpha channel pre-blending is used, and we're not prepared
# to deal with the complexities of that.
log.debug(f"xref {xref}: skipping image whose SMask has Matte")
return None
return pim, filtdp return pim, filtdp
+32 -9
View File
@@ -6,7 +6,7 @@ from __future__ import annotations
from io import BytesIO from io import BytesIO
from os import fspath from os import fspath
from pathlib import Path from pathlib import Path
from unittest.mock import MagicMock, patch from unittest.mock import patch
import img2pdf import img2pdf
import pikepdf import pikepdf
@@ -220,7 +220,7 @@ def test_find_formx(resources):
def test_extract_image_filter_with_pdf_image(): def test_extract_image_filter_with_pdf_image():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Image image.Subtype = Name.Image
image.Length = 200 image.Length = 200
image.Width = 10 image.Width = 10
@@ -235,20 +235,20 @@ def test_extract_image_filter_with_pdf_image():
def test_extract_image_filter_with_non_image(): def test_extract_image_filter_with_non_image():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Form image.Subtype = Name.Form
assert extract_image_filter(image, None) is None assert extract_image_filter(image, None) is None
def test_extract_image_filter_with_small_stream_size(): def test_extract_image_filter_with_small_stream_size():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Image image.Subtype = Name.Image
image.Length = 50 image.Length = 50
assert extract_image_filter(image, None) is None assert extract_image_filter(image, None) is None
def test_extract_image_filter_with_small_dimensions(): def test_extract_image_filter_with_small_dimensions():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Image image.Subtype = Name.Image
image.Length = 200 image.Length = 200
image.Width = 5 image.Width = 5
@@ -257,7 +257,7 @@ def test_extract_image_filter_with_small_dimensions():
def test_extract_image_filter_with_multiple_compression_filters(): def test_extract_image_filter_with_multiple_compression_filters():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Image image.Subtype = Name.Image
image.Length = 200 image.Length = 200
image.Width = 10 image.Width = 10
@@ -268,7 +268,7 @@ def test_extract_image_filter_with_multiple_compression_filters():
def test_extract_image_filter_with_wide_gamut_image(): def test_extract_image_filter_with_wide_gamut_image():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Image image.Subtype = Name.Image
image.Length = 200 image.Length = 200
image.Width = 10 image.Width = 10
@@ -296,7 +296,7 @@ def test_extract_image_filter_with_jpeg2000_image():
def test_extract_image_filter_with_ccitt_group_3_image(): def test_extract_image_filter_with_ccitt_group_3_image():
image = MagicMock() image = Dictionary()
image.Subtype = Name.Image image.Subtype = Name.Image
image.Length = 200 image.Length = 200
image.Width = 10 image.Width = 10
@@ -309,7 +309,7 @@ def test_extract_image_filter_with_ccitt_group_3_image():
# Triggers pikepdf bug # Triggers pikepdf bug
# def test_extract_image_filter_with_decode_table(): # def test_extract_image_filter_with_decode_table():
# image = MagicMock() # image = Dictionary()
# image.Subtype = Name.Image # image.Subtype = Name.Image
# image.Length = 200 # image.Length = 200
# image.Width = 10 # image.Width = 10
@@ -319,3 +319,26 @@ def test_extract_image_filter_with_ccitt_group_3_image():
# image.ColorSpace = Name.DeviceGray # image.ColorSpace = Name.DeviceGray
# image.Decode = [42, 0] # image.Decode = [42, 0]
# assert extract_image_filter(image, None) is None # assert extract_image_filter(image, None) is None
def test_extract_image_filter_with_rgb_smask_matte():
image = Dictionary()
image.Subtype = Name.Image
image.Length = 200
image.Width = 10
image.Height = 10
image.Filter = Name.FlateDecode
image.BitsPerComponent = 8
image.ColorSpace = Name.DeviceRGB
image.SMask = Dictionary(
Type=Name.Image,
Subtype=Name.Image,
Length=200,
Width=10,
Height=10,
Filter=Name.FlateDecode,
BitsPerComponent=8,
ColorSpace=Name.DeviceGray,
Matte=Array([1, 2, 3]),
)
assert extract_image_filter(image, None) is None
Generated
+708 -606
View File
File diff suppressed because it is too large Load Diff