Skip to content

表单设计 (Form Design)

可填写的 PDF 表单 (AcroForm) 特别适用于各种应用程序表单设计,比如税收和其他政府部门表单。表单设计提供了 APIs 用来向 PDF 文件中添加表单域或者从 PDF 文档中移除表单域。从零开始设计一个表单允许开发人员创建他们需要的内容和布局的表单。

向 PDF 添加一个文本表单域

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_pdfpage.h"
#include "include/pdf/interform/fs_pdfform.h"

using namespace foxit;
using namespace pdf;
using namespace interform;
... 
// Assuming PDFDoc doc has been loaded.
// Assuming PDFPage page has been loaded and parsed.

// Add text field
Control control = form.AddControl(page, L"Text Field0", Field::e_TypeTextField, RectF(50, 600, 90, 640));
control.GetField().SetValue(L"3");
// Update text field's appearance.
control.GetWidget().ResetAppearanceStream();

Control control1 = form.AddControl(page, L"Text Field1", Field::e_TypeTextField, RectF(100, 600, 140, 640));
control1.GetField().SetValue(L"123");
// Update text field's appearance.
control1.GetWidget().ResetAppearanceStream();
...
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_pdfform_c.h"
... 
// Assuming FS_PDFDOC_HANDLE doc has been loaded.
// Assuming FS_PDFPAGE_HANDLE page has been loaded and parsed.

// Add text field
FS_CONTROL_HANDLE control;
FSRectF rect;
rect.left = 50;
rect.bottom = 600;
rect.right = 90;
rect.top = 640;
FSDK_Form_AddControl(form, page, L"Text Field0", e_FSTypeTextField, rect, &control);
FS_FIELD_HANDLE field;
FSDK_Control_GetField(control, &field);
FSDK_Field_SetValue(field, L"3");
// Update text field's appearance.
FS_WIDGETANNOT_HANDLE widget;
FSDK_Control_GetWidget(control, &widget);
FS_BOOL result;
FSDK_Annot_ResetAppearanceStream(widget, &result);

rect.left = 100;
rect.bottom = 600;
rect.right = 140;
rect.top = 640;
FS_CONTROL_HANDLE control1;
FSDK_Form_AddControl(form, page, L"Text Field1", e_FSTypeTextField, rect,  &control1);
FS_FIELD_HANDLE field1;
FSDK_Control_GetField(control, &field1);
FSDK_Field_SetValue(field1, L"123");
// Update text field's appearance.
FS_WIDGETANNOT_HANDLE widget1;
FSDK_Control_GetWidget(control1, &widget1);
FS_BOOL result1;
FSDK_Annot_ResetAppearanceStream(widget1, &result1);
...
java
import com.foxit.sdk.pdf.interform.Form;
import com.foxit.sdk.pdf.interform.Control;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.common.fxcrt.RectF;
...

// Assuming PDFDoc doc has been loaded.
...

Form form = new Form(doc);
Control control = form.addControl(page, "Text Field0", Field.e_TypeTextField, new RectF(50, 600, 90, 640));
control.getField().setValue("3");

// Update text field's appearance.
control.getWidget().resetAppearanceStream();
...
py
import sys
import site

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

if _PYTHON2_:
    #replace with the python2 lib path
    site.addsitedir('../../../')
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

... 
# Assuming PDFDoc doc has been loaded.
# Assuming PDFPage page has been loaded and parsed.

# Add text field
control = form.AddControl(page, "Text Field0", Field.e_TypeTextField, RectF(50, 600, 90, 640))
control.GetField().SetValue("3")
# Update text field's appearance.
control.GetWidget().ResetAppearanceStream()

control1 = form.AddControl(page, "Text Field1", Field.e_TypeTextField, RectF(100, 600, 140, 640))
control1.GetField().SetValue("123")
# Update text field's appearance.
control1.GetWidget().ResetAppearanceStream()
...
objc
#include "FSPDFObjC.h"
...
// Add test field
FSControl *control = [form addControl:page field_name:@"Text Field0" field_type:FSFieldTypeTextField rect:[[FSRectF alloc] initWithLeft1:50.0 bottom1:600 right1:90 top1:640]];
[control getField].value = @"3";

// Update text field's appearance.
[[control getWidget] resetAppearanceStream];
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

... 
// Assuming PDFDoc doc has been loaded.
// Add text field
control = form.AddControl(page, "Text Field0", FSDK.Field.e_TypeTextField, new FSDK.RectF(50, 600, 90, 640))
control.GetField().SetValue("3")
// Update text field's appearance.
control.GetWidget().ResetAppearanceStream()

control1 = form.AddControl(page, "Text Field1", FSDK.Field.e_TypeTextField, new FSDK.RectF(100, 600, 140, 640))
control1.GetField().SetValue("123")
// Update text field's appearance.
control1.GetWidget().ResetAppearanceStream()
...
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.pdf.interform;
using foxit.pdf.annots;
using foxit.pdf.actions;
...

// Assuming PDFDoc doc has been loaded.

Control control = form.AddControl(page, "Text Field0", Field.Type.e_TypeTextField, new RectF(50f, 600f, 90f, 640f))
...

从 PDF 中移除一个文本表单域

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_pdfpage.h"
#include "include/pdf/interform/fs_pdfform.h"

using namespace foxit;
using namespace pdf;
using namespace interform;
... 
// Assuming PDFDoc doc has been loaded.

Form form(doc);
const wchar_t* filter = L"text1";
int countFields = form.GetFieldCount(NULL);
for (int i = 0; i < countFields; i++)
{
     Field field = form.GetField(i, filter);
     if (field.GetType() == Field::e_TypeTextField) {
	form.RemoveField(field);
     }
}
...
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_pdfform_c.h"
... 
// Assuming FS_PDFDOC_HANDLE doc has been loaded.

FS_FORM_HANDLE form;
FSDK_Form_Create(doc, form);
const wchar_t* filter = L"text1";
int countFields;
FSDK_Form_GetFieldCount(form, NULL, &countFields);
for (int i = 0; i < countFields; i++)
{
     FS_FIELD_HANDLE field;
     FSDK_Form_GetField(form, i, filter, &field);
     FSFieldType type;
     FSDK_Field_GetType(field, &type);
     if (type == e_FSTypeTextField) {
	FSDK_Form_RemoveField(form, field);
     }
}
...
java
import com.foxit.sdk.pdf.interform.Form;
import com.foxit.sdk.pdf.interform.Control;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.common.fxcrt.RectF;
...

// Assuming PDFDoc doc has been loaded.
...

Form form = new Form(doc);
Control control = form.addControl(page, "Text Field0", Field.e_TypeTextField, new RectF(50, 600, 90, 640));
control.getField().setValue("3");

// Update text field's appearance.
control.getWidget().resetAppearanceStream();
...
py
import sys
import site

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

if _PYTHON2_:
    #replace with the python2 lib path
    site.addsitedir('../../../')
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *
...
# Assuming PDFDoc doc has been loaded.

form = Form(doc)
filter = "text1"
countFields = form.GetFieldCount("")
for i in range(0, countFields):
    field = form.GetField(i, filter)
    if field.GetType() == Field.e_TypeTextField:
          form.RemoveField(field)
...
objc
#include "FSPDFObjC.h"
...

// Assuming FSPDFDoc doc has been loaded.
...

FSForm *form = [[FSForm alloc] initWithDocument:doc];
int count = [form getFieldCount:@""];
for (int i = 0; i < count; i++) {
    FSField* field = [form getField:i filter:@""];
    FSFieldType field_type = [field getType];
    if (FSFieldTypeTextField == field_type)
        [field removeField:field];
}
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");
...
// Assuming PDFDoc doc has been loaded.
let form = new FSDK.Form(doc)
let filter = "text1"
countFields = form.GetFieldCount("")
for(var i = 0; i < countFields; i++) {
    let field = form.GetField(i, filter)
    if(field.GetType() == FSDK.Field.e_TypeTextField)
          form.RemoveField(field)
}
...
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.pdf.interform;
using foxit.pdf.annots;
using foxit.pdf.actions;
...

// Assuming PDFDoc doc has been loaded.

Field field = form.GetField(0, "Text Field0");
form.RemoveField(field);
...