Extraction schema:
{"type": "object", "additionalProperties": false, "description": "Structural extraction of every numeric data TABLE (cross-tabulation / pivot) printed on a U.S. Census Bureau Statistical Abstract page. The page is statistical tables, NOT prose. Capture each table as a generic pivot: ordered leaf column headers captured once, then one row per stub line with a positional value array aligned to those columns. Preserve printed null markers verbatim. Extract EVERY value cell — do not leave a cell null unless the page itself shows it blank.", "properties": {"tables": {"type": "array", "description": "One entry per distinct titled data table on the page (a page may contain 2+ tables, e.g. 'Table 1' and 'Table 2'). Include every numbered/titled statistical table. Do NOT include the page header/footer, source notes, or footnote-definition lines as tables. If one printed table contains two side-by-side panels with DIFFERENT column structures (a genuinely different sub-table to its right), emit them as two entries with the SAME table_number (the second is a continuation).", "items": {"$ref": "#/$defs/PivotTable"}}}, "required": ["tables"], "$defs": {"PivotTable": {"type": "object", "additionalProperties": false, "properties": {"table_number": {"type": ["string", "null"], "description": "The printed table identifier exactly as shown, digits only without the word 'Table' (e.g. for 'Table 34.' return '34'). Label aliases: 'Table N.', 'TABLE N'. Do NOT confuse with the page number (bottom corner) or a footnote superscript. Null if the table is untitled."}, "table_title": {"type": "string", "description": "The full printed title text of the table, verbatim, minus the leading 'Table N.' prefix (e.g. 'Persons 65 Years Old and Over—Characteristics by Sex: 1990 to 2010'). Do NOT include the bracketed [headnote] that follows the title."}, "column_headers": {"type": "array", "items": {"type": "string"}, "description": "The ordered list of LEAF (bottom-most) data-column labels, left to right, EXCLUDING the leftmost stub column that holds the row labels. RULES (apply exactly, for determinism): (1) The leftmost column is the STUB / row-identifier column (its cells are entity/period names like a Year, State, Age group, or income bracket) — it is NEVER a column_header; it becomes row_label. Do NOT emit it as a value column. (2) Multi-level header: join the SPANNING (top, group) label FIRST, then the LEAF (lower) sub-label, with ' / ' (e.g. spanning 'Number of families (1,000)' over leaf 'White alone' -> 'Number of families (1,000) / White alone'; spanning 'Male' over leaf '1990' -> 'Male / 1990'). Always outer-then-inner, never reversed. Use each printed label verbatim. (3) SIDE-BY-SIDE REPEATED PANELS: if the page prints the SAME column set twice side by side to save space (e.g. a 'Year | ...' block on the left and an identical 'Year | ...' block on the right, each covering different row entities), treat it as ONE logical table: emit the column set ONCE here, and append the right panel's entities as additional rows below the left panel's rows. (4) The length of this array MUST equal the number of value cells in every data row."}, "rows": {"type": "array", "description": "One entry per data row (stub line) of the table, in printed top-to-bottom order. INCLUDE section-total rows and category rows that carry values. EXCLUDE pure section-heading lines that have a label but NO values in any column (e.g. 'PERCENT DISTRIBUTION', 'Marital status:') — those are headings, not data rows. For side-by-side repeated panels (see column_headers rule 3), list the left panel's rows first, then the right panel's rows.", "items": {"$ref": "#/$defs/PivotRow"}}}, "required": ["table_number", "table_title", "column_headers", "rows"]}, "PivotRow": {"type": "object", "additionalProperties": false, "properties": {"row_label": {"type": "string", "description": "The leftmost stub-cell text for this row, verbatim, with trailing dot-leaders and trailing footnote superscripts removed (e.g. 'Never married....  2' -> 'Never married'; 'All families 1' -> 'All families'). Preserve internal wording as printed. This is the identity_key for the row within its table; it must be the printed entity/period name (Year, State, income bracket, category), NOT a value."}, "values": {"type": "array", "items": {"type": ["string", "null"]}, "description": "The data cell values for this row, left to right, one entry per column_headers entry (same length, same order). Each value is the printed cell content verbatim as a string, INCLUDING thousands separators/commas exactly as printed (e.g. '180,671') and including a printed null marker verbatim if the cell shows one (e.g. '(NA)' = not available, '(X)' = not applicable, '-' = zero/none). Strip a leading footnote superscript that prefixes a number. Provide a value for EVERY column of the row — only use JSON null when the cell is genuinely blank on the page (NOT when you are merely unsure)."}}, "required": ["row_label", "values"]}}}

Expected output:
{"tables": [{"table_number": "34", "table_title": "Persons 65 Years Old and Over—Characteristics by Sex: 1990 to 2010", "column_headers": ["Total / 1990", "Total / 2000", "Total / 2005", "Total / 2010", "Male / 1990", "Male / 2000", "Male / 2005", "Male / 2010", "Female / 1990", "Female / 2000", "Female / 2005", "Female / 2010"], "rows": [{"row_label": "Total (million)", "values": ["29.6", "32.6", "35.2", "38.6", "12.3", "13.9", "15.1", "16.8", "17.2", "18.7", "20.0", "21.8"]}, {"row_label": "Never married", "values": ["4.6", "3.9", "4.1", "4.3", "4.2", "4.2", "4.4", "4.1", "4.9", "3.6", "3.9", "4.5"]}, {"row_label": "Married", "values": ["56.1", "57.2", "57.7", "57.6", "76.5", "75.2", "74.9", "74.5", "41.4", "43.8", "44.7", "44.5"]}, {"row_label": "Spouse present", "values": ["54.1", "54.6", "54.8", "55.2", "74.2", "72.6", "71.7", "71.7", "39.7", "41.3", "42.0", "42.4"]}, {"row_label": "Spouse absent", "values": ["2.0", "2.6", "2.9", "2.4", "2.3", "2.6", "3.2", "2.8", "1.7", "2.5", "2.7", "2.1"]}, {"row_label": "Widowed", "values": ["34.2", "32.1", "30.3", "28.1", "14.2", "14.4", "13.7", "12.7", "48.6", "45.3", "42.9", "39.9"]}, {"row_label": "Divorced", "values": ["5.0", "6.7", "7.9", "10.0", "5.0", "6.1", "7.0", "8.7", "5.1", "7.2", "8.5", "11.1"]}, {"row_label": "Less than ninth grade", "values": ["28.5", "16.7", "13.4", "10.2", "30.0", "17.8", "13.2", "10.2", "27.5", "15.9", "13.5", "10.1"]}, {"row_label": "Completed 9th to 12th grade, but no high school diploma", "values": ["16.1", "13.8", "12.7", "10.3", "15.7", "12.7", "11.9", "9.7", "16.4", "14.7", "13.3", "10.8"]}, {"row_label": "High school graduate", "values": ["32.9", "35.9", "36.3", "36.4", "29.0", "30.4", "31.6", "32.0", "35.6", "39.9", "39.9", "39.8"]}, {"row_label": "Some college or associate’s degree", "values": ["10.9", "18.0", "18.7", "20.6", "10.8", "17.8", "18.4", "19.7", "11.0", "18.2", "19.0", "21.2"]}, {"row_label": "Bachelor’s or advanced degree", "values": ["11.6", "15.6", "18.9", "22.5", "14.5", "21.4", "24.9", "28.4", "9.5", "11.4", "14.3", "18.0"]}, {"row_label": "Employed", "values": ["11.5", "12.4", "14.5", "16.2", "15.9", "16.9", "19.1", "20.5", "8.4", "9.1", "11.1", "12.9"]}, {"row_label": "Unemployed", "values": ["0.4", "0.4", "0.5", "1.2", "0.5", "0.6", "0.7", "1.6", "0.3", "0.3", "0.4", "0.9"]}, {"row_label": "Not in labor force", "values": ["88.1", "87.2", "84.9", "82.6", "83.6", "82.5", "80.2", "77.9", "91.3", "90.6", "88.5", "86.2"]}, {"row_label": "Percent below poverty level", "values": ["11.4", "9.7", "9.8", "(NA)", "7.8", "6.9", "7.0", "(NA)", "13.9", "11.8", "11.9", "(NA)"]}]}, {"table_number": "35", "table_title": "Persons 65 Years and Over—Living Arrangements and Disability Status: 2009", "column_headers": ["Number", "Percent distribution"], "rows": [{"row_label": "Total", "values": ["39,507", "100.0"]}, {"row_label": "In households", "values": ["37,648", "95.3"]}, {"row_label": "In family households", "values": ["25,950", "65.7"]}, {"row_label": "Householder", "values": ["12,955", "32.8"]}, {"row_label": "Spouse", "values": ["9,299", "23.5"]}, {"row_label": "Parent", "values": ["2,125", "5.4"]}, {"row_label": "Other relatives", "values": ["1,405", "3.6"]}, {"row_label": "Nonrelatives", "values": ["166", "0.4"]}, {"row_label": "In nonfamily households", "values": ["11,698", "29.6"]}, {"row_label": "Householder", "values": ["11,190", "28.3"]}, {"row_label": "Living alone", "values": ["10,659", "27.0"]}, {"row_label": "Not living alone", "values": ["530", "1.3"]}, {"row_label": "Nonrelatives", "values": ["508", "1.3"]}, {"row_label": "In group quarters", "values": ["1,858", "4.7"]}]}, {"table_number": "35", "table_title": "Persons 65 Years and Over—Living Arrangements and Disability Status: 2009", "column_headers": ["Total", "65 to 74 years old", "75 years old and over"], "rows": [{"row_label": "Persons with any disability", "values": ["14,189", "5,278", "8,902"]}, {"row_label": "With a hearing disability", "values": ["5,847", "1,904", "3,943"]}, {"row_label": "With a vision disability", "values": ["2,696", "877", "1,819"]}, {"row_label": "With a cognitive disability", "values": ["3,600", "1,117", "2,483"]}, {"row_label": "With a ambulatory disability", "values": ["9,213", "3,392", "5,822"]}, {"row_label": "With a self-care disability", "values": ["3,326", "953", "2,374"]}, {"row_label": "With an independent living disability", "values": ["6,236", "1,699", "4,537"]}]}]}