Skip to content

JavaScript

PDF-документы могут содержать встроенный JavaScript, который выполняется в просмотрщике. TCPDF-Next предоставляет методы для добавления скриптов уровня документа через Content\JavaScriptManager, доступный через fluent API класса Document.

Все методы возвращают static, поэтому каждый вызов может быть объединён в цепочку.

Краткий справочник

МетодНазначение
includeJS()Добавить JavaScript уровня документа (выполняется при открытии PDF)
addJavascriptObject()Добавить JavaScript как именованный PDF-объект

Базовый пример

php
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()

php
$pdf->includeJS(string $script): static

Добавляет JavaScript уровня документа, который выполняется при открытии PDF. Используйте для определений функций, глобальных переменных и логики инициализации.

ПараметрТипОписание
$scriptstringСырой JavaScript-код

Множественные вызовы добавляют дополнительные скрипты. Они выполняются в порядке добавления.

addJavascriptObject()

php
$pdf->addJavascriptObject(string $script): static

Добавляет JavaScript как именованный PDF-объект. Полезно, когда скрипты должны быть связаны с другими PDF-объектами (действия, аннотации), а не выполняться при открытии документа.

JavaScript-действия в полях форм

Поля форм поддерживают триггеры JavaScript-действий через массив параметров. Эти действия срабатывают в ответ на взаимодействие пользователя с полем.

ДействиеТриггер
onFocusПоле получает фокус
onBlurПоле теряет фокус
onChangeЗначение поля изменяется
validateПеред фиксацией значения
calculateКогда зависимые поля изменяются
formatПосле фиксации значения (форматирование отображения)
keystrokeПри каждом нажатии клавиши
php
$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; }',
]);

Триггеры печати и действия при открытии

Выполнение логики при открытии или печати документа:

php
$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 и т.д.).

Распространяется по лицензии LGPL-3.0-or-later.