Saltar al contenido principal

Documentation Index

Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt

Use this file to discover all available pages before exploring further.

Los siguientes ejemplos de JavaScript ilustran patrones habituales para scripts de la actividad personalizada: autorización OAuth, envío de exportaciones a servicios externos, modificación de campos extraídos, manipulación de tablas, generación de JSON personalizado y obtención de nombres de archivos de origen. Cópielos y adáptelos a sus propios nombres de campo y endpoints.

Autorizar mediante OAuth y enviar datos de exportación a un servicio externo

El siguiente script realiza la autenticación con un token obtenido mediante el flujo Resource Owner Password y luego envía los datos de exportación a un servicio externo:
// Este script de exportación personalizada de ejemplo muestra cómo enviar una solicitud de autorización para OAuth 2.0 Resource Owner Password Flow, recibir el token,
// y luego enviar los resultados de exportación al sistema externo en formato JSON

// Preparar el cuerpo clave-valor para la solicitud de autorización (los parámetros y sus valores pueden ser diferentes). La variable de entorno correspondiente debe crearse previamente.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Pasar datos sensibles usando variables de entorno. Las variables correspondientes deben crearse previamente.
authDataContent.client_id = Context.GetSecret("client_id_secretName");
authDataContent.client_secret = Context.GetSecret("client_secret_secretName");
authDataContent.password = Context.GetSecret("password_secretName");
authDataContent.username = Context.GetSecret("username_secretName");

// crear la solicitud y enviar los datos
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// crear datos de contenido para la solicitud de autorización
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// obtener todas las exportaciones del documento
var exports = Context.Transaction.Documents[0].Exports;

// seleccionar el resultado de exportación JSON
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crear datos de contenido para la solicitud
var multiPartRequest = Context.CreateMultipartFormDataRequest();
multiPartRequest.Url = "https://my_service.com/api/v1.0/process_method"
multiPartRequest.Method = "POST";
multiPartRequest.AuthToken = authResponseObject.access_token;
multiPartRequest.AuthScheme = "Bearer";

// agregar datos extraídos al resultado de exportación
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// agregar el PDF exportado
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// enviar una solicitud al servicio
multiPartRequest.Send();

// Obtener un resultado de respuesta deserializado
var responseObject = JSON.parse(multiPartRequest.ResponseText);

Enviar datos de exportación a un servicio externo

El siguiente script asigna al archivo exportado un nombre basado en el número de factura y, a continuación, envía los datos de exportación a un servicio externo (Dropbox, en este caso):
// Este script de exportación personalizado muestra cómo enviar un archivo a Dropbox
// y establecer el nombre del archivo usando el valor de un campo de datos extraídos.

// Obtener el resultado de exportación del documento
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obtener el token de acceso a la API de DropBox (https://developers.dropbox.com/en-us/oauth-guide). La variable de entorno correspondiente debe crearse de antemano.
var token = Context.GetSecret("access_token_secretName");

// Obtener el "Número de factura" de los datos extraídos
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Crear el nombre del archivo resultante
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Enviar el archivo JSON con los datos extraídos a DropBox
var httpRequest = Context.CreateHttpRequest();
httpRequest.Url = "https://content.dropboxapi.com/2/files/upload"
httpRequest.Method = "POST";
httpRequest.AuthScheme = "Bearer";
httpRequest.AuthToken = token;
httpRequest.SetHeader("Dropbox-API-Arg", `{"path": "/Files/${jsonFileName}", "mode": "add", "autorename": true, "mute": false, "strict_conflict": false}`);
httpRequest.SetFileContent(extractedDataExportResult, "application/octet-stream");
httpRequest.Send();

Modificar datos extraídos

El siguiente script modifica el valor de un campo existente y añade nuevos valores a un campo repetible usando la información contenida en la respuesta de un servicio externo:
// Este script de actividad personalizada de ejemplo muestra cómo modificar un campo existente 
// y crear un nuevo valor de campo a partir de los resultados de una llamada externa.

// Obtener todas las exportaciones del documento
var exports = Context.Transaction.Documents[0].Exports;

// Obtener el resultado de exportación JSON de las exportaciones
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obtener el resultado de exportación PDF de las exportaciones
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crear una solicitud HTTP y especificar las propiedades necesarias de la solicitud
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Agregar los datos extraídos del resultado de exportación JSON a la solicitud
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Agregar el PDF de los resultados de exportación a la solicitud
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Establecer el tiempo de espera para completar la solicitud HTTP (en minutos).
// De forma predeterminada, el tiempo de espera está configurado en 1 minuto.
multipartFormDataRequest.Timeout = 1;

// Enviar una solicitud al servicio
multipartFormDataRequest.Send();

// Obtener el resultado de la respuesta
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// Suponiendo que se obtuvo el siguiente JSON en el resultado de la respuesta:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Cambiar el valor de un campo de documento de Vantage existente a partir de los datos recibidos de una llamada externa
var document = Context.Transaction.Documents[0];
var invoiceNumber = document.GetField("Invoice Number");
if (invoiceNumber.InstanceId === undefined || invoiceNumber.InstanceId === null)
    invoiceNumber.AddInstance();
invoiceNumber.Value = newJsonDataObject.DocumentData.Fields.InvoiceNumber;

// Agregar nuevos valores de campo de documento de Vantage a partir de los datos recibidos de una llamada externa
var poOrder = Context.Transaction.Documents[0].GetField("Purchase Order");
let orderNumberFieldId = document.GetField("Purchase Order/Order Number").Id;
let totalFieldId = document.GetField("Purchase Order/Total").Id;
newJsonDataObject.DocumentData.Fields.PurchaseOrder.forEach(function (elem) {
    var newOrder = poOrder.AddInstance();
    var orderNumber = newOrder.Children.find(x => x.Id === orderNumberFieldId);
    orderNumber.Value = elem.OrderNumber;
    var total = newOrder.Children.find(x => x.Id === totalFieldId);
    total.Value = elem.Total;
});

Obtener datos de una columna específica de la tabla

El siguiente script escribe en el registro de eventos de la transacción todos los valores (filas) de la columna Description de la tabla:
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Obtener el objeto de tabla
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // Obtener el objeto de columna 'Description' para cada fila de la tabla y escribir sus valores en el registro de eventos de la transacción
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);
}

Obtener datos de todas las columnas de la tabla

El siguiente script escribe todos los valores (filas) de todas las columnas de la tabla en el registro de eventos de la transacción:
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
var table = document.GetField("Line Items");

// Escribir todos los datos de la tabla en el registro de eventos de la transacción
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Table row "+i+". Column "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

Añadir filas a una tabla

El siguiente script añade nuevas filas a la tabla y establece valores en las columnas Descripción y Cantidad:
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
var table = document.GetField("Line Items");
var descriptionFieldId = document.GetField("Line Items/Description").Id;
var quantityFieldId = document.GetField("Line Items/Quantity").Id;
var tableRowCount = table.Instances.length;

// Crear función para agregar una fila a la tabla y establecer valores para las columnas Description y Quantity
function addRow(valueDescription, valueQuantity, index) {
    table.AddInstance();
    var columnDescription = table.Instances[index].Children.find(x => x.Id === descriptionFieldId);
    columnDescription.Value = valueDescription;
    var columnQuantity = table.Instances[index].Children.find(x => x.Id === quantityFieldId);
    columnQuantity.Value = valueQuantity;
}

// Agregar tres filas y establecer valores
addRow("49910 - Gloves or mittens, NOI, in boxes", 4, tableRowCount++);
addRow("15560 - Bulk, NOI, inflated", 42, tableRowCount++);
addRow("15520 - Athletic or Sporting Goods, NOI", 24, tableRowCount++);

Eliminar filas de una tabla

El siguiente script elimina todas las filas de una tabla:
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Eliminar todas las filas por sus índices
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// O puede eliminar la tabla completa
table.Remove();

Eliminar una instancia concreta de un campo repetible

El siguiente script elimina la última instancia de un campo repetible:
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de campo repetible
var rField = document.GetField("First Name");

// Comprobar si este campo es repetible
if (rField.IsRepeatable) {
    // Eliminar la última instancia de este campo
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " is not repeating.");
}

Generar un archivo JSON y enviarlo a un sistema de terceros

El siguiente script genera un archivo JSON con un formato personalizado y lo envía a un sistema de terceros:
// Este script de exportación personalizada de ejemplo muestra cómo crear una cadena JSON
// usando valores de campos extraídos de Invoice US y enviarla a un endpoint externo.
// Obtener el primer documento en la transacción.
var document = Context.Transaction.Documents[0];

// Crear un objeto JSON y establecer sus pares clave/valor.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Obtener valores de campos repetidos y establecerlos como valores de array JSON.
extractedValues.PurchaseOrderNumber = [];
var poGroup = document.GetField("Purchase Order");
var orderNumberFieldId = document.GetField("Purchase Order/Order Number").Id;
for (var i = 0; i < poGroup.Instances.length; i++) {
  var poNumber = poGroup.Instances[i].Children.find(x => x.Id === orderNumberFieldId);
  extractedValues.PurchaseOrderNumber.push(poNumber.Value);
}

// El archivo JSON recibido tiene el siguiente formato:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Enviar una solicitud multipart/form-data con el JSON creado previamente como el contenido de cadena de esa solicitud.
var httpRequest = Context.CreateMultipartFormDataRequest();
httpRequest.Method = "POST";
httpRequest.Url = "https://external-endpoint.com/api/v1.0/tasks/1495c913-17bb-48d4-8041-a240e05ca9a4/process";
httpRequest.AppendStringContent(JSON.stringify(extractedValues), "jsonData");
httpRequest.Send();

Recuperar los nombres originales de los archivos

El siguiente script coloca el nombre original de un archivo en el campo MyField:
// Obtener el nombre del archivo de origen y establecerlo como el valor del campo especificado ("MyField")
Context.Transaction.Documents.forEach( doc => {
    // Para Scanning Station, el nombre del archivo de origen se almacena en un parámetro de registro
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});

Actividad personalizada

Amplíe las skills con lógica de scripts e integraciones de terceros.

Modelo de objetos

Referencia completa del modelo de objetos de JavaScript para scripts de actividad personalizada.

Context

Objeto global para los datos de la transacción, las solicitudes HTTP y los secretos.

HttpRequest

Envíe solicitudes HTTP con codificación URL, de texto, JSON o binarias desde un script.

MultipartFormDataRequest

Realice solicitudes HTTP multipart/form-data desde scripts de actividad personalizada.

ExportFormat

Formatos disponibles para los archivos exportados desde una actividad personalizada o una Actividad Output.