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
16 lines
691 B
Python
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"
|