2121##
2222
2323import io
24+ import math
2425import os
2526import time
2627
@@ -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,14 @@ 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+ im .save (
185+ op ,
186+ "TIFF" ,
187+ compression = "group4" ,
188+ # use a single strip
189+ strip_size = math .ceil (im .width / 8 ) * im .height ,
190+ )
164191 elif filter == "DCTDecode" :
165192 Image .SAVE ["JPEG" ](im , op , filename )
166193 elif filter == "FlateDecode" :
@@ -170,22 +197,24 @@ def _save(im, fp, filename, save_all=False):
170197 else :
171198 raise ValueError (f"unsupported PDF filter ({ filter } )" )
172199
173- #
174- # Get image characteristics
175-
176- width , height = im .size
200+ stream = op .getvalue ()
201+ if filter == "CCITTFaxDecode" :
202+ stream = stream [8 :]
203+ filter = PdfParser .PdfArray ([PdfParser .PdfName (filter )])
204+ else :
205+ filter = PdfParser .PdfName (filter )
177206
178207 existing_pdf .write_obj (
179208 image_refs [page_number ],
180- stream = op . getvalue () ,
209+ stream = stream ,
181210 Type = PdfParser .PdfName ("XObject" ),
182211 Subtype = PdfParser .PdfName ("Image" ),
183212 Width = width , # * 72.0 / resolution,
184213 Height = height , # * 72.0 / resolution,
185- Filter = PdfParser . PdfName ( filter ) ,
214+ Filter = filter ,
186215 BitsPerComponent = bits ,
187216 Decode = decode ,
188- DecodeParams = params ,
217+ DecodeParms = params ,
189218 ColorSpace = colorspace ,
190219 )
191220
0 commit comments