Measured observations

ItemInput / referenceObserved output
Original chart · 1200×800 pixels1200 × 800 / 338.67 ppiJPEG compression SHA-256 identical
Reduced chart · 240×160 pixels240 × 160 / 67.73 ppiJPEG compression SHA-256 identical

These observations apply to these specimens, not every PDF or reader.

Problem and inputs

We drew a chart of lines, corners and text, saved it as JPEG and reduced one copy to 240×160. Both are placed at 90×60 mm. The horizontal resolution in the table divides pixel width by placed width in inches.

What was inspected

We compare SHA-256 hashes of PDF DCTDecode image streams with the input JPEGs. For these unrotated JPEGs, the original compressed bytes match. Original text and image streams are checked separately. Zoom into the downloaded PDFs to compare the small inserted charts.

Keep useful detail

  1. Import the original file instead of a repeatedly compressed messaging thumbnail.
  2. Preserve proportions and avoid enlarging a small image unnecessarily.
  3. Capture the relevant detail clearly and write explanations as separate searchable text.
  4. Reopen the saved PDF and check page dimensions, image edges, extracted text and original images.

Limits of preservation checks

Matching hashes establish equality of that stream, not identical color management or printing in every reader. EXIF normalization converts to PNG, so compressed-byte equality is not expected there. Image checks alone say nothing about forms, links, attachments or tags; the app currently blocks editing those special structures.

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): pdf-lib: embedding JPEG bytes

Reproduction code: scripts/lab-inputs.py, lab-outputs.mjs, lab-derived.py, tests/readiness-browser.mjs and tests/lab-pdf.py.