Method
What the audit reads — and what it cannot prove.
Read path
- Load a PDF copy, up to 50 MB, in the browser with
pdf-lib. Encrypted or unreadable files receive an inconclusive result. - Inspect up to 500 pages and 10,000 entries in page
/Annotsarrays. These caps bound extraction after parsing, not parser memory or page-tree traversal. - Resolve the annotation subtype and integer
/Fflags. Missing flags default to zero; unresolved or invalid values do not. The subtype allowlist is deliberately bounded to Adobe's pdfmark table, not every subtype a newer viewer may support. - Distinguish missing or invalid
/AP, a normal/AP/Nstream, and a state dictionary with an/AS-selected stream. Stream presence does not validate its bytes or rendered contents. - Classify covered flag combinations without changing the file. Hidden suppresses display and print. NoView without Print excludes both in the ordinary flag state. Invisible is conditional on a nonstandard subtype lacking a viewer handler; it is not another Hidden bit. ToggleNoView requires viewer-event review.
Deliberate limits
This is not an AcroForm value, inherited-field, XFA, JavaScript, rectangle, optional-content, permission or rendering validator. A viewer can generate some standard appearances. Preserved Print flags cannot establish physical output. Partial arrays, unresolved references and unsupported types remain inconclusive, never “all printable.” Annotation contents and form values are not included in the report; direct dictionaries receive generated page-and-entry locators.