PDF internals research

What Our PDF Analyzer Cannot Tell You

A measurement tool earns trust by stating where it stops. Our PDF analyzer reports byte structure, and it is deliberately narrow. It does not render, it does not decrypt, it does not validate fonts, and it does not evaluate readability. Each of those omissions bounds which claims this repository is entitled to make, so we list them explicitly rather than leaving a reader to discover them.

What this guide helps you decide

If the analyzer reports object counts, stream shares, and inflation ratios, what is it still not able to say about a PDF?

This research documents the boundaries of this repository's PDF analyzer. It does not claim the analyzer is unsuitable for its stated purpose, and it does not describe other PDF tooling.

Try it on the anchor product: BeanNest Tools /pdf/.

It does not render pages

The analyzer reads byte structure and never draws a page. It can report objects and streams, but it cannot say whether text overlaps, a glyph is visible, or a page looks correct. Visual-fidelity claims therefore sit outside this evidence.

It does not decrypt content

The analyzer can classify a Crypt filter name, but it has no key exchange or decryption path. It therefore cannot turn encrypted stream bytes into plaintext content or use those bytes to make a decompressed-content claim.

It does not inspect font subsets

The analyzer records font objects and whether an embedded font reference is present. It does not enumerate the glyphs carried by a subset or validate text extraction. Font-subset and extraction-quality claims are intentionally excluded.

It does not validate PDF conformance

No code in this analyzer certifies PDF/A, PDF/UA, accessibility conformance, or another profile. Structural parsing and standards conformance answer different questions, so a successful byte analysis is not a conformance result.

The measured corpus is deliberately small

The published PDF measurements come from four generated single-page files. The analysis artifact contains no images, embedded fonts, encryption, forms, annotations, or multi-page cases. Ratios measured on those files are evidence for those fixtures, not predictions for arbitrary PDFs.

What the analyzer reports directly

For the current corpus it reports the PDF version, object and stream counts, total stream bytes and share, Flate and JPEG byte totals, font records, image records, filter kinds, and a verified Flate inflation sample when available. Those fields come from byte inspection or an attempted decompression rather than from visual inference.

Filter recognition is broader than the measured corpus

The analyzer code recognises filter names including DCTDecode, JPXDecode, CCITTFaxDecode, JBIG2Decode, FlateDecode, and Crypt. The current analysis artifact nevertheless reports imageCount 0 for all four fixtures, so this corpus does not provide a measured photo-heavy or encrypted-file result.

Broader claims require broader fixtures

A future image, encryption, multi-page, or rendering claim needs a fixture that actually exercises that capability and a check that measures the relevant outcome. Until such evidence exists, the honest boundary is to keep those cases listed as unmeasured rather than infer them from nearby structural fields.

First-party evidence and provenance

How we checked this

We generated four single-page PDFs with this repository's own writer, then parsed each file's raw byte structure with this repository's own analyzer. Both tools are dependency-free and deterministic, so the same commands reproduce the same numbers on any machine. For this guide we enumerated the analyzer's actual capabilities against a rendering, decrypting, font-subsetting, and conformance-checking baseline, and recorded each capability the analyzer does not have.

Method
We generated four single-page PDFs with this repository's own writer, then parsed each file's raw byte structure with this repository's own analyzer. Both tools are dependency-free and deterministic, so the same commands reproduce the same numbers on any machine.
Environment
Node.js on a desktop workstation. No PDF library, no network access, and no third-party file was used. The corpus is produced from text this repository owns.
Captured
Reviewed by
BeanNest Studio

Repository evidence artifacts:

  • tools/research-evidence/pdf/analysis-2026-09-20.json
  • tools/research-evidence/pdf/README.md