Как работать с полями AcroForm в TypeScript

Как работать с полями AcroForm в TypeScript

Это руководство показывает, как добавить и уплотнить поля AcroForm с помощью Aspose.PDF FOSS для TypeScript. Document.Form предоставляет один метод Add* для каждого типа поля — текст, флажок, радиогруппа, комбобокс, список и кнопка — каждый из которых возвращает типизированный дескриптор поля. Требуется Node.js 22 или новее.

Пошаговое руководство

Шаг 1: Установите пакет

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run build

Проверьте установку, импортировав класс Document в новый файл TypeScript — эта строка должна успешно разрешаться без ошибок после установки пакета:

import { Document } from '@asposefoss/pdf';

Шаг 2: Импортировать необходимые классы

Импортируйте Document, чтобы открыть файл и перейти к doc.Form, точке входа для каждого метода полей, используемого ниже:

import { Document } from '@asposefoss/pdf';

Шаг 3: Добавить текстовое поле и флажок

Form.AddTextField(init) и Form.AddCheckbox(init) оба принимают page число, rect, уникальный name и параметры стилей:

const doc = Document.OpenFile('form-template.pdf');
const form = doc.Form;
const pageNum = doc.Pages[0].Number;

form.AddTextField({
  page: pageNum, rect: [200, 670, 450, 690], name: 'FullName', value: 'Alice Sample',
  borderColor: [0.1, 0.15, 0.4], font: 'Helvetica', fontSize: 12,
});

form.AddCheckbox({
  page: pageNum, rect: [200, 630, 218, 648], name: 'Subscribe',
  checked: true, borderColor: [0.1, 0.15, 0.4],
});

Шаг 4: Добавить группу переключателей, комбобокс и список

Form.AddRadioGroup(init) принимает единственный name, общий для каждой опции в его массиве options, каждая со своим rect и значением export. Form.AddComboBox(init) и Form.AddListBox(init) принимают массив options из пар { export, display }; списки дополнительно поддерживают multiSelect:

form.AddRadioGroup({
  name: 'Plan', selected: 'Pro',
  options: [
    { page: pageNum, rect: [200, 590, 218, 608], export: 'Basic' },
    { page: pageNum, rect: [290, 590, 308, 608], export: 'Pro' },
  ],
});

form.AddComboBox({
  page: pageNum, rect: [200, 550, 350, 570], name: 'Country', value: 'US',
  options: [
    { export: 'US', display: 'United States' },
    { export: 'UK', display: 'United Kingdom' },
  ],
});

form.AddListBox({
  page: pageNum, rect: [200, 410, 350, 510], name: 'Interests',
  multiSelect: true, value: ['pdf'],
  options: [
    { export: 'pdf', display: 'PDF Engineering' },
    { export: 'crypto', display: 'Cryptography' },
  ],
});

Шаг 5: Добавить кнопку

Form.AddPushButton(init) принимает caption и action, описывающие, что делает кнопка при нажатии — например, отправку данных формы по URL:

form.AddPushButton({
  page: pageNum, rect: [200, 320, 320, 388], name: 'Submit',
  caption: 'Submit',
  action: { type: 'submit', url: 'https://example.com/submit', format: 'fdf' },
});

Шаг 6: Свести поля формы

Каждый дескриптор поля, возвращаемый вызовом Add*, имеет метод Flatten(), который встраивает его текущее значение в поток содержимого страницы и удаляет его из интерактивного AcroForm:

const tb = form.AddTextField({
  page: pageNum, rect: [210, 660, 460, 680], name: 'FlattenName', value: 'Alice Sample',
});
tb.Flatten(); // -> number; bakes the value, unwires the field from /AcroForm

doc.WriteTo('flattened.pdf');

Распространённые проблемы и решения

Поле не отображается на предназначенной странице. page в поле init объект — это собственный номер страницы, а не индекс массива — подтвердите его с page.Number на целевом Page.

Опции radio button не являются взаимно исключающимися. Каждая опция в Form.AddRadioGroup()’s options массив должен использовать единый элемент группы name — смешивание имён полей создаёт независимые чекбоксы вместо группы переключателей.

Значение уплощённого поля не появляется в сохранённом файле. Сохраните документ (doc.WriteTo() / doc.Save()) после вызова Flatten() — изменение существует только в памяти, пока файл не будет записан обратно.

Комбо-бокс показывает экспортируемое значение вместо отображаемого текста. Отрисовка внешнего вида display; сохранённое значение поля (/V) является export — подтвердите, что оба установлены для каждой опции, а не только для одной.

Часто задаваемые вопросы

Могу ли я прочитать текущее значение поля после заполнения формы?

Да — прочитайте свойство Value дескриптора поля или переберите doc.Form.Fields, чтобы осмотреть каждое поле в документе.

В чем разница между Flatten() у поля и у аннотации?

Оба встраивают интерактивный контент в статическое содержимое страницы и удаляют его из соответствующей коллекции — у поля Flatten() удаляет его из /AcroForm, в то время как у аннотации Flatten() (рассмотрено в Аннотации руководство) удаляет его из страницы /Annots.

Может ли список позволять множественный выбор?

Да — установите multiSelect: true у объекта init Form.AddListBox() и передайте массив в value.

Нужна ли кнопке отправки действие, чтобы она была полезной?

action (например { type: 'submit', url, format }) — это то, что заставляет кнопку выполнять действие при нажатии; без него она отображается, но не имеет привязанного поведения.

См. также:

 Русский