diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 617bd75be00..8d85144a0f7 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -179,6 +179,17 @@ def im_generator(ims: list[Image.Image]) -> Generator[Image.Image]: assert os.path.getsize(outfile) > 0 +def test_save_all_object_ids(tmp_path: Path) -> None: + outfile = str(tmp_path / "temp.pdf") + with Image.open("Tests/images/transparent_dispose.gif") as im: + im.save(outfile, save_all=True) + + with PdfParser.PdfParser(outfile) as pdf: + # Test that each object id was used + for object_id in pdf.xref_table.existing_entries: + pdf.read_indirect(PdfParser.IndirectReference(object_id, 0)) + + def test_multiframe_normal_save(tmp_path: Path) -> None: # Test saving a multiframe image without save_all with Image.open("Tests/images/dispose_bgnd.gif") as im: diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index ac0104b30e3..cbd82cb8d2b 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -57,7 +57,6 @@ def _write_image( im: Image.Image, filename: str | bytes, existing_pdf: PdfParser.PdfParser, - image_refs: list[PdfParser.IndirectReference], ) -> tuple[PdfParser.IndirectReference, str]: # FIXME: Should replace ASCIIHexDecode with RunLengthDecode # (packbits) or LZWDecode (tiff/lzw compression). Note that @@ -118,7 +117,7 @@ def _write_image( smask = im.convert("LA").getchannel("A") smask.encoderinfo = {} - image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] + image_ref = _write_image(smask, filename, existing_pdf)[0] dict_obj["SMask"] = image_ref elif im.mode == "RGB": decode_filter = "DCTDecode" @@ -173,9 +172,8 @@ def _write_image( else: filter = PdfParser.PdfName(decode_filter) - image_ref = image_refs.pop(0) - existing_pdf.write_obj( - image_ref, + image_ref = existing_pdf.write_obj( + None, stream=stream, Type=PdfParser.PdfName("XObject"), Subtype=PdfParser.PdfName("Image"), @@ -241,7 +239,6 @@ def _save( append_im.encoderinfo = im.encoderinfo.copy() ims.append(append_im) number_of_pages = 0 - image_refs = [] page_refs = [] contents_refs = [] for im in ims: @@ -250,10 +247,6 @@ def _save( im_number_of_pages = getattr(im, "n_frames", 1) number_of_pages += im_number_of_pages for i in range(im_number_of_pages): - image_refs.append(existing_pdf.next_object_id(0)) - if im.mode == "P" and "transparency" in im.info: - image_refs.append(existing_pdf.next_object_id(0)) - page_refs.append(existing_pdf.next_object_id(0)) contents_refs.append(existing_pdf.next_object_id(0)) existing_pdf.pages.append(page_refs[-1]) @@ -268,7 +261,7 @@ def _save( ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] ) for im in im_pages: - image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) + image_ref, procset = _write_image(im, filename, existing_pdf) # # page