Skip to content

JavaScript

PDF 文件可以包含在阅读器中执行的嵌入式 JavaScript。TCPDF-Next 通过 Content\JavaScriptManager 提供添加文件级脚本的方法,并经由 Document 流畅 API 访问。

所有方法皆返回 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.\');");
');

提示

  • 脚本应尽量精简。过大的代码块会增加文件大小并拖慢文件打开速度。
  • Acrobat JavaScript API 的完整文档请参考 Adobe 的 JavaScript for Acrobat API Reference
  • 发布前请在 Adobe Acrobat 中测试交互式 PDF,以确保完整兼容性。
  • PDF/A 标准禁止使用 JavaScript。若目标为 PDF/A 合规,请勿加入脚本。
  • 进行计算时,尽量使用 Acrobat 内置函数(AFNumber_FormatAFSimple_Calculate 等)。

以 LGPL-3.0-or-later 许可证发布。