Skip to content

Редактирование полей форм

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")?;

Связанные страницы