Skip to content

Commit b622a2f

Browse files
j-t-1stefan6419846
andauthored
ENH: Move BlackIs1 functionality to tiff_header (#3421)
Also correct types in CCITTParameters. --------- Co-authored-by: Stefan <96178532+stefan6419846@users.noreply.github.com>
1 parent 0b58493 commit b622a2f

File tree

2 files changed

+29
-26
lines changed

2 files changed

+29
-26
lines changed

pypdf/filters.py

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
from .errors import DependencyError, PdfReadError, PdfStreamError
6363
from .generic import (
6464
ArrayObject,
65-
BooleanObject,
6665
DictionaryObject,
6766
IndirectObject,
6867
NullObject,
@@ -518,12 +517,13 @@ class CCITTParameters:
518517
"""§7.4.6, optional parameters for the CCITTFaxDecode filter."""
519518

520519
K: int = 0
521-
columns: int = 0
520+
columns: int = 1728
522521
rows: int = 0
523-
EndOfBlock: Union[int, None] = None
524-
EndOfLine: Union[int, None] = None
525-
EncodedByteAlign: Union[int, None] = None
526-
DamagedRowsBeforeError: Union[int, None] = None
522+
EndOfLine: Union[bool, None] = False
523+
EncodedByteAlign: Union[bool, None] = False
524+
EndOfBlock: Union[bool, None] = True
525+
BlackIs1: bool = False
526+
DamagedRowsBeforeError: Union[int, None] = 0
527527

528528
@property
529529
def group(self) -> int:
@@ -565,26 +565,27 @@ def _get_parameters(
565565
parameters: Union[None, ArrayObject, DictionaryObject, IndirectObject],
566566
rows: Union[int, IndirectObject],
567567
) -> CCITTParameters:
568-
# §7.4.6, optional parameters for the CCITTFaxDecode filter
569-
k = 0
570-
columns = 1728
568+
ccitt_parameters = CCITTParameters(rows=int(rows))
571569
if parameters:
572570
parameters_unwrapped = cast(
573571
Union[ArrayObject, DictionaryObject], parameters.get_object()
574572
)
575573
if isinstance(parameters_unwrapped, ArrayObject):
576574
for decode_parm in parameters_unwrapped:
577-
if CCITT.COLUMNS in decode_parm:
578-
columns = decode_parm[CCITT.COLUMNS].get_object()
579575
if CCITT.K in decode_parm:
580-
k = decode_parm[CCITT.K].get_object()
576+
ccitt_parameters.K = decode_parm[CCITT.K].get_object()
577+
if CCITT.COLUMNS in decode_parm:
578+
ccitt_parameters.columns = decode_parm[CCITT.COLUMNS].get_object()
579+
if CCITT.BLACK_IS_1 in decode_parm:
580+
ccitt_parameters.BlackIs1 = decode_parm[CCITT.BLACK_IS_1].get_object().value
581581
else:
582-
if CCITT.COLUMNS in parameters_unwrapped:
583-
columns = parameters_unwrapped[CCITT.COLUMNS].get_object() # type: ignore
584582
if CCITT.K in parameters_unwrapped:
585-
k = parameters_unwrapped[CCITT.K].get_object() # type: ignore
586-
587-
return CCITTParameters(K=k, columns=columns, rows=int(rows))
583+
ccitt_parameters.K = parameters_unwrapped[CCITT.K].get_object() # type: ignore
584+
if CCITT.COLUMNS in parameters_unwrapped:
585+
ccitt_parameters.columns = parameters_unwrapped[CCITT.COLUMNS].get_object() # type: ignore
586+
if CCITT.BLACK_IS_1 in parameters_unwrapped:
587+
ccitt_parameters.BlackIs1 = parameters_unwrapped[CCITT.BLACK_IS_1].get_object().value # type: ignore
588+
return ccitt_parameters
588589

589590
@staticmethod
590591
def decode(
@@ -622,7 +623,7 @@ def decode(
622623
262, # Thresholding, SHORT, 1, 0 = BlackIs1
623624
3,
624625
1,
625-
0,
626+
int(params.BlackIs1),
626627
273, # StripOffsets, LONG, 1, length of header
627628
4,
628629
1,
@@ -922,10 +923,6 @@ def _apply_alpha(
922923
img, x_object, obj_as_text, image_format, extension
923924
)
924925

925-
if lfilters == FT.CCITT_FAX_DECODE and decode_parms.get("/BlackIs1", BooleanObject(False)).value is True:
926-
from PIL import ImageOps # noqa: PLC0415
927-
img = ImageOps.invert(img)
928-
929926
# Save image to bytes
930927
img_byte_arr = BytesIO()
931928
try:

tests/test_filters.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
)
2727
from pypdf.generic import (
2828
ArrayObject,
29+
BooleanObject,
2930
ContentStream,
3031
DictionaryObject,
3132
IndirectObject,
@@ -199,19 +200,24 @@ def test_ccitparameters():
199200
def test_ccittparameters():
200201
params = CCITTParameters()
201202
assert params.K == 0 # zero is the default according to page 78
203+
assert params.BlackIs1 is False
202204
assert params.group == 3
203205

204206

205207
@pytest.mark.parametrize(
206-
("parameters", "expected_k"),
208+
("parameters", "expected_k", "expected_black_is_1"),
207209
[
208-
(None, 0),
209-
(ArrayObject([{"/K": NumberObject(1)}, {"/Columns": NumberObject(13)}]), 1),
210+
(None, 0, False),
211+
(
212+
ArrayObject([{"/K": NumberObject(1)}, {"/Columns": NumberObject(13)}, {"/BlackIs1": BooleanObject(True)}]),
213+
1, True
214+
),
210215
],
211216
)
212-
def test_ccitt_get_parameters(parameters, expected_k):
217+
def test_ccitt_get_parameters(parameters, expected_k, expected_black_is_1):
213218
parameters = CCITTFaxDecode._get_parameters(parameters=parameters, rows=0)
214219
assert parameters.K == expected_k # noqa: SIM300
220+
assert parameters.BlackIs1 == expected_black_is_1
215221

216222

217223
def test_ccitt_get_parameters__indirect_object():

0 commit comments

Comments
 (0)