JavaScript
Los documentos PDF pueden contener JavaScript incrustado que se ejecuta en el visor. TCPDF-Next proporciona métodos para agregar scripts a nivel de documento a través de Content\JavaScriptManager, accesible mediante la API fluida de Document.
Todos los métodos retornan static, por lo que cada llamada puede ser encadenada.
Referencia rápida
| Método | Propósito |
|---|---|
includeJS() | Agregar JavaScript a nivel de documento (se ejecuta cuando se abre el PDF) |
addJavascriptObject() | Agregar JavaScript como un objeto PDF con nombre |
Ejemplo básico
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Interactive Form with JavaScript', newLine: true)
// JavaScript a nivel de documento
->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);
}
')
// Campos de formulario que usan el 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
El soporte de JavaScript varía según el visor PDF. Adobe Acrobat tiene soporte completo para la API JavaScript de Acrobat. Foxit Reader soporta la mayoría de las funciones. Los visores basados en navegador y las aplicaciones de vista previa generalmente no ejecutan JavaScript de PDF.
includeJS()
$pdf->includeJS(string $script): staticAgrega JavaScript a nivel de documento que se ejecuta cuando se abre el PDF. Úsalo para definiciones de funciones, variables globales y lógica de inicialización.
| Parámetro | Tipo | Descripción |
|---|---|---|
$script | string | Código JavaScript sin procesar |
Las llamadas múltiples agregan scripts adicionales. Se ejecutan en el orden en que se agregan.
addJavascriptObject()
$pdf->addJavascriptObject(string $script): staticAgrega JavaScript como un objeto PDF con nombre. Útil cuando los scripts necesitan ser referenciados por otros objetos PDF (acciones, anotaciones) en lugar de ejecutarse al abrir el documento.
Acciones JavaScript en campos de formulario
Los campos de formulario soportan disparadores de acciones JavaScript a través de su arreglo de opciones. Estas acciones se activan en respuesta a la interacción del usuario con el campo.
| Acción | Disparador |
|---|---|
onFocus | El campo recibe el foco |
onBlur | El campo pierde el foco |
onChange | El valor del campo cambia |
validate | Antes de que el valor se confirme |
calculate | Cuando los campos dependientes cambian |
format | Después de que el valor se confirme (formato de visualización) |
keystroke | En cada pulsación de tecla |
$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; }',
]);Disparador de impresión y acciones de apertura
Ejecuta lógica cuando se abre o imprime el documento:
$pdf->includeJS('
app.alert("Welcome! Please fill in all required fields.");
')
->includeJS('
var pp = this.addScript("willPrint", "app.alert(\'This document is confidential.\');");
');Consejos
- Mantén los scripts concisos. Los bloques grandes aumentan el tamaño del archivo y ralentizan la apertura del documento.
- La API JavaScript de Acrobat está documentada en la Referencia de API JavaScript para Acrobat de Adobe.
- Prueba los PDFs interactivos en Adobe Acrobat para asegurar la compatibilidad completa antes de distribuirlos.
- Los estándares PDF/A prohíben JavaScript. No incluyas scripts si apuntas a cumplimiento PDF/A.
- Para cálculos, usa funciones integradas de Acrobat (
AFNumber_Format,AFSimple_Calculate, etc.) cuando sea posible.