2121##
2222
2323import io
24+ import math
2425import os
2526import time
2627
27- from . import Image , ImageFile , ImageSequence , PdfParser , __version__
28+ from . import Image , ImageFile , ImageSequence , PdfParser , TiffImagePlugin , __version__
2829
2930#
3031# --------------------------------------------------------------------
@@ -123,8 +124,26 @@ def _save(im, fp, filename, save_all=False):
123124 params = None
124125 decode = None
125126
127+ #
128+ # Get image characteristics
129+
130+ width , height = im .size
131+
126132 if im .mode == "1" :
127- filter = "DCTDecode"
133+ filter = "CCITTFaxDecode"
134+ bits = 1
135+ params = PdfParser .PdfArray (
136+ [
137+ PdfParser .PdfDict (
138+ {
139+ "K" : - 1 ,
140+ "BlackIs1" : True ,
141+ "Columns" : width ,
142+ "Rows" : height ,
143+ }
144+ )
145+ ]
146+ )
128147 colorspace = PdfParser .PdfName ("DeviceGray" )
129148 procset = "ImageB" # grayscale
130149 elif im .mode == "L" :
@@ -161,6 +180,11 @@ def _save(im, fp, filename, save_all=False):
161180
162181 if filter == "ASCIIHexDecode" :
163182 ImageFile ._save (im , op , [("hex" , (0 , 0 ) + im .size , 0 , im .mode )])
183+ elif filter == "CCITTFaxDecode" :
184+ original_strip_size = TiffImagePlugin .STRIP_SIZE
185+ TiffImagePlugin .STRIP_SIZE = math .ceil (im .width / 8 ) * im .height
186+ im .save (op , "TIFF" , compression = "group4" )
187+ TiffImagePlugin .STRIP_SIZE = original_strip_size
164188 elif filter == "DCTDecode" :
165189 Image .SAVE ["JPEG" ](im , op , filename )
166190 elif filter == "FlateDecode" :
@@ -170,22 +194,24 @@ def _save(im, fp, filename, save_all=False):
170194 else :
171195 raise ValueError (f"unsupported PDF filter ({ filter } )" )
172196
173- #
174- # Get image characteristics
175-
176- width , height = im .size
197+ stream = op .getvalue ()
198+ if filter == "CCITTFaxDecode" :
199+ stream = stream [8 :]
200+ filter = PdfParser .PdfArray ([PdfParser .PdfName (filter )])
201+ else :
202+ filter = PdfParser .PdfName (filter )
177203
178204 existing_pdf .write_obj (
179205 image_refs [page_number ],
180- stream = op . getvalue () ,
206+ stream = stream ,
181207 Type = PdfParser .PdfName ("XObject" ),
182208 Subtype = PdfParser .PdfName ("Image" ),
183209 Width = width , # * 72.0 / resolution,
184210 Height = height , # * 72.0 / resolution,
185- Filter = PdfParser . PdfName ( filter ) ,
211+ Filter = filter ,
186212 BitsPerComponent = bits ,
187213 Decode = decode ,
188- DecodeParams = params ,
214+ DecodeParms = params ,
189215 ColorSpace = colorspace ,
190216 )
191217
0 commit comments