表格生成器(Table Generator)
自 8.4 版本起,福昕 PDF SDK 引入了表格生成功能,允许开发者以编程方式向 PDF 文件中添加结构化的表格内容。
核心功能
通过表格生成器,开发者可以灵活地创建包含文本、图像等元素的复杂表格,并自定义表格的布局、边框样式和单元格内容。这项功能广泛应用于报告生成、数据展示、文档排版等场景。
API 概览
福昕 PDF SDK 提供了以下静态方法,用于将表格添加到 PDF 文档或特定页面:
static boolean AddTableToPage(PDFPage, TableData, TableCellDataArray)
将一个新的表格添加到指定的 PDF 页面。
static boolean insertTablePagesToDocument (doc, dest_page_index, page_width, page_height, TableData, TableCellDataArray, boolean allow_to_cross_page, TableGeneratorCallback)
将一个可以跨越一页或多页的新表格插入到文档中。
系统要求
平台: Windows, Mac, Linux
开发语言: C, C++, Java, C#, Python, Objective-C, Node.js
授权许可: 需要包含 TableMaker
模块的授权码
SDK 版本: 福昕 PDF SDK 8.4 或更高版本
向 PDF 文档添加表格
在 \examples\simple_demo\electronictable
文件夹下,福昕 PDF SDK 提供了一个电子表格示例,用来展示如何使用福昕 PDF SDK 向 PDF 文档添加表格。
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("@foxitsoftware/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);
}
}
...