表单字段创建
向 PDF 文档添加交互式表单字段。PDF Oxide 支持所有标准 AcroForm 控件类型:文本字段、复选框、单选按钮组、组合框(下拉框)、列表框和按钮。
绑定覆盖情况(v0.3.38)。
FluentPageBuilder在 Rust、Python、Node/TypeScript、C#、Go 和 WASM 中公开了text_field、checkbox、combo_box、radio_group和push_button(参见 DocumentBuilder → AcroForm 控件)。本页介绍的仅限 Rust 的底层PdfWriter::text_field/checkbox等方法暴露了更多按控件配置的选项(多行文本、密码字段、列表框、边框颜色);当你需要对 AcroForm 进行精细控制时可以使用它们。填写和扁平化现有表单在每种绑定中均可使用——参见表单字段编辑和填写 PDF 表单。
快速示例
Rust
use pdf_oxide::writer::{PdfWriter, TextFieldWidget, CheckboxWidget};
use pdf_oxide::geometry::Rect;
let mut writer = PdfWriter::new();
{
let mut page = writer.add_letter_page();
page.add_text("Name:", 72.0, 720.0, "Helvetica", 12.0);
page.text_field("name", Rect::new(130.0, 716.0, 200.0, 20.0));
page.add_text("I agree to terms:", 72.0, 690.0, "Helvetica", 12.0);
page.checkbox("agree", Rect::new(200.0, 686.0, 15.0, 15.0));
page.finish();
}
writer.save("form.pdf")?;
Python
from pdf_oxide import DocumentBuilder
(DocumentBuilder()
.letter_page()
.at(72, 720).text("Name:")
.text_field("name", 130, 716, 200, 20)
.at(72, 690).text("I agree to terms:")
.checkbox("agree", 200, 686, 15, 15, False)
.done()
.save("form.pdf"))
Node / TypeScript
import { DocumentBuilder } from "pdf-oxide";
await new DocumentBuilder()
.letterPage()
.at(72, 720).text("Name:")
.textField("name", 130, 716, 200, 20)
.at(72, 690).text("I agree to terms:")
.checkbox("agree", 200, 686, 15, 15, false)
.done()
.save("form.pdf");
C#
DocumentBuilder.Create()
.LetterPage()
.At(72, 720).Text("Name:")
.TextField("name", 130, 716, 200, 20)
.At(72, 690).Text("I agree to terms:")
.Checkbox("agree", 200, 686, 15, 15, false)
.Done()
.Save("form.pdf");
Go
builder := pdfoxide.NewDocumentBuilder()
builder.LetterPage().
At(72, 720).Text("Name:").
TextField("name", 130, 716, 200, 20, "").
At(72, 690).Text("I agree to terms:").
Checkbox("agree", 200, 686, 15, 15, false).
Done()
_ = builder.Save("form.pdf")
C++
#include <pdf_oxide/pdf_oxide.hpp>
auto builder = pdf_oxide::DocumentBuilder::create();
auto page = builder.letter_page();
page.at(72, 720).text("Name:")
.text_field("name", 130, 716, 200, 20)
.at(72, 690).text("I agree to terms:")
.checkbox("agree", 200, 686, 15, 15, false);
page.done();
builder.save("form.pdf");
Swift
import PdfOxide
let builder = try DocumentBuilder.create()
let page = try builder.letterPage()
try page.at(72, 720); try page.text("Name:")
try page.textField("name", 130, 716, 200, 20)
try page.at(72, 690); try page.text("I agree to terms:")
try page.checkbox("agree", 200, 686, 15, 15, checked: false)
try page.done()
try builder.save("form.pdf")
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
final builder = DocumentBuilder.create();
builder.letterPage()
.at(72, 720).text("Name:")
.textField("name", 130, 716, 200, 20)
.at(72, 690).text("I agree to terms:")
.checkbox("agree", 200, 686, 15, 15, false)
.done();
builder.save("form.pdf");
R
library(pdfoxide)
builder <- pdf_builder_create()
page <- pdf_builder_letter_page(builder)
pdf_page_at(page, 72, 720); pdf_page_builder_text(page, "Name:")
pdf_page_text_field(page, "name", 130, 716, 200, 20)
pdf_page_at(page, 72, 690); pdf_page_builder_text(page, "I agree to terms:")
pdf_page_checkbox(page, "agree", 200, 686, 15, 15, checked = FALSE)
pdf_page_done(page)
pdf_builder_save(builder, "form.pdf")
Julia
using PdfOxide
builder = DocumentBuilder()
page = letter_page(builder)
at(page, 72, 720); text(page, "Name:")
text_field(page, "name", 130, 716, 200, 20)
at(page, 72, 690); text(page, "I agree to terms:")
checkbox(page, "agree", 200, 686, 15, 15, false)
done(page)
save(builder, "form.pdf")
Zig
const pdf_oxide = @import("pdf_oxide");
var builder = try pdf_oxide.DocumentBuilder.create();
defer builder.deinit();
var page = try builder.letterPage();
try page.at(72, 720);
try page.text("Name:");
try page.textField("name", 130, 716, 200, 20, null);
try page.at(72, 690);
try page.text("I agree to terms:");
try page.checkbox("agree", 200, 686, 15, 15, false);
try page.done();
try builder.save("form.pdf");
Objective-C
#import "POXPdfOxide.h"
NSError *err = nil;
POXDocumentBuilder *builder = [POXDocumentBuilder createWithError:&err];
POXPageBuilder *page = [builder letterPageWithError:&err];
[page at:72 y:720 error:&err]; [page text:@"Name:" error:&err];
[page textFieldName:@"name" x:130 y:716 w:200 h:20 defaultValue:nil error:&err];
[page at:72 y:690 error:&err]; [page text:@"I agree to terms:" error:&err];
[page checkboxName:@"agree" x:200 y:686 w:15 h:15 checked:NO error:&err];
[page done:&err];
[builder saveToPath:@"form.pdf" error:&err];
Elixir
{:ok, builder} = PdfOxide.builder()
{:ok, page} = PdfOxide.builder_letter_page(builder)
PdfOxide.page_at(page, 72, 720); PdfOxide.page_text(page, "Name:")
PdfOxide.page_text_field(page, "name", 130, 716, 200, 20)
PdfOxide.page_at(page, 72, 690); PdfOxide.page_text(page, "I agree to terms:")
PdfOxide.page_checkbox(page, "agree", 200, 686, 15, 15, false)
PdfOxide.page_done(page)
PdfOxide.builder_save(builder, "form.pdf")
控件类型
TextFieldWidget — 文本输入
单行或多行的文本输入字段。
use pdf_oxide::writer::TextFieldWidget;
use pdf_oxide::geometry::Rect;
// Basic text field
let field = TextFieldWidget::new("username", Rect::new(72.0, 700.0, 200.0, 20.0));
// Fully configured text field
let field = TextFieldWidget::new("email", Rect::new(72.0, 670.0, 250.0, 20.0))
.with_value("user@example.com")
.with_default_value("")
.with_max_length(100)
.required()
.with_tooltip("Enter your email address")
.with_font("Helv", 12.0)
.with_text_color(0.0, 0.0, 0.0)
.with_border_color(0.5, 0.5, 0.5)
.with_background_color(1.0, 1.0, 0.95);
// Password field (characters are masked)
let password = TextFieldWidget::new("password", Rect::new(72.0, 640.0, 200.0, 20.0))
.password();
// Multi-line text area
let notes = TextFieldWidget::new("notes", Rect::new(72.0, 550.0, 300.0, 80.0))
.multiline();
主要方法:
| 方法 | 说明 |
|---|---|
.with_value(s) |
设置当前文本值 |
.with_default_value(s) |
设置重置值 |
.with_max_length(n) |
最大字符数 |
.required() |
标记为必填字段 |
.read_only() |
禁止编辑 |
.password() |
遮蔽输入字符 |
.multiline() |
允许多行 |
.with_tooltip(s) |
悬停提示文本 |
.with_font(name, size) |
设置字体和字号 |
.with_text_color(r, g, b) |
设置文本颜色(0.0–1.0 RGB) |
.with_border_color(r, g, b) |
设置边框颜色 |
.with_background_color(r, g, b) |
设置背景颜色 |
CheckboxWidget — 复选框
具有开/关状态的切换字段。
use pdf_oxide::writer::CheckboxWidget;
use pdf_oxide::geometry::Rect;
// Basic checkbox
let cb = CheckboxWidget::new("agree", Rect::new(72.0, 700.0, 15.0, 15.0));
// Pre-checked checkbox with custom export value
let cb = CheckboxWidget::new("newsletter", Rect::new(72.0, 680.0, 15.0, 15.0))
.checked()
.with_export_value("subscribed")
.with_tooltip("Subscribe to newsletter");
主要方法:
| 方法 | 说明 |
|---|---|
.checked() |
将初始状态设置为已选中 |
.with_export_value(s) |
提交表单时发送的值 |
.with_tooltip(s) |
悬停提示文本 |
.read_only() |
禁止切换 |
RadioButtonGroup — 单选按钮
互斥的选项组。组内所有按钮共享同一字段名;选择其中一个会取消选择其他。
use pdf_oxide::writer::RadioButtonGroup;
use pdf_oxide::geometry::Rect;
let group = RadioButtonGroup::new("color")
.add_button("Red", Rect::new(72.0, 700.0, 15.0, 15.0))
.add_button("Green", Rect::new(72.0, 680.0, 15.0, 15.0))
.add_button("Blue", Rect::new(72.0, 660.0, 15.0, 15.0))
.with_selected("Green"); // Pre-select "Green"
主要方法:
| 方法 | 说明 |
|---|---|
.add_button(value, rect) |
添加一个单选项 |
.with_selected(value) |
预先选中一个选项 |
.no_toggle_off() |
禁止取消选择所有选项 |
ComboBoxWidget — 下拉框
带有可选编辑文本的下拉选择字段。
use pdf_oxide::writer::ComboBoxWidget;
use pdf_oxide::writer::form_fields::ChoiceOption;
use pdf_oxide::geometry::Rect;
let combo = ComboBoxWidget::new("country", Rect::new(72.0, 700.0, 200.0, 20.0))
.add_option("US", "United States")
.add_option("GB", "United Kingdom")
.add_option("DE", "Germany")
.add_option("JP", "Japan")
.with_selected("US");
主要方法:
| 方法 | 说明 |
|---|---|
.add_option(value, label) |
添加一个可选项 |
.with_selected(value) |
预先选中一个选项 |
.editable() |
允许输入自定义值 |
.sorted() |
按字母顺序排序选项 |
ListBoxWidget — 多选列表
支持单选或多选的可滚动列表字段。
use pdf_oxide::writer::ListBoxWidget;
use pdf_oxide::geometry::Rect;
let list = ListBoxWidget::new("languages", Rect::new(72.0, 600.0, 200.0, 80.0))
.add_option("rust", "Rust")
.add_option("python", "Python")
.add_option("go", "Go")
.add_option("typescript", "TypeScript")
.multi_select()
.with_selected("rust");
主要方法:
| 方法 | 说明 |
|---|---|
.add_option(value, label) |
添加一个可选项 |
.with_selected(value) |
预先选中一个选项 |
.multi_select() |
允许选择多个项目 |
.sorted() |
按字母顺序排序选项 |
PushButtonWidget — 按钮
触发操作(提交、重置或 JavaScript)的可点击按钮。
use pdf_oxide::writer::PushButtonWidget;
use pdf_oxide::geometry::Rect;
let submit = PushButtonWidget::new("submit", Rect::new(72.0, 500.0, 100.0, 30.0))
.with_label("Submit")
.submit_form("https://example.com/submit");
let reset = PushButtonWidget::new("reset", Rect::new(180.0, 500.0, 100.0, 30.0))
.with_label("Reset")
.reset_form();
进阶示例
完整的注册表单
use pdf_oxide::writer::{
PdfWriter, PdfWriterConfig,
TextFieldWidget, CheckboxWidget, RadioButtonGroup,
ComboBoxWidget, PushButtonWidget,
};
use pdf_oxide::geometry::Rect;
let config = PdfWriterConfig::default()
.with_title("Registration Form")
.with_author("HR Department");
let mut writer = PdfWriter::with_config(config);
{
let mut page = writer.add_letter_page();
// Title
page.add_text("Employee Registration Form", 72.0, 740.0, "Helvetica-Bold", 18.0);
// Personal Information
page.add_text("First Name:", 72.0, 700.0, "Helvetica", 12.0);
page.add_text_field(
TextFieldWidget::new("first_name", Rect::new(170.0, 696.0, 200.0, 20.0))
.required()
);
page.add_text("Last Name:", 72.0, 670.0, "Helvetica", 12.0);
page.add_text_field(
TextFieldWidget::new("last_name", Rect::new(170.0, 666.0, 200.0, 20.0))
.required()
);
page.add_text("Email:", 72.0, 640.0, "Helvetica", 12.0);
page.add_text_field(
TextFieldWidget::new("email", Rect::new(170.0, 636.0, 250.0, 20.0))
.required()
.with_tooltip("Work email address")
);
// Department dropdown
page.add_text("Department:", 72.0, 610.0, "Helvetica", 12.0);
page.add_combo_box(
ComboBoxWidget::new("department", Rect::new(170.0, 606.0, 200.0, 20.0))
.add_option("eng", "Engineering")
.add_option("sales", "Sales")
.add_option("hr", "Human Resources")
.add_option("ops", "Operations")
);
// Employment type radio buttons
page.add_text("Employment Type:", 72.0, 570.0, "Helvetica", 12.0);
page.add_text("Full-time", 95.0, 550.0, "Helvetica", 10.0);
page.add_text("Part-time", 95.0, 530.0, "Helvetica", 10.0);
page.add_text("Contract", 95.0, 510.0, "Helvetica", 10.0);
page.add_radio_group(
RadioButtonGroup::new("employment_type")
.add_button("fulltime", Rect::new(72.0, 548.0, 15.0, 15.0))
.add_button("parttime", Rect::new(72.0, 528.0, 15.0, 15.0))
.add_button("contract", Rect::new(72.0, 508.0, 15.0, 15.0))
.with_selected("fulltime")
);
// Agreement checkbox
page.add_text("I agree to the terms and conditions", 95.0, 470.0, "Helvetica", 10.0);
page.add_checkbox(
CheckboxWidget::new("agree_terms", Rect::new(72.0, 468.0, 15.0, 15.0))
.with_export_value("agreed")
);
// Submit button
page.add_push_button(
PushButtonWidget::new("submit", Rect::new(72.0, 420.0, 120.0, 30.0))
.with_label("Submit Form")
);
page.finish();
}
writer.save("registration_form.pdf")?;
向现有 PDF 添加表单字段
使用 DocumentEditor 向已有的 PDF 文档添加字段:
use pdf_oxide::editor::DocumentEditor;
use pdf_oxide::writer::TextFieldWidget;
use pdf_oxide::geometry::Rect;
let mut editor = DocumentEditor::open("template.pdf")?;
let field = TextFieldWidget::new("signature", Rect::new(72.0, 100.0, 250.0, 25.0))
.with_tooltip("Sign here");
editor.add_form_field(0, field)?; // Add to page 0
editor.save("signed_template.pdf")?;
相关页面
- DocumentBuilder 底层 API — 使用流式 API 构建页面
- 注释创建 — 非交互式注释类型
- PdfBuilder 流式 API — 高层 PDF 创建