Measured observations

ItemInput / referenceObserved output
EXIF 11200 × 800Pixel mean error 0.000
EXIF 21200 × 800Pixel mean error 0.000
EXIF 31200 × 800Pixel mean error 0.000
EXIF 41200 × 800Pixel mean error 0.000
EXIF 5800 × 1200Pixel mean error 0.000
EXIF 6800 × 1200Pixel mean error 0.000
EXIF 7800 × 1200Pixel mean error 0.000
EXIF 8800 × 1200Pixel 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

  1. Locate TOP and corners A–D in the source. A photo viewer may already rotate it automatically.
  2. Open the normalized PNG and check that its pixels, rather than an orientation tag, are portrait-oriented.
  3. Distinguish the small added chart from the original landscape chart in the PDF.
  4. 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

Independent observations and method (JSON) · Authorship and file hashes

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.