Files
daveandClaude Fable 5 c9c90920cc v1.1.0: headerless mode for audits printed without row/column headings
Sniffs the format on page 1: printed row numbers -> gridded mode
(unchanged); UUID-keyed rows -> new headerless mode, which anchors rows
on per-record UUIDs and takes the column map from the page-1 header
labels. Handles fused cells (ID+Name+Org+networks), mid-value line
wraps, two-timestamp Time Frame ranges, wrapped header labels, and
per-export schema drift. Validated against three monthly JC PD audits:
120/120 cross-engine spot checks, 0 anomalies, field-identical to the
standalone converter it replaces.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012bQ28wRBiQYcSR9FzV9U7c
2026-09-12 18:29:13 -04:00

16 lines
691 B
Python

"""pinion-pdf: turn a spreadsheet that was printed to PDF back into a CSV.
Someone took a spreadsheet, hit "Print", and handed out the PDF. pinion
measures the PDF before it reads it -- page size, column widths, column and
row counts are all derived from the file -- rebuilds every row, detects
blacked-out cells, and then checks its own working.
MAP: page.py - reading what the PDF drew on a page
measure.py - measuring the gridded layout
convert.py - rebuilding gridded rows
headerless.py - the no-headings variant (UUID + header anchors)
cli.py - sniff the format, run it, check our own working
"""
__version__ = "1.1.0"