JavaScript
PDF-документы могут содержать встроенный JavaScript, который выполняется в просмотрщике. TCPDF-Next предоставляет методы для добавления скриптов уровня документа через Content\JavaScriptManager, доступный через fluent API класса Document.
Все методы возвращают static, поэтому каждый вызов может быть объединён в цепочку.
Краткий справочник
| Метод | Назначение |
|---|---|
includeJS() | Добавить JavaScript уровня документа (выполняется при открытии PDF) |
addJavascriptObject() | Добавить JavaScript как именованный PDF-объект |
Базовый пример
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Interactive Form with JavaScript', newLine: true)
// JavaScript уровня документа
->includeJS('
function validateEmail(field) {
var email = field.value;
var re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!re.test(email)) {
app.alert("Please enter a valid email address.");
return false;
}
return true;
}
function calculateTotal() {
var qty = this.getField("qty").value;
var price = this.getField("price").value;
this.getField("total").value = (qty * price).toFixed(2);
}
')
// Поля формы, использующие JavaScript
->textField('email', 45, null, 80, 8, [
'onBlur' => 'validateEmail(event.target)',
])
->textField('qty', 45, null, 30, 8)
->textField('price', 80, null, 30, 8)
->textField('total', 115, null, 40, 8, [
'readonly' => true,
]);WARNING
Поддержка JavaScript варьируется в зависимости от PDF-просмотрщика. Adobe Acrobat полностью поддерживает Acrobat JavaScript API. Foxit Reader поддерживает большинство функций. Браузерные просмотрщики и приложения предварительного просмотра обычно не выполняют PDF JavaScript.
includeJS()
$pdf->includeJS(string $script): staticДобавляет JavaScript уровня документа, который выполняется при открытии PDF. Используйте для определений функций, глобальных переменных и логики инициализации.
| Параметр | Тип | Описание |
|---|---|---|
$script | string | Сырой JavaScript-код |
Множественные вызовы добавляют дополнительные скрипты. Они выполняются в порядке добавления.
addJavascriptObject()
$pdf->addJavascriptObject(string $script): staticДобавляет JavaScript как именованный PDF-объект. Полезно, когда скрипты должны быть связаны с другими PDF-объектами (действия, аннотации), а не выполняться при открытии документа.
JavaScript-действия в полях форм
Поля форм поддерживают триггеры JavaScript-действий через массив параметров. Эти действия срабатывают в ответ на взаимодействие пользователя с полем.
| Действие | Триггер |
|---|---|
onFocus | Поле получает фокус |
onBlur | Поле теряет фокус |
onChange | Значение поля изменяется |
validate | Перед фиксацией значения |
calculate | Когда зависимые поля изменяются |
format | После фиксации значения (форматирование отображения) |
keystroke | При каждом нажатии клавиши |
$pdf->textField('price', 45, null, 40, 8, [
'format' => 'AFNumber_Format(2, 0, 0, 0, "$", true);',
'keystroke' => 'AFNumber_Keystroke(2, 0, 0, 0, "$", true);',
'validate' => 'if (event.value < 0) { app.alert("Price cannot be negative."); event.rc = false; }',
]);Триггеры печати и действия при открытии
Выполнение логики при открытии или печати документа:
$pdf->includeJS('
app.alert("Welcome! Please fill in all required fields.");
')
->includeJS('
var pp = this.addScript("willPrint", "app.alert(\'This document is confidential.\');");
');Советы
- Делайте скрипты краткими. Большие блоки увеличивают размер файла и замедляют открытие документа.
- API Acrobat JavaScript документирован в JavaScript for Acrobat API Reference от Adobe.
- Тестируйте интерактивные PDF в Adobe Acrobat для обеспечения полной совместимости перед распространением.
- Стандарты PDF/A запрещают JavaScript. Не включайте скрипты, если вы ориентируетесь на соответствие PDF/A.
- Для вычислений по возможности используйте встроенные функции Acrobat (
AFNumber_Format,AFSimple_Calculateи т.д.).