Platform-independent core logic of a PDF viewer, in pure TypeScript. No DOM
access — every type is a plain JSON-serializable object. This is the logic
layer underneath @pdfrx/viewer;
use it directly to build a custom viewer shell (different rendering stack,
custom gestures).
Derived from the pdfrx project.
npm install @pdfrx/viewer-core
| Module | Contents |
|---|---|
geometry |
Rect/point math, page rotation, PDF page space (y-up) ↔ document space (y-down) conversions |
transform |
ViewTransform {zoom, xZoomed, yZoomed}, visible-rect/fit calculations, 14 page anchors, boundary clamping, underflow alignment |
layout |
Vertical/horizontal page layout and hit testing |
text / text-formatter |
Structured page text: reading-order analysis, line splitting, word/space/newline fragments, text direction (LTR/RTL/vertical), search |
selection |
Nearest-character hit testing, A/B selection anchors (same-page and cross-page), word selection, per-page range expansion for highlighting |
These primitives are DOM-free and JSON-serializable. They support vertical, horizontal, and custom viewer shells without coupling layout, coordinates, text analysis, or selection behavior to canvas rendering or a UI framework.
import {
formatText,
findTextAndIndexForPoint,
getSelectedRanges,
composeSelectedText,
layoutPagesVertical,
} from '@pdfrx/viewer-core';
// Build structured text from an engine's raw page text
const pageText = formatText({ fullText, charRects }, /* pageNumber */ 1);
// Lay out pages and hit-test a pointer position against the text
const layout = layoutPagesVertical(pages, { margin: 8 });
const hit = findTextAndIndexForPoint(docPoint, selectablePages);
// Expand a selection into per-page ranges and compose the clipboard text
const ranges = getSelectedRanges(selA, selB, getLoadedText);
const clipboard = composeSelectedText(ranges);
Coordinate conventions: PDF page space is points (1/72"), origin bottom-left, y-up; document space is y-down. See the architecture notes for details.
See the complete API reference for exported geometry, layout, text, and selection symbols. The architecture notes define coordinate conventions and package boundaries.
@pdfrx/engine ·
@pdfrx/viewer ·
@pdfrx/reactMIT
@pdfrx/viewer-core— the platform-independent core logic of the pdfrx_web viewer.This package contains no DOM access: it is pure geometry, layout, viewport math, text-flow analysis, and text-selection logic. All public types are plain, JSON-serializable objects so the exact same test vectors can be shared across implementations.
Modules:
geometry— rect/point math, rotation, and PDF page space <-> document space conversions.transform— the ViewTransform (uniform scale + translation), fit calculations, page anchors, and boundary/overscroll clamping.layout— vertical/horizontal page layout.text/text-formatter— the structured page text model and its flow analysis (reading order, line splitting, word/space/newline fragments).selection— nearest-character hit testing, A/B anchors, word selection, and per-page range expansion.page-arrangement— stable page-placement identity and pure operations for application-owned editing and synchronization models.Coordinate spaces: PDF page space is points (1/72"), origin bottom-left, y-up,
top >= bottom; document space is y-down over the whole laid-out document; view space is document space transformed by a ViewTransform.