Skip to content

Table Generator

Starting in version 8.4, Foxit PDF SDK introduced table generation, allowing developers to add structured table content to PDF files programmatically.

Core Capabilities

With the table generator, developers can flexibly create complex tables containing text, images, and other elements, and customize layout, border styles, and cell content. This feature is widely used for report generation, data presentation, and document layout.

API Overview

Foxit PDF SDK provides the following static methods to add tables to a PDF document or a specific page:

  • static boolean AddTableToPage(PDFPage, TableData, TableCellDataArray)

    Adds a new table to the specified PDF page.

  • static boolean insertTablePagesToDocument (doc, dest_page_index, page_width, page_height, TableData, TableCellDataArray, boolean allow_to_cross_page, TableGeneratorCallback)

    Inserts a new table that can span one or more pages into the document.

System Requirements

Platforms: Windows, Mac, Linux

Languages: C, C++, Java, C#, Python, Objective-C, Node.js, Go

License: A license key that includes the TableMaker module

SDK versions:

  • Foxit PDF SDK 8.4+
  • Foxit PDF SDK (Node.js) 10.0+
  • Foxit PDF SDK (Go) 11.0+

Add a Table to a PDF Document

In the \examples\simple_demo\electronictable folder, Foxit PDF SDK provides an electronic table sample that demonstrates how to add tables to a PDF document with Foxit PDF SDK.

c++
#include "include/common/fs_common.h"
#include "include/pdf/annots/fs_annot.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_pdfpage.h"
#include "include/addon/tablegenerator/fs_tablegenerator.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace foxit::addon::tablegenerator;

...
// Add a spreadsheet with 4 rows and 3 columns
int index = 0;
TableCellDataArray cell_array;
for (int row = 0; row < 4; row++) {
  TableCellDataColArray col_array;
  for (int col = 0; col < 3; col++) {
     RichTextStyle style = GetTableTextStyle(index);
     WString cell_text = GetTableCellText(index++);
     TableCellData cell_data(style, cell_text, foxit::common::Image((FS_HANDLE)NULL), RectF());
     col_array.Add(cell_data);
  }
  cell_array.Add(col_array);
}
FX_FLOAT page_width = pdf_page.GetWidth();
FX_FLOAT page_height = pdf_page.GetHeight();
 
TableBorderInfo outside_border_left;
outside_border_left.line_width = 1;
TableBorderInfo outside_border_right;
outside_border_right.line_width = 1;
TableBorderInfo outside_border_top;
outside_border_top.line_width = 1;
TableBorderInfo outside_border_bottom;
outside_border_bottom.line_width = 1;
TableBorderInfo inside_border_row;
inside_border_row.line_width = 1;
TableBorderInfo inside_border_col;
inside_border_col.line_width = 1;
TableData data(RectF(100, 550, page_width - 100, page_height - 100), 4, 3, outside_border_left, outside_border_right, outside_border_top, outside_border_bottom, inside_border_row, inside_border_col, TableCellIndexArray(), FloatArray(), FloatArray());
TableGenerator::AddTableToPage(pdf_page, data, cell_array);
...
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_pdfpage_c.h"
#include "include/fs_tablegenerator_c.h"

// Add a spreadsheet with 4 rows and 3 columns
int index = 0;
wchart_t cell_text[12];
FSTableCellData cell_array[4][3];
for (int row = 0; row < 4; row++) {
  for (int col = 0; col < 3; col++) {
    SetTableTextStyle(index, cell_array[row][col].cell_text_style);
cell_text[index] = GetTableCellText(index);
wcsp
    cell_array[row][col].cell_text.str = (wchar_t*)cell_text[index];
    cell_array[row][col].cell_text.len = wcslen(cell_text[index]);
    cell_array[row][col].cell_image = 0;
    cell_array[row][col].cell_margin.left = 0;
    cell_array[row][col].cell_margin.right = 0;
    cell_array[row][col].cell_margin.bottom = 0;
    cell_array[row][col].cell_margin.top = 0;
    index++;
  }
}
float page_width = 0;
float page_height = 0;
FSDK_PDFPage_GetWidth(pdf_page, &page_width);
FSDK_PDFPage_GetHeight(pdf_page, &page_height);

FSTableData data;
data.row_count = 4;
data.col_count = 3;
data.outside_border_left.line_width = 1;
data.outside_border_left.table_border_style = FSTableBorderStyle::e_FSTableBorderStyleSolid;
data.outside_border_left.color = 0xFF000000;
data.outside_border_left.array_length_dashes = 0;
data.outside_border_top.line_width = 1;
data.outside_border_top.table_border_style = FSTableBorderStyle::e_FSTableBorderStyleSolid;
data.outside_border_top.color = 0xFF000000;
data.outside_border_top.array_length_dashes = 0;
data.outside_border_right.line_width = 1;
data.outside_border_right.table_border_style = FSTableBorderStyle::e_FSTableBorderStyleSolid;
data.outside_border_right.color = 0xFF000000;
data.outside_border_right.array_length_dashes = 0;
data.outside_border_bottom.line_width = 1;
data.outside_border_bottom.table_border_style = FSTableBorderStyle::e_FSTableBorderStyleSolid;
data.outside_border_bottom.color = 0xFF000000;
data.outside_border_bottom.array_length_dashes = 0;
data.inside_border_col.line_width = 1;
data.inside_border_col.table_border_style = FSTableBorderStyle::e_FSTableBorderStyleSolid;
data.inside_border_col.color = 0xFF000000;
data.inside_border_col.array_length_dashes = 0;
data.inside_border_row.line_width = 1;
data.inside_border_row.table_border_style = FSTableBorderStyle::e_FSTableBorderStyleSolid;
data.inside_border_row.color = 0xFF000000;
data.inside_border_row.array_length_dashes = 0;
data.merge_cells_length = 0;
data.row_height_array = NULL;
data.array_length_row_height = 0;
data.col_width_array = NULL;
data.array_length_col_width = 0;

FSRectF rect;
rect.left = 100;
rect.right = page_width - 100;
rect.top = page_height - 100;
rect.bottom = 550;
data.rect = rect;

FS_BOOL ret;
FSErrorCode error_code = FSDK_TableGenerator_AddTableToPage(pdf_page, data, (const FSTableCellData**)cell_array, 4, 3, &ret);
if (error_code != e_FSErrSuccess) {
  printf("AddElectronicTable fail [%d]\r\n", error_code);
}
java
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.common.fxcrt.FloatArray;
import com.foxit.sdk.common.Image;

import com.foxit.sdk.pdf.annots.RichTextStyle;
import com.foxit.sdk.addon.tablegenerator.TableBorderInfo;
import com.foxit.sdk.addon.tablegenerator.TableData;
import com.foxit.sdk.addon.tablegenerator.TableCellData;
import com.foxit.sdk.addon.tablegenerator.TableCellDataArray;
import com.foxit.sdk.addon.tablegenerator.TableCellDataColArray;
import com.foxit.sdk.addon.tablegenerator.TableCellIndexArray;
import com.foxit.sdk.addon.tablegenerator.TableGenerator;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;

int index = 0;
TableCellDataArray cell_array = new TableCellDataArray();

for (int row = 0; row < 4; row++) {
    TableCellDataColArray col_array = new TableCellDataColArray();
    for (int col = 0; col < 3; col++) {
        String cell_text = GetTableCellText(index);
        RichTextStyle style = GetTableTextStyle(index++);
        TableCellData cell_data = new TableCellData(style, cell_text, new Image(), new RectF());
        col_array.add(cell_data);
    }
        cell_array.add(col_array);
}
float page_width = pdf_page.getWidth();
float page_height = pdf_page.getHeight();
RectF rect = new RectF(100, 550, page_width - 100, page_height - 100);
TableBorderInfo outsideborderinfoleft = new TableBorderInfo();
outsideborderinfoleft.setLine_width(1);
TableBorderInfo outsideborderinforight = new TableBorderInfo();
outsideborderinforight.setLine_width(1);
TableBorderInfo outsideborderinfotop = new TableBorderInfo();
outsideborderinfotop.setLine_width(1);
TableBorderInfo outsideborderinfobottom = new TableBorderInfo();
outsideborderinfobottom.setLine_width(1);

TableBorderInfo insideborderinfo_row = new TableBorderInfo();
insideborderinfo_row.setLine_width(1);
TableBorderInfo insideborderinfo_col = new TableBorderInfo();
insideborderinfo_col.setLine_width(1);
TableData data = new TableData(rect, 4, 3, outsideborderinfoleft, outsideborderinforight, outsideborderinfotop,outsideborderinfobottom,insideborderinfo_row, insideborderinfo_col, new TableCellIndexArray(),new FloatArray(), new FloatArray());
TableGenerator.addTableToPage(pdf_page, data, cell_array);
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    site.addsitedir('../../../')
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

index = 0
cell_array = TableCellDataArray()
for row in range(0, 4):
    col_array = TableCellDataColArray()
    for col in range(0, 3):
        style = GetTableTextStyle(index)
        cell_text = GetTableCellText(index)
        cell_data = TableCellData(style, cell_text, Image(), RectF())
        col_array.Add(cell_data)
        index = index + 1
    cell_array.Add(col_array)

page_width = pdf_page.GetWidth()
page_height = pdf_page.GetHeight()
outside_border_left = TableBorderInfo()
outside_border_left.line_width = 1
outside_border_left.table_border_style = TableBorderInfo.e_TableBorderStyleSolid
outside_border_right = TableBorderInfo()
outside_border_right.line_width = 1
outside_border_right.table_border_style = TableBorderInfo.e_TableBorderStyleSolid
outside_border_top = TableBorderInfo()
outside_border_top.line_width = 1
outside_border_top.table_border_style = TableBorderInfo.e_TableBorderStyleSolid
outside_border_bottom = TableBorderInfo()
outside_border_bottom.line_width = 1
outside_border_bottom.table_border_style = TableBorderInfo.e_TableBorderStyleSolid

inside_border_row_info = TableBorderInfo()
inside_border_row_info.line_width = 1
inside_border_row_info.table_border_style = TableBorderInfo.e_TableBorderStyleSolid
inside_border_col_info = TableBorderInfo()
inside_border_col_info.line_width = 1
inside_border_col_info.table_border_style = TableBorderInfo.e_TableBorderStyleSolid

data = TableData(RectF(100, 550, page_width - 100, page_height - 100), 4, 3, outside_border_left, outside_border_right,
                            outside_border_top, outside_border_bottom, inside_border_row_info, inside_border_col_info, TableCellIndexArray(), FloatArray(), FloatArray())
TableGenerator.AddTableToPage(pdf_page, data, cell_array)
objc
#include "FSPDFObjC.h"

// Add a spreadsheet with 4 rows and 3 columns
int index = 0;
FSTableCellDataArray *cell_array = [[FSTableCellDataArray alloc] init];
for (int row = 0; row < 4; row++) {
    FSTableCellDataColArray *col_array = [[FSTableCellDataColArray alloc] init];
    for (int col = 0; col < 3; col++) {
        FSRichTextStyle *style = GetTableTextStyle(index);
        NSString *cell_text = GetTableCellText(index);
        FSImage *cell_image = [[FSImage alloc] init];
        FSRectF* rect = [[FSRectF alloc] init];
        FSTableCellData *cell_data = [[FSTableCellData alloc] initWithCell_text_style:style cell_text:cell_text cell_image:cell_image cell_margin:rect];
        [col_array add:cell_data];
        index = index + 1;
    }
    [cell_array add:col_array];
}

float width = [pdf_page getWidth];
float height = [pdf_page getHeight];
float right = width - 100;
float top = height - 100;
FSRectF* rect = [[FSRectF alloc] initWithLeft1:100 bottom1:550 right1:right top1:top];
FSTableBorderInfo *outside_border_left = [[FSTableBorderInfo alloc] init];
outside_border_left.line_width = 1;
FSTableBorderInfo *outside_border_right = [[FSTableBorderInfo alloc] init];
outside_border_right.line_width = 1;
FSTableBorderInfo *outside_border_top = [[FSTableBorderInfo alloc] init];
outside_border_top.line_width = 1;
FSTableBorderInfo *outside_border_bottom = [[FSTableBorderInfo alloc] init];
outside_border_bottom.line_width = 1;
FSTableBorderInfo *inside_border_col_info = [[FSTableBorderInfo alloc] init];
inside_border_col_info.line_width = 1;
FSTableBorderInfo *inside_border_row_info = [[FSTableBorderInfo alloc] init];
inside_border_row_info.line_width = 1;
FSTableCellIndexArray* merge_cells = [[FSTableCellIndexArray alloc] init];
FSFloatArray* row_height_array = [[FSFloatArray alloc] init];
FSFloatArray* col_width_array = [[FSFloatArray alloc] init];
FSTableData* data = [[FSTableData alloc] initWithRect:rect row_count:4 col_count:3 outside_border_left:outside_border_left outside_border_right:outside_border_right outside_border_top:outside_border_top outside_border_bottom:outside_border_bottom inside_border_row:inside_border_col_info inside_border_col:inside_border_row_info merge_cells:merge_cells row_height_array:row_height_array col_width_array:col_width_array];

[FSTableGenerator addTableToPage:pdf_page data:data cell_array:cell_array];
js
const FSDK = require("@fuxinsoft/foxit-pdf-sdk-node");


let index = 0;
let cell_array = new FSDK.TableCellDataArray();
for (let row = 0; row < 4; row++) {
  let col_array = new FSDK.TableCellDataColArray();
  for (let col = 0; col < 3; col++) {
    style = GetTableTextStyle(index);
    let cell_text = GetTableCellText(index++);
    let cell_data = new FSDK.TableCellData(style, 0xFFFFFFFF, cell_text, new FSDK.Image(), new FSDK.RectF());
    col_array.Add(cell_data);
  }
  cell_array.Add(col_array);
}
let page_width = page.GetWidth();
let page_height = page.GetHeight();
 
let outside_border_left = new FSDK.TableBorderInfo();
outside_border_left.line_width = 1;
let outside_border_right = new FSDK.TableBorderInfo();
outside_border_right.line_width = 1;
let outside_border_top = new FSDK.TableBorderInfo();
outside_border_top.line_width = 1;
let outside_border_bottom = new FSDK.TableBorderInfo();
outside_border_bottom.line_width = 1;
let inside_border_row = new FSDK.TableBorderInfo();
inside_border_row.line_width = 1;
let inside_border_col = new FSDK.TableBorderInfo();
inside_border_col.line_width = 1;
let data = new FSDK.TableData(new FSDK.RectF(100, 550, page_width - 100, page_height - 100), 4, 3, outside_border_left, outside_border_right, outside_border_top, outside_border_bottom, inside_border_row, inside_border_col, new FSDK.TableCellIndexArray(), new FSDK.FloatArray(), new FSDK.FloatArray());
FSDK.TableGtor.AddTableToPage(pageenera, data, cell_array);
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.addon;
using foxit.addon.tablegenerator;
...
// Add a spreadsheet with 4 rows and 3 columns
int index = 0;
using (TableCellDataArray cell_array = new TableCellDataArray())
{
  for (int row = 0; row < 4; row++)
  {
    using (RichTextStyle style = new RichTextStyle())
    using (TableCellDataColArray col_array = new TableCellDataColArray())
    {
      for (int col = 0; col < 3; col++)
      {
        string cell_text = GetTableCellText(index);
        SetTableTextStyle(index++, style);
        Image image = new Image();
        using (TableCellData cell_data = new TableCellData(style, cell_text, image, new RectF()))
        {
          col_array.Add(cell_data);
        }
      }
      cell_array.Add(col_array);
    }
  }
  float page_width = pdf_page.GetWidth();
  float page_height = pdf_page.GetHeight();
  TableBorderInfo outside_border_left = new TableBorderInfo();
  outside_border_left.line_width = 1;
  outside_border_left.table_border_style = TableBorderInfo.TableBorderStyle.e_TableBorderStyleSolid;
  TableBorderInfo outside_border_right = new TableBorderInfo();
  outside_border_right.line_width = 1;
  outside_border_right.table_border_style = TableBorderInfo.TableBorderStyle.e_TableBorderStyleSolid;
  TableBorderInfo outside_border_top = new TableBorderInfo();
  outside_border_top.line_width = 1;
  outside_border_top.table_border_style = TableBorderInfo.TableBorderStyle.e_TableBorderStyleSolid;
  TableBorderInfo outside_border_bottom = new TableBorderInfo();
  outside_border_bottom.line_width = 1;
  outside_border_bottom.table_border_style = TableBorderInfo.TableBorderStyle.e_TableBorderStyleSolid;
  TableBorderInfo inside_border_row_info = new TableBorderInfo();
  inside_border_row_info.line_width = 1;
  inside_border_row_info.table_border_style = TableBorderInfo.TableBorderStyle.e_TableBorderStyleSolid;
  TableBorderInfo inside_border_col_info = new TableBorderInfo();
  inside_border_col_info.line_width = 1;
  inside_border_col_info.table_border_style = TableBorderInfo.TableBorderStyle.e_TableBorderStyleSolid;
  using (RectF rect = new RectF(100, 550, page_width - 100, page_height - 100))
  using (TableData data = new TableData(rect, 4, 3, outside_border_left, outside_border_right, outside_border_top, outside_border_bottom, inside_border_row_info, inside_border_col_info, new TableCellIndexArray(), new FloatArray(), new FloatArray()))
  {
    TableGenerator.AddTableToPage(pdf_page, data, cell_array);
  }
}
...
go
import (
. "foxit.com/fsdk"
) 

index := 0
cell_array := NewTableCellDataArray()
for row:= 0; row< 4; row++{
    col_array := NewTableCellDataColArray()
    for col := 0 ;col< 3; col++{
        style := GetTableTextStyle(index)
        cell_text := GetTableCellText(index)
        cell_data := NewTableCellData(style, cell_text, NewImage(), NewRectF())
        col_array.Add(cell_data)
        index = index + 1
}
    cell_array.Add(col_array)
}
page_width := pdf_page.GetWidth()
page_height := pdf_page.GetHeight()
outside_border_left := NewTableBorderInfo()
outside_border_left.SetLine_width(1)
outside_border_left.SetTable_border_style(TableBorderInfoE_TableBorderStyleSolid)
outside_border_right := NewTableBorderInfo()
outside_border_right.SetLine_width(1)
outside_border_right.SetTable_border_style(TableBorderInfoE_TableBorderStyleSolid)
outside_border_top := NewTableBorderInfo()
outside_border_top.SetLine_width(1)
outside_border_top.SetTable_border_style(TableBorderInfoE_TableBorderStyleSolid)
outside_border_bottom := NewTableBorderInfo()
outside_border_bottom.SetLine_width(1)
outside_border_bottom.SetTable_border_style(TableBorderInfoE_TableBorderStyleSolid)

inside_border_row_info := NewTableBorderInfo()
inside_border_row_info.SetLine_width(1)
inside_border_row_info.SetTable_border_style(TableBorderInfoE_TableBorderStyleSolid)
inside_border_col_info := NewTableBorderInfo()
inside_border_col_info.SetLine_width(1)
inside_border_col_info.SetTable_border_style(TableBorderInfoE_TableBorderStyleSolid)

data := NewTableData(NewRectF(100, 550, page_width - 100, page_height - 100), 4, 3, outside_border_left, outside_border_right,
                            outside_border_top, outside_border_bottom, inside_border_row_info, inside_border_col_info, NewTableCellIndexArray(), NewFloatArray(), NewFloatArray())
TableGeneratorAddTableToPage(pdf_page, data, cell_array)