Commit graph

5 commits

Author SHA1 Message Date
jedarden
62a36ea756 docs(pdftract-3eohy): add rustdoc examples to Glyph and Span types
- Add worked example to Glyph struct showing all 11 fields
- Add worked example to Span struct showing all 10 fields
- Examples use rust,no_run for internal dependencies
- cargo doc passes with docs.rs feature set
- Verification note added at notes/pdftract-3eohy.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 01:16:24 -04:00
jedarden
225f96c241 fix(pyo3): correct extract_text_fn call in extract_markdown stub
The extract_markdown stub was calling extract_text instead of
extract_text_fn, causing a compilation error. This fixes the
function name to match the exported function from extract_text.rs.

This completes the extract_text PyO3 entry point implementation,
which was already present in extract_text.rs and lib.rs.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 20:28:25 -04:00
jedarden
99b41f04b6 feat(pdftract-1q19p): implement OCG /OC tag tracking with is_hidden flag
Add is_hidden field to Glyph and MarkedContentFrame structs for tracking
Optional Content Group (OCG) visibility. When a BDC operator with /OC tag
references an OCG that is OFF by default, glyphs within that marked content
block receive is_hidden=true.

Changes:
- Glyph struct: Add is_hidden: bool field (default false)
- MarkedContentFrame struct: Add is_hidden: bool field (default false)
- MarkedContentStack: Add is_hidden() method to check if any frame is hidden
  (OR semantics: outer hidden makes all descendants hidden)
- MarkedContentFrame::bdc(): Add is_hidden parameter
- MarkedContentStack::push_bdc(): Add is_hidden parameter
- parse_bdc(): Add default_off_ocgs parameter to check OCG visibility
  - Extract /OCG reference from properties dict
  - Set is_hidden=true if OCG is in the OFF set
- emit_glyph(): Add is_hidden parameter and pass to Glyph::new()
- Add comprehensive tests for OCG functionality

Per bead pdftract-1q19p acceptance criteria:
- BDC /OC with OCG in default-OFF: glyphs have is_hidden=true
- BDC /OC with OCG not in OFF: glyphs have is_hidden=false
- Nested OCs with outer hidden: all inner glyphs hidden
- No /OCProperties: no glyphs marked hidden

Closes: pdftract-1q19p

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 22:25:27 -04:00
jedarden
a237397a34 feat(pdftract-4j0ub): implement Glyph struct and emit_glyph function
- Add Glyph struct with 10 fields per plan spec (Phase 3.2)
- Implement emit_glyph() that composes Glyph from GraphicsState + font metrics
- Add new_raw_glyph_list() helper with 4096 capacity pre-allocation
- Use Box<Color> to optimize struct size to 64 bytes
- Add comprehensive tests for all acceptance criteria
- Re-export Glyph, emit_glyph, new_raw_glyph_list from lib.rs

Closes: pdftract-4j0ub
2026-05-26 17:55:12 -04:00
jedarden
a39482f622 feat(pdftract-2q6sg): implement per-glyph advance computation and device bbox
Implemented compute_glyph_advance and compute_device_bbox functions for Phase 3
text processing with Tc/Tw/Tz corrections per ISO 32000-1 sec 9.2.4.

- compute_glyph_advance: Returns per-glyph text-space advance width incorporating
  Tc (char_spacing), Tw (word_spacing only for 0x20 in simple fonts), and Tz (horiz_scaling)
- compute_device_bbox: Maps glyph's font-unit bbox to PDF user space via
  text_matrix * CTM transformation with text rise (Ts) offset
- Font metrics dispatch: Std14 fonts use hardcoded widths, Type1/TrueType use /Widths
  array, Type0 use CID -> width (placeholder), Type3 use /Widths array
- is_simple_font helper: Identifies Type1/TrueType/MMType1 for Tw application

Passing acceptance criteria tests:
- 12pt Helvetica 'H' advance = 8.664 (722/1000 * 12)
- Tc 1 Tw 5 Tz 100 space advance = 9.336 ((278/1000 * 12) + 1 + 5)
- Tz 50 halves advance, font_size 0 returns 0 (no panic)
- is_simple_font correctly identifies Type1/TrueType, excludes Type0

Closes: pdftract-2q6sg
2026-05-26 16:58:13 -04:00