Skip to content

Commit

Permalink
CMYK JPEGs appearing inverted in PDF output
Browse files Browse the repository at this point in the history
Addresses issue [#1128](#1128)

According to
[libjpeg](https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3c17063ef1ab43f5877f19d670dc39497c5cd036/libjpeg.txt#L1569-L1582)
"it appears that Adobe Photoshop writes inverted data in CMYK JPEG
files"

An Adobe JPEG can be identified by the presence of the
[APP14](https://exiftool.org/TagNames/JPEG.html#Adobe)
segment.

The code now checks for the `APP14` segment in `RasterImage` and adds a
Decode Array to the XObject when rendering the CMYK JPEG. The value of
the Decode Array is the inverse of the default value for DeviceCMYK
according to the PDF spec. This has the effect of inverting the inverted
image back to normal.
  • Loading branch information
gr004go committed Jun 7, 2024
1 parent 9639ce5 commit 3752e43
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions weasyprint/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ def __init__(self, pillow_image, image_id, image_data, filename=None,
self.height = pillow_image.height
self.ratio = (self.width / self.height) if self.height != 0 else inf
self.optimize = optimize = options['optimize_images']
self.app14 = getattr(original_pillow_image, 'app', {}).get('APP14')

if pillow_image.format in ('JPEG', 'MPO'):
self.format = 'JPEG'
Expand Down Expand Up @@ -150,6 +151,11 @@ def get_x_object(self, interpolate, dpi_ratio):
})

if self.format == 'JPEG':
if self.mode == 'CMYK' and self.app14 is not None:
# The presence of the APP14 segment indicates an Adobe image
# with inverted CMYK data. Specify a Decode Array to invert
# it again back to normal.
extra['Decode'] = '[1 0 1 0 1 0 1 0]'
extra['Filter'] = '/DCTDecode'
return pydyf.Stream([self.image_data], extra)

Expand Down

0 comments on commit 3752e43

Please sign in to comment.