Sample code for 30+ languages & platforms
Go 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 Go Downloads

Go
    success := false

    //  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

    pdf := chilkat.NewPdf()
    success = pdf.LoadFile("qa_data/pdf/spans_table.pdf")
    if success == false {
        fmt.Println(pdf.LastErrorText())
        pdf.DisposePdf()
        return
    }

    json := chilkat.NewJsonObject()
    jsonOut := chilkat.NewJsonObject()

    //  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.
    json.UpdateInt("minRows",3)
    json.UpdateInt("minColumns",3)

    success = pdf.ExtractText("tables",json,jsonOut)
    if success == false {
        fmt.Println(pdf.LastErrorText())
        pdf.DisposePdf()
        json.DisposeJsonObject()
        jsonOut.DisposeJsonObject()
        return
    }

    fmt.Println("Tables found: ", jsonOut.IntOf("count"))
    fmt.Println(jsonOut.IntOf("tables[0].rows"), " rows x ", jsonOut.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.
    var rowSpan int
    var colSpan int
    j := 0
    count_j := jsonOut.SizeOfArray("tables[0].cells")
    for j < count_j {
        jsonOut.SetJ(j)
        rowSpan = jsonOut.IntOf("tables[0].cells[j].rowSpan")
        colSpan = jsonOut.IntOf("tables[0].cells[j].colSpan")
        if (rowSpan > 1) || (colSpan > 1) {
            fmt.Println("row ", jsonOut.IntOf("tables[0].cells[j].row"), ", col ", jsonOut.IntOf("tables[0].cells[j].col"), ": \"", *jsonOut.StringOf("tables[0].cells[j].text")
                , "\" spans ", rowSpan, " row(s) and ", colSpan, " column(s)")
        }

        j = j + 1
    }

    //  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)

    pdf.DisposePdf()
    json.DisposeJsonObject()
    jsonOut.DisposeJsonObject()