You get a rotated image with no error to chase because drawImage respects the source orientation but the page transform ignores it. EXIF is input to normalise rather than metadata to preserve: read the tag, bake the rotation into the bitmap or the transform matrix, then let the export forget it ever existed. EXIF-orientation libraries exist for exactly this and they hand you a canvas you can draw straight into jsPDF. The resize and the re-encode tend to drop the tag on the way through, which is why the fix has to happen after the image is decoded rather than before.