Sample code for 30+ languages & platforms
Visual FoxPro Requires Chilkat v11.7.0+

Extract a PDF Table with Merged Cells

See more PDF Text Extraction Examples

Demonstrates how merged cells are reported by the "tables" operation: a header cell that spans several columns has colSpan greater than 1, and a row label that spans several rows has rowSpan greater than 1. Also shows the minRows and minColumns options.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loPdf
LOCAL loJson
LOCAL loJsonOut
LOCAL lnRowSpan
LOCAL lnColSpan
LOCAL j
LOCAL lnCount_j

lnSuccess = 0

*  This example requires the Chilkat API to have been previously unlocked.
*  See Global Unlock Sample for sample code.

*  The PDF used in this example is available at spans_table.pdf

loPdf = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf.LoadFile("qa_data/pdf/spans_table.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf.LastErrorText
    RELEASE loPdf
    CANCEL
ENDIF

loJson = CreateObject('Chilkat.JsonObject')
loJsonOut = CreateObject('Chilkat.JsonObject')

*  Grids smaller than minRows x minColumns are not reported as tables.  The defaults are 2 and 2.
*  Setting them higher skips small boxes that are not really tables.
loJson.UpdateInt("minRows",3)
loJson.UpdateInt("minColumns",3)

lnSuccess = loPdf.ExtractText("tables",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf.LastErrorText
    RELEASE loPdf
    RELEASE loJson
    RELEASE loJsonOut
    CANCEL
ENDIF

? "Tables found: " + STR(loJsonOut.IntOf("count"))
? STR(loJsonOut.IntOf("tables[0].rows")) + " rows x " + STR(loJsonOut.IntOf("tables[0].columns")) + " columns"

*  A merged cell is reported once, at its top-left position, with its spans.
*  The positions it covers have no cell of their own.

j = 0
lnCount_j = loJsonOut.SizeOfArray("tables[0].cells")
DO WHILE j < lnCount_j
    loJsonOut.J = j
    lnRowSpan = loJsonOut.IntOf("tables[0].cells[j].rowSpan")
    lnColSpan = loJsonOut.IntOf("tables[0].cells[j].colSpan")
    IF ((lnRowSpan > 1) OR (lnColSpan > 1)) THEN
        ? "row " + STR(loJsonOut.IntOf("tables[0].cells[j].row")) + ", col " + STR(loJsonOut.IntOf("tables[0].cells[j].col")) + ': "' + loJsonOut.StringOf("tables[0].cells[j].text") + '" spans ' + STR(lnRowSpan) + " row(s) and " + STR(lnColSpan) + " column(s)"
    ENDIF

    j = j + 1
ENDDO

*  Sample output:

*  Tables found: 1
*  6 rows x 6 columns
*  row 0, col 0: "Area" spans 2 row(s) and 1 column(s)
*  row 0, col 1: "City" spans 2 row(s) and 1 column(s)
*  row 0, col 2: "First Half" spans 1 row(s) and 2 column(s)
*  row 0, col 4: "Second Half" spans 1 row(s) and 2 column(s)
*  row 2, col 0: "East" spans 2 row(s) and 1 column(s)
*  row 4, col 0: "West" spans 2 row(s) and 1 column(s)

RELEASE loPdf
RELEASE loJson
RELEASE loJsonOut