Me tomó un tiempo darme cuenta, pero agregué con éxito un campo de firma a un PDF generado con pdfkit. Agrego el campo con la siguiente función:
const formSig = ((pdfDoc, name, x, y, w, h, options = {}) => { const annotOptions = { ...options, FT: 'Sig', } pdfDoc.formAnnotation(name, null, x, y, w, h, annotOptions) });Sin embargo, ahora quiero controlar qué campos se bloquean cuando alguien firma el documento para poder solicitar varias firmas. Sé qué pasos debo seguir, pero no estoy seguro de cómo hacerlo.
Type establecido en SigFieldLock , Acción establecida en Include y Fields establecido en una matriz de cadenas de nombres de campo.Lock al campo de firma que sea una referencia al diccionario de bloqueo.Estoy luchando por averiguar qué método me permitirá agregar el diccionario, encontrar su referencia e incluir la referencia al agregar el campo de firma.
Actualizar
Creo que descubrí cómo crear el diccionario y obtener su referencia para agregar a las opciones de campo, pero el diccionario no se escribe en la secuencia.
¿Alguien conoce pdfkit lo suficientemente bien como para indicarme la dirección correcta?
Logré hacerlo funcionar. En pdfkit, puede crear básicamente cualquier objeto de diccionario utilizando el método ref() . La otra cosa que aprendí es que para crear la matriz de campos para el diccionario de bloqueo, necesitaba convertir cada cadena en una String para que pdfkit la codificara correctamente.
Use el siguiente código:
const formSig = ((pdfDoc, name, x, y, w, h, fieldsToLock, options = {}) => { // Converts the array of strings to an array of Strings const lockArray = fieldsToLock.map((fieldName) => { return new String(fieldName); }) // Call the function to create the lock dictionary and capture its reference const lockRef = lockDict(pdfDoc, lockArray) // Build the annotation options including the field type, make the field require and a reference // to the lock dictionary in the Lock field const annotOptions = { ...options, FT: 'Sig', Ff: 2, Lock: lockRef, } // Add the field to the dictionary pdfDoc.formAnnotation(name, null, x, y, w, h, annotOptions) }); const lockDict = ((pdfDoc, locks) => { // Build the Lock dictionary object to be added to the PDF const dict = { Type: 'SigFieldLock', Action: 'Include', Fields: locks } // Create a dictionary object reference and capture the reference let dictRef = pdfDoc.ref(dict); // Write the reference to the PDF stream dictRef.end(); // Return the reference return fieldRef; });Tendré que agregar algo de lógica y manejo de errores (en caso de que no haya campos para bloquear), pero funciona. Lo he probado con múltiples firmas que bloquean diferentes campos y múltiples firmas que bloquean los mismos campos.