Cách làm việc với các trường AcroForm trong TypeScript

Cách làm việc với các trường AcroForm trong TypeScript

Hướng dẫn này cho thấy cách thêm và làm phẳng các trường AcroForm bằng Aspose.PDF FOSS cho TypeScript. Document.Form cung cấp một phương thức Add* cho mỗi loại trường — văn bản, hộp kiểm, nhóm radio, hộp combo, hộp danh sách và nút đẩy — mỗi phương thức trả về một handle trường có kiểu. Yêu cầu Node.js 22 hoặc cao hơn.

Hướng dẫn từng bước

Bước 1: Cài đặt gói

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

Xác minh việc cài đặt bằng cách nhập lớp Document vào một tệp TypeScript mới — dòng này sẽ được giải quyết mà không có lỗi khi gói đã được cài đặt:

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

Bước 2: Nhập các lớp cần thiết

Nhập Document để mở tệp và tới doc.Form, điểm vào cho mọi phương thức trường được sử dụng bên dưới:

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

Bước 3: Thêm Trường Văn bản và Hộp kiểm

Form.AddTextField(init) và Form.AddCheckbox(init) đều nhận một số page, một rect, một name duy nhất, và các tùy chọn kiểu dáng:

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],
});

Bước 4: Thêm Nhóm Radio, Hộp Combo và Hộp Danh sách

Form.AddRadioGroup(init) nhận một name duy nhất được chia sẻ bởi mọi tùy chọn trong mảng options của nó, mỗi tùy chọn có giá trị rect và export riêng. Form.AddComboBox(init) và Form.AddListBox(init) nhận một mảng options của các cặp { export, display }; các hộp danh sách còn hỗ trợ 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' },
  ],
});

Bước 5: Thêm Nút Đẩy

Form.AddPushButton(init) nhận một caption và một action mô tả hành vi của nút khi được nhấn — ví dụ, gửi dữ liệu của biểu mẫu tới một URL:

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

Bước 6: Làm phẳng Các Trường Biểu mẫu

Mỗi trình xử lý trường được trả về bởi một lời gọi Add* có một phương thức Flatten() mà nhúng giá trị hiện tại của nó vào luồng nội dung của trang và loại bỏ nó khỏi AcroForm tương tác:

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');

Các vấn đề thường gặp và cách khắc phục

Một trường không hiển thị trên trang dự định. page trong trường init đối tượng là số trang riêng của trang đó, không phải chỉ mục mảng — hãy xác nhận nó với page.Number trên mục tiêu Page.

Các tùy chọn nút radio không loại trừ lẫn nhau. Mỗi tùy chọn trong Form.AddRadioGroup()của options mảng phải chia sẻ duy nhất của nhóm name — việc trộn các tên trường tạo ra các hộp kiểm độc lập thay vì một nhóm radio.

Giá trị của trường đã được làm phẳng không xuất hiện trong tệp đã lưu. Lưu tài liệu (doc.WriteTo() / doc.Save()) sau khi gọi Flatten() — thay đổi chỉ tồn tại trong bộ nhớ cho đến khi tệp được ghi lại.

Một hộp combo hiển thị giá trị xuất khẩu thay vì văn bản hiển thị. Giao diện vẽ display; giá trị lưu trữ của trường (/V) là export — xác nhận cả hai đều được đặt cho mọi tùy chọn, không chỉ một.

Câu hỏi thường gặp

Tôi có thể đọc giá trị hiện tại của một trường sau khi biểu mẫu đã được điền không?

Có — đọc thuộc tính Value của đối tượng trường, hoặc lặp lại doc.Form.Fields để kiểm tra mọi trường trên tài liệu.

Sự khác nhau giữa Flatten() trên một trường và trên một chú thích là gì?

Cả hai đều nhúng nội dung tương tác vào nội dung trang tĩnh và loại bỏ nó khỏi bộ sưu tập tương ứng — của một trường Flatten() loại bỏ nó khỏi /AcroForm, trong khi của một chú thích Flatten() (được đề cập trong Chú thích hướng dẫn) loại bỏ nó khỏi trang /Annots.

Một hộp danh sách có cho phép chọn nhiều mục không?

Có — đặt multiSelect: true trên đối tượng init của Form.AddListBox() và truyền một mảng vào value.

Nút đẩy có cần một hành động để hữu ích không?

Một action (ví dụ { type: 'submit', url, format }) là thứ khiến nút thực hiện hành động khi được nhấn; nếu không có nó, nút vẫn hiển thị nhưng không có hành vi nào được gắn kết.

Xem thêm

 Tiếng Việt