Skip to content

bug: bordered stroke-width-ruled tables not detected (fuse charts) — blocked on pdf_oxide #814 #1213

Description

@tobocop2

What happens

Fully ruled three-column tables — the fuse charts in a 2011 Ford Crown Victoria owner's manual (pages 194–200) — are not detected as tables, and their text extracts column-by-column (all locations, then all ratings, then all circuit descriptions), so every row association is destroyed. A question like "what amp rating is fuse 101?" can't be answered from the extracted text.

Reproducer: https://gist.github.com/tobocop2/0d30905e2375e09b153ce50296316f91 (cv-manual.pdf), page 198 is the clearest single page.

Root cause: pdf_oxide path bounding boxes ignore stroke width

These tables draw each vertical rule as a ~1pt horizontal segment stroked with a line width equal to the table height:

430.05 w
q 1 0 0 1 236.154 402.163 cm
0 0 m  .998 0 l  S

Rendered, that's a full-height vertical bar. But pdf_oxide::extract_paths returns its bounding box as geometry only — bbox = (236.2, 402.2, w=1.0, h=0.0), stroke_width = 430.05 — so it fails is_table_primitive, the Lines-strategy detector sees a grid with no vertical rulings, and the whole table is missed.

This is a pdf_oxide-level defect: yfedoseev/pdf_oxide#812 (path bboxes ignore stroke width), fixed in yfedoseev/pdf_oxide#814. Once that lands and xberg bumps the dependency, extract_tables_with_config detects these rules natively with no xberg-side workaround.

Status: blocked on pdf_oxide #814

A stroke-aware detection workaround was prototyped (expanding stroke-width-encoded rule bboxes to their rendered geometry before the primitive filter), but it reimplements pdf_oxide's table pipeline inside xberg, which duplicates upstream internals and would drift as pdf_oxide evolves. That workaround is kept on a dedicated branch and will not be merged; the fix belongs upstream.

This issue is intentionally scoped to the pdf_oxide-blocked defect. The broader extraction-engine audit that this document triggered — redaction PII leaks, encoding handling, merged-cell alignment, and the rest — is tracked separately in #1223 and lands independently.

Related upstream

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Fields

No fields configured for Bug.

Projects

Status
In Progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions