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
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:
Rendered, that's a full-height vertical bar. But
pdf_oxide::extract_pathsreturns its bounding box as geometry only —bbox = (236.2, 402.2, w=1.0, h=0.0),stroke_width = 430.05— so it failsis_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_configdetects 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