Редактирование полей форм
PDF Oxide предоставляет комплексную поддержку полей форм: чтение существующих значений, программное заполнение полей, добавление новых полей, настройка свойств, сведение форм в статическое содержимое и экспорт данных форм в форматах FDF/XFDF. Формы XFA могут быть проанализированы и конвертированы в AcroForm.
Чтение полей форм
Получение всех полей формы
Rust
use pdf_oxide::editor::DocumentEditor;
let mut editor = DocumentEditor::open("form.pdf")?;
let fields = editor.get_form_fields()?;
for field in &fields {
println!("Field: {} = {:?}", field.name(), field.value());
if let Some(ft) = field.field_type() {
println!(" Type: {:?}", ft);
}
if let Some(tooltip) = field.tooltip() {
println!(" Tooltip: {}", tooltip);
}
}
WASM
const doc = new WasmPdfDocument(bytes);
const fields = doc.getFormFields();
for (const f of fields) {
console.log(`${f.name} (${f.field_type}) = ${f.value}`);
}
Python
from pdf_oxide import PdfDocument
doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for field in fields:
print(f"{field.name} ({field.field_type}) = {field.value}")
Получение значения конкретного поля
Rust
let mut editor = DocumentEditor::open("form.pdf")?;
let value = editor.get_form_field_value("first_name")?;
println!("First name: {:?}", value);
WASM
const value = doc.getFormFieldValue("first_name");
console.log(`First name: ${value}`);
Python
value = doc.get_form_field_value("first_name")
print(f"First name: {value}")
Проверка существования поля
let mut editor = DocumentEditor::open("form.pdf")?;
if editor.has_form_field("email")? {
println!("Email field exists");
}
Установка значений полей форм
Установка значения поля
Rust
use pdf_oxide::editor::DocumentEditor;
use pdf_oxide::editor::form_fields::FormFieldValue;
let mut editor = DocumentEditor::open("form.pdf")?;
// Set a text field
editor.set_form_field_value("first_name", FormFieldValue::Text("Jane".to_string()))?;
// Set a checkbox
editor.set_form_field_value("agree_terms", FormFieldValue::Boolean(true))?;
// Set a choice field
editor.set_form_field_value("country", FormFieldValue::Choice("United States".to_string()))?;
editor.save("filled.pdf")?;
WASM
const doc = new WasmPdfDocument(bytes);
doc.setFormFieldValue("first_name", "Jane");
doc.setFormFieldValue("agree_terms", true);
doc.setFormFieldValue("country", "United States");
writeFileSync("filled.pdf", doc.save());
doc.free();
Python
doc = PdfDocument("form.pdf")
doc.set_form_field_value("first_name", "Jane")
doc.set_form_field_value("agree_terms", True)
doc.set_form_field_value("country", "United States")
doc.save("filled.pdf")
FormFieldValue Variants
| Вариант | Описание | Example |
|---|---|---|
Text(String) |
Значение текстового поля | FormFieldValue::Text("Hello".into()) |
Boolean(bool) |
Checkbox/radio state | FormFieldValue::Boolean(true) |
Choice(String) |
Единичный выбор | FormFieldValue::Choice("Option A".into()) |
MultiChoice(Vec<String>) |
Множественный выбор | FormFieldValue::MultiChoice(vec!["A".into(), "B".into()]) |
None |
No value / clear field | FormFieldValue::None |
Добавление полей форм
Добавление нового поля формы
use pdf_oxide::editor::DocumentEditor;
use pdf_oxide::writer::form_fields::TextFieldWidget;
let mut editor = DocumentEditor::open("document.pdf")?;
// Create a text input field on page 0
let widget = TextFieldWidget::new("user_name")
.with_rect(100.0, 700.0, 200.0, 20.0)
.with_default_value("Enter name");
editor.add_form_field(widget, 0)?;
editor.save("with-form.pdf")?;
Добавление иерархических полей
Создание связей родитель-потомок для структурированных форм.
use pdf_oxide::editor::form_fields::ParentFieldConfig;
let mut editor = DocumentEditor::open("document.pdf")?;
// Create a parent field
let parent = ParentFieldConfig::new("address");
editor.add_parent_field(parent)?;
// Add child fields under the parent
let street = TextFieldWidget::new("street")
.with_rect(100.0, 600.0, 300.0, 20.0);
editor.add_child_field(street, 0, "address")?;
let city = TextFieldWidget::new("city")
.with_rect(100.0, 570.0, 150.0, 20.0);
editor.add_child_field(city, 0, "address")?;
editor.save("hierarchical-form.pdf")?;
Удаление поля формы
let mut editor = DocumentEditor::open("form.pdf")?;
editor.remove_form_field("obsolete_field")?;
editor.save("cleaned.pdf")?;
Свойства полей форм
Установка свойств
Настройка свойств отдельных полей по имени.
let mut editor = DocumentEditor::open("form.pdf")?;
// Access control
editor.set_form_field_readonly("signature_date", true)?;
editor.set_form_field_required("email", true)?;
// Tooltip
editor.set_form_field_tooltip("phone", "Enter phone number with area code")?;
// Позиция и размер
editor.set_form_field_rect("name", pdf_oxide::geometry::Rect::new(100.0, 700.0, 200.0, 20.0))?;
// Text constraints
editor.set_form_field_max_length("zip_code", 10)?;
editor.set_form_field_alignment("amount", 2)?; // 0=left, 1=center, 2=right
// Appearance
editor.set_form_field_background_color("highlight_field", [1.0, 1.0, 0.8])?;
editor.set_form_field_border_color("name", [0.0, 0.0, 0.0])?;
editor.set_form_field_border_width("name", 1.0)?;
editor.set_form_field_default_appearance("name", "/Helv 12 Tf 0 g")?;
// Raw flags
editor.set_form_field_flags("options", 0x100000)?;
editor.save("styled-form.pdf")?;
FormFieldWrapper Properties
При работе с объектами FormFieldWrapper, возвращаемыми get_form_fields():
| Метод | Возвращает | Описание |
|---|---|---|
name() |
&str |
Полное имя поля |
partial_name() |
&str |
Частичное имя (без родительского префикса) |
value() |
FormFieldValue |
Текущее значение поля |
set_value(value) |
() |
Установить значение поля |
field_type() |
Option<&FieldType> |
Тип поля |
page_index() |
usize |
Страница, содержащая поле |
bounds() |
Option<Rect> |
Позиция и размер поля |
tooltip() |
Option<&str> |
Текст подсказки |
is_modified() |
bool |
Было ли значение изменено |
is_new() |
bool |
Было ли поле добавлено (не из исходного документа) |
is_readonly() |
bool |
Флаг «только для чтения» |
set_readonly(bool) |
() |
Установить флаг «только для чтения» |
is_required() |
bool |
Флаг «обязательное» |
set_required(bool) |
() |
Установить флаг «обязательное» |
is_no_export() |
bool |
Флаг «без экспорта» |
set_no_export(bool) |
() |
Установить флаг «без экспорта» |
set_tooltip(text) |
() |
Установить текст подсказки |
set_rect(rect) |
() |
Установить позицию и размер |
set_max_length(len) |
() |
Установить максимальную длину текста |
get_max_length() |
Option<u32> |
Получить максимальную длину текста |
set_alignment(align) |
() |
Установить выравнивание текста |
get_alignment() |
Option<u32> |
Получить выравнивание текста |
set_background_color(rgb) |
() |
Установить цвет фона |
get_background_color() |
Option<[f32; 3]> |
Получить цвет фона |
set_border_color(rgb) |
() |
Установить цвет границы |
get_border_color() |
Option<[f32; 3]> |
Получить цвет границы |
set_border_width(width) |
() |
Установить ширину границы |
get_border_width() |
Option<f32> |
Получить ширину границы |
set_default_appearance(da) |
() |
Установить строку внешнего вида по умолчанию |
get_default_appearance() |
Option<&str> |
Получить строку внешнего вида по умолчанию |
set_default_value(value) |
() |
Установить значение по умолчанию |
get_default_value() |
Option<&FormFieldValue> |
Получить значение по умолчанию |
has_parent() |
bool |
Проверить наличие родительского поля |
parent_name() |
Option<&str> |
Имя родительского поля |
Сведение форм
Сведение преобразует интерактивные поля формы в статическое содержимое страницы. Значения полей становятся частью рисунка страницы и больше не могут быть отредактированы.
Сведение одной страницы
Rust
let mut editor = DocumentEditor::open("form.pdf")?;
editor.flatten_forms_on_page(0)?;
editor.save("flat-page0.pdf")?;
WASM
const doc = new WasmPdfDocument(bytes);
doc.flattenFormsOnPage(0);
writeFileSync("flat-page0.pdf", doc.save());
doc.free();
Сведение всех форм
Rust
let mut editor = DocumentEditor::open("form.pdf")?;
editor.flatten_forms()?;
editor.save("flat.pdf")?;
WASM
const doc = new WasmPdfDocument(bytes);
doc.flattenForms();
writeFileSync("flat.pdf", doc.save());
doc.free();
Проверка статуса сведения
editor.flatten_forms_on_page(0)?;
assert!(editor.is_page_marked_for_form_flatten(0));
assert!(editor.will_remove_acroform());
Экспорт данных форм
Экспорт значений полей формы в формат FDF или XFDF для внешней обработки.
Экспорт в FDF
Rust
let mut editor = DocumentEditor::open("filled-form.pdf")?;
editor.export_form_data_fdf("form-data.fdf")?;
WASM
const doc = new WasmPdfDocument(bytes);
const fdfData = doc.exportFormData("fdf");
writeFileSync("form-data.fdf", fdfData);
doc.free();
Python
doc = PdfDocument("filled-form.pdf")
doc.export_form_data("form-data.fdf", format="fdf")
Экспорт в XFDF
Rust
let mut editor = DocumentEditor::open("filled-form.pdf")?;
editor.export_form_data_xfdf("form-data.xfdf")?;
WASM
const doc = new WasmPdfDocument(bytes);
const xfdfData = doc.exportFormData("xfdf");
writeFileSync("form-data.xfdf", xfdfData);
doc.free();
Поддержка форм XFA
PDF Oxide может обнаруживать, анализировать и конвертировать формы XFA в стандартный AcroForm.
Проверка на XFA
Rust
let mut editor = DocumentEditor::open("xfa-form.pdf")?;
if editor.has_xfa()? {
println!("Document contains XFA form data");
}
WASM
const doc = new WasmPdfDocument(bytes);
if (doc.hasXfa()) {
console.log("Document contains XFA form data");
}
Python
doc = PdfDocument("xfa-form.pdf")
if doc.has_xfa():
print("Document contains XFA form data")
Анализ структуры XFA
let mut editor = DocumentEditor::open("xfa-form.pdf")?;
let analysis = editor.analyze_xfa()?;
println!("XFA analysis: {:?}", analysis);
Конвертация XFA в AcroForm
Конвертация форм XFA в стандартные поля AcroForm для более широкой совместимости.
let mut editor = DocumentEditor::open("xfa-form.pdf")?;
editor.convert_xfa_to_acroform(&Default::default())?;
editor.save("acroform.pdf")?;
Полный справочник API
Операции с полями
| Метод | Возвращает | Описание |
|---|---|---|
get_form_fields() |
Result<Vec<FormFieldWrapper>> |
Список всех полей формы |
get_form_field_value(name) |
Result<FormFieldValue> |
Получить значение поля |
has_form_field(name) |
Result<bool> |
Проверить существование поля |
set_form_field_value(name, value) |
Result<()> |
Установить значение поля |
add_form_field(widget, page) |
Result<()> |
Добавить новое поле |
add_parent_field(config) |
Result<()> |
Добавить родительское поле |
add_child_field(widget, page, parent) |
Result<()> |
Добавить дочернее поле |
remove_form_field(name) |
Result<()> |
Удалить поле |
Свойства полей (по имени)
| Метод | Возвращает | Описание |
|---|---|---|
set_form_field_readonly(name, bool) |
Result<()> |
Установить «только для чтения» |
set_form_field_required(name, bool) |
Result<()> |
Установить «обязательное» |
set_form_field_tooltip(name, text) |
Result<()> |
Установить подсказку |
set_form_field_rect(name, rect) |
Result<()> |
Установить позицию/размер |
set_form_field_max_length(name, len) |
Result<()> |
Установить макс. длину текста |
set_form_field_alignment(name, align) |
Result<()> |
Установить выравнивание текста |
set_form_field_background_color(name, rgb) |
Result<()> |
Установить цвет фона |
set_form_field_border_color(name, rgb) |
Result<()> |
Установить цвет границы |
set_form_field_border_width(name, width) |
Result<()> |
Установить ширину границы |
set_form_field_default_appearance(name, da) |
Result<()> |
Установить внешний вид по умолчанию |
set_form_field_flags(name, flags) |
Result<()> |
Установить необработанные флаги поля |
Сведение
| Метод | Возвращает | Описание |
|---|---|---|
flatten_forms_on_page(page) |
Result<()> |
Сведение форм на одной странице |
flatten_forms() |
Result<()> |
Сведение всех форм |
is_page_marked_for_form_flatten(page) |
bool |
Проверить статус сведения |
will_remove_acroform() |
bool |
Проверить, будет ли AcroForm удалена |
Экспорт
| Метод | Возвращает | Описание |
|---|---|---|
export_form_data_fdf(path) |
Result<()> |
Экспорт в файл FDF |
export_form_data_xfdf(path) |
Result<()> |
Экспорт в файл XFDF |
XFA
| Метод | Возвращает | Описание |
|---|---|---|
has_xfa() |
Result<bool> |
Проверка на данные XFA-формы |
analyze_xfa() |
Result<XfaAnalysis> |
Анализ структуры XFA |
convert_xfa_to_acroform(options) |
Result<()> |
Конвертация XFA в AcroForm |
Продвинутый пример: пакетное заполнение и сведение
use pdf_oxide::editor::DocumentEditor;
use pdf_oxide::editor::form_fields::FormFieldValue;
let mut editor = DocumentEditor::open("template.pdf")?;
// Fill form fields
editor.set_form_field_value("name", FormFieldValue::Text("John Doe".to_string()))?;
editor.set_form_field_value("date", FormFieldValue::Text("2025-12-01".to_string()))?;
editor.set_form_field_value("approved", FormFieldValue::Boolean(true))?;
// Make the completed form non-editable
editor.flatten_forms()?;
// Export data before saving
editor.export_form_data_xfdf("submission.xfdf")?;
editor.save("completed.pdf")?;
Связанные страницы
- Обзор редактирования — открытие, метаданные и сохранение
- Редактирование текста — прямое изменение текстового содержимого
- Редактирование аннотаций — добавление и управление аннотациями
- Шифрование и безопасность — ограничение редактирования форм с помощью разрешений