def _transcode_png(pike: Pdf, filename: Path, xref: Xref) -> bool: output = filename.with_suffix('.png.pdf') with output.open('wb') as f: img2pdf.convert(fspath(filename), outputstream=f) with pikepdf.open(output) as pdf_image: foreign_image = next(pdf_image.pages[0].images.values()) local_image = pike.copy_foreign(foreign_image) im_obj = pike.get_object(xref, 0) im_obj.write( local_image.read_raw_bytes(), filter=local_image.Filter, decode_parms=local_image.DecodeParms, ) # Don't copy keys from the new image... del_keys = set(im_obj.keys()) - set(local_image.keys()) # ...except for the keep_fields, which are essential to displaying # the image correctly and preserving its metadata. (/Decode arrays # and /SMaskInData are implicitly discarded prior to this point.) keep_fields = { '/ID', '/Intent', '/Interpolate', '/Mask', '/Metadata', '/OC', '/OPI', '/SMask', '/StructParent', } del_keys -= keep_fields for key in local_image.keys(): if key != Name.Length and str(key) not in keep_fields: im_obj[key] = local_image[key] for key in del_keys: del im_obj[key] return True
def _transcode_png(pike: Pdf, filename: Path, xref: Xref) -> bool: output = filename.with_suffix('.png.pdf') with output.open('wb') as f: img2pdf.convert(fspath(filename), outputstream=f) with pikepdf.open(output) as pdf_image: foreign_image = next(pdf_image.pages[0].images.values()) local_image = pike.copy_foreign(foreign_image) im_obj = pike.get_object(xref, 0) im_obj.write( local_image.read_raw_bytes(), filter=local_image.Filter, decode_parms=local_image.DecodeParms, ) del_keys = set(im_obj.keys()) - set(local_image.keys()) for key in local_image.keys(): if key != Name.Length: im_obj[key] = local_image[key] for key in del_keys: del im_obj[key]