mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-27 11:37:59 -06:00
Use checked sample lengths and row padding before the EI delimiter heuristic. Cover valid binary terminator-like samples, masks, Indexed, aliases, invalid layouts and saved classic/packed PDFs. Co-authored-by: MMexicann <MMexicann@users.noreply.github.com> Co-authored-by: Codex <noreply@openai.com> Co-authored-by: Brandon Thomas <echelon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
20 lines
998 B
Markdown
20 lines
998 B
Markdown
# pdfcraft-content
|
|
|
|
Layer L2: content streams (ISO 32000-2 §7.8.2, §8, §9).
|
|
|
|
```rust
|
|
let parsed = parse(&stream.decoded()?); // operators with operands and source spans
|
|
for op in &parsed.ops { if op.is("Tj") { /* … */ } }
|
|
let bytes = serialize_ops(&parsed.ops); // write back (inline images kept whole)
|
|
let m = Matrix::from_operands(&op.operands); // cm / Tm arithmetic, invert, bbox
|
|
```
|
|
|
|
The parser is tolerant (unreadable bytes are skipped and counted, never fatal) and never
|
|
panics. `redact` and (later) `edit` build their interpreters on it; the graphics-state tracker
|
|
and the `Patch` API of architecture §6 grow here.
|
|
|
|
Unfiltered inline images with built-in or Indexed colour spaces, and image masks, use their
|
|
sample layout (including per-row byte padding) to locate `EI`. This preserves pixel bytes
|
|
that look like the terminator. Filtered images and resource-defined colour spaces retain
|
|
the tolerant delimiter heuristic; damaged or truncated layouts fall back to it too.
|