Nine catalogs of locked-up PDF pricing, turned into one searchable database.
A quoting team was reading repair prices out of PDF catalogs by hand, one part number at a time. I wrote a parser that reads those catalogs the way a person does — and turned them into roughly 9,400 clean, priced, searchable line items.
One catalog line, before and after — illustrative sample, real figures redacted
CF6-80C2 HPT STG 1 BLADE
SHROUD REPAIR
1250-4471-001 WELD RPR /
RECOAT
LIST 4,812.00
NET (30%)- engine
- CF6-80C2
- component
- HPT Stage 1 Blade Shroud
- part_number
- 1250-4471-001
- repair_type
- Weld Repair / Recoat
- list_price
- 4812.00
- md_price
- 3368.40auto −30%
The pricing existed. It just wasn't usable.
This client quotes component repairs against manufacturer catalogs covering nine engine families. Every one of those catalogs was a PDF.
PDFs are built to be printed, not queried. There's no table underneath — just text placed at coordinates. A single repair line routinely wraps across three or four visual rows, continues onto the next page, and drops its heading along the way. That's fine for a person holding a printout, and useless to a computer.
So the work was manual. Find the catalog, find the engine family, find the part number, read across for the repair type, read the list price, apply the contract discount by hand, and type it into a quote. Repeated across nine catalogs, with no way to search across them, no way to compare, and a fresh chance to fat-finger a price on every quote.
A parser that keeps its place in the document.
The problem isn't reading text off a page — plenty of tools do that. The problem is knowing what the text means once the layout falls apart. So I built a state-machine parser: it moves through the document holding onto context, so it still knows which engine family and which component a line belongs to after that line has wrapped, broken across a page, or lost its header.
Read the page
pdfplumber pulls raw positioned text out of every page of every catalog, preserving the ordering that layout implies.
Hold the context
A Python state machine tracks engine family, component, and repair context across wrapped lines and page breaks, and reassembles fragments into whole records.
Enforce a schema
Every record maps to a fixed schema — part number, repair type, list price — with contract pricing calculated automatically, not typed.
Make it searchable
A formatter reshapes the master dataset into the long format the front end needs, feeding a web app the quoting team searches directly.
What came out the other side.
- Schema
- Part number, repair type, component, engine family, list price, and a contract price column calculated at a fixed 30% discount.
- Stack
- Python and pdfplumber for extraction and parsing, CSV as the durable master format, and a separate formatter producing the long-format feed for the application layer.
- Front end
- Searchable web application filtering by part number, repair type, and engine family.
- Repeatability
- New or revised catalogs run back through the same pipeline. Updating pricing is a re-run, not a rebuild.
- Auditability
- Every row traces back to its source catalog, so a quoted price can be checked against the document it came from.
Every industry has pricing trapped in documents.
The engine families are specific to aviation. The problem isn't. Any business quoting from supplier PDFs, scanned rate sheets, or printed catalogs has the same bottleneck — and the same pipeline solves it.
Parts distribution & MRO
Manufacturer catalogs and repair schedules consolidated into one searchable source with contract pricing applied automatically.
Industrial & equipment supply
Vendor price books normalized across suppliers so quotes can be compared without opening six documents.
Healthcare & medical supply
Fee schedules and contracted rate sheets converted into structured data that billing and procurement can actually query.
Construction & trade supply
Takeoff and material pricing pulled out of supplier PDFs and kept current as price books change.
Sitting on data you can't search?
Send me one sample document and a description of what you wish you could ask it. You'll get a straight answer on whether it's worth building — free either way.