Measured observations
| Item | Input / reference | Observed output |
|---|---|---|
| EXIF 1 | 1200 × 800 | Pixel mean error 0.000 |
| EXIF 2 | 1200 × 800 | Pixel mean error 0.000 |
| EXIF 3 | 1200 × 800 | Pixel mean error 0.000 |
| EXIF 4 | 1200 × 800 | Pixel mean error 0.000 |
| EXIF 5 | 800 × 1200 | Pixel mean error 0.000 |
| EXIF 6 | 800 × 1200 | Pixel mean error 0.000 |
| EXIF 7 | 800 × 1200 | Pixel mean error 0.000 |
| EXIF 8 | 800 × 1200 | Pixel mean error 0.000 |
These observations apply to these specimens, not every PDF or reader.
When it happens
JPEG pixel order and EXIF display orientation are separate. Readers can disagree if they handle the tag differently. This controlled experiment changes tags on a 1200×800 original chart; it is not a test of particular phone cameras.
What we did
Using the Chrome file picker, we imported eight JPEGs and saved projects and checked PDFs. Orientation 1 retains JPEG; the others become upright PNGs after browser decoding. Independent Pillow EXIF transforms are compared with stored pixels. We also inspect embedded image sizes and retained text.
Compare orientation 6
- Locate TOP and corners A–D in the source. A photo viewer may already rotate it automatically.
- Open the normalized PNG and check that its pixels, rather than an orientation tag, are portrait-oriented.
- Distinguish the small added chart from the original landscape chart in the PDF.
- For a photo record, also align the subject and viewpoint of each before-and-after pair.
Exceptions and privacy
The app cannot infer intent from an incorrect tag or straighten a tilted scene. Orientation-1 JPEGs retain their source compression stream and may retain EXIF location metadata. Remove sensitive metadata before import. Physical phone capture and OS clipboard workflows remain separately unverified.
Files to inspect yourself
- Source JPEG with orientation 1 (orientation-1.jpg)
- Source JPEG with orientation 6 (orientation-6.jpg)
- PNG with orientation 6 applied to pixels (orientation-6-normalized.png)
- Saved orientation-6 PDF (orientation-6-result.pdf)
Crop coordinates, scale, source hashes and fresh extraction · Rechecked: 2026-10-24 · pdftoppm version 26.07.0 · pypdf 6.10.0 · pdfplumber 0.11.9. Original PDFs were not modified.
Environment, date and evidence boundaries
Checked: 2026-10-23 · Windows / Chrome 155 · pdf-lib 1.17.1 · PDF.js 6.4.299 · fontkit 1.1.1 · pypdf 6.10.0 · pdftoppm version 26.07.0. PDFs and artwork are original; NanumGothic uses OFL-1.1. Tables and files record direct observations; explanations interpret those structures. Physical OS keyboard input, phones and every PDF reader are outside this test.
Official reference explanations (separate from measurements): Pillow: EXIF transpose reference
Reproduction code: scripts/lab-inputs.py, lab-outputs.mjs, lab-derived.py, tests/readiness-browser.mjs and tests/lab-pdf.py.



