Servicio de Forms con códigos de barras

Información general

El servicio Forms con códigos de barras extrae datos de imágenes electrónicas de códigos de barras. El servicio acepta archivos de TIFF y PDF que incluyen uno o más códigos de barras como entrada y extrae los datos del código de barras. Los datos de código de barras se pueden formatear de varias formas, incluso XML, cadenas delimitadas o cualquier formato personalizado creado con JavaScript.

El servicio Forms con códigos de barras es compatible con lo siguiente bidimensional (2D) simbologías suministradas como documentos de TIFF o PDF escaneados:

  • PDF417
  • Matriz de datos
  • Código QR

El servicio también admite lo siguiente unidimensional simbologías suministradas como documentos de TIFF o PDF escaneados:

  • Codabar
  • Código 128
  • Código 3 de 9
  • EAN13
  • EAN8

Puede utilizar el servicio Forms de códigos de barras para realizar las siguientes tareas:

  • Extraiga datos de códigos de barras de imágenes (TIFF o PDF). Los datos se almacenan como texto delimitado.
  • Convierta datos de texto delimitados a XML (XDP o XFDF). Los datos XML son más fáciles de analizar que el texto delimitado. Además, los datos en formato XDP o XFDF pueden utilizarse como entrada para otros servicios en AEM Forms.

Para cada código de barras de una imagen, el servicio Forms con códigos de barras localiza el código de barras, lo descodifica y extrae los datos. El servicio devuelve los datos del código de barras (mediante la codificación de entidad donde sea necesario) en un elemento de contenido de un documento XML. Por ejemplo, la siguiente imagen de TIFF digitalizado de un formulario contiene dos códigos de barras:

ejemplo

El servicio Forms Barcoded devuelve el siguiente documento XML después de descodificar los códigos de barras:

<?xml version="1.0" encoding="UTF-8" ?>
<xb:scanned_image xmlns:xb="https://decoder.barcodedforms.adobe.com/xmlbeans"     path="tiff" version="1.0">
    <xb:decode>
        <xb:date>2007-05-11T15:07:49.965-04:00</xb:date>
        <xb:host_name>myhost.adobe.com</xb:host_name>
        <xb:status type="success">
            <xb:message />
        </xb:status>
    </xb:decode>
    <xb:barcode id="1">
        <xb:header symbology="pdf417">
            <xb:location page_no="1">
                <xb:coordinates>
                    <xb:point x="0.119526625" y="0.60945123" />
                    <xb:point x="0.44457594" y="0.60945123" />
                    <xb:point x="0.44457594" y="0.78445125" />
                    <xb:point x="0.119526625" y="0.78445125" />
                </xb:coordinates>
            </xb:location>
        </xb:header>
        <xb:body>
            <xb:content encoding="utf-8">t_SID t_FirstName t_MiddleName t_LastName t_nFirstName t_nMiddleName t_nLastName 90210 Patti Y Penne Patti P Prosciutto</xb:content>
        </xb:body>
    </xb:barcode>
    <xb:barcode id="2">
        <xb:header symbology="pdf417">
            <xb:location page_no="1">
                <xb:coordinates>
                    <xb:point x="0.119526625" y="0.825" />
                    <xb:point x="0.44457594" y="0.825" />
                    <xb:point x="0.44457594" y="0.9167683" />
                    <xb:point x="0.119526625" y="0.9167683" />
                </xb:coordinates>
            </xb:location>
         </xb:header>
        <xb:body>
            <xb:content encoding="utf-8">t_FormType t_FormVersion ChangeName 20061128</xb:content>
         </xb:body>
    </xb:barcode>
</xb:scanned_image>

Consideraciones sobre el servicio

Flujos de trabajo que utilizan formularios con códigos de barras

Los autores de formularios crean formularios interactivos con códigos de barras mediante Designer. (Consulte Ayuda de Designer.) Cuando un usuario rellena un formulario codificado mediante Adobe Reader o Acrobat, el código de barras se actualiza automáticamente para codificar los datos del formulario.

El servicio Forms con códigos de barras es útil para convertir los datos que existen en papel a formato electrónico. Por ejemplo, cuando se rellena e imprime un formulario con códigos de barras, la copia impresa se puede digitalizar y utilizar como entrada en el servicio Forms con códigos de barras.

Los extremos de carpeta observados generalmente se utilizan para iniciar aplicaciones que utilizan el servicio Forms de códigos de barras. Por ejemplo, los escáneres de documentos pueden guardar imágenes de TIFF o PDF de formularios con códigos de barras en una carpeta vigilada. El punto final de la carpeta observada pasa las imágenes al servicio para su descodificación.

Se recomienda a los autores de formularios con códigos de barras utilizar un formato simple y delimitado (como delimitado por tabulaciones) al codificar datos en códigos de barras. Además, evite utilizar Retorno de carro como delimitador de campo. Designer proporciona una selección de codificaciones delimitadas que generan automáticamente secuencias de comandos de JavaScript para codificar códigos de barras. Los datos decodificados tienen los nombres de campo en la primera línea y sus valores en la segunda línea, con pestañas entre cada campo.

Al descodificar códigos de barras, especifique el carácter que se utiliza para delimitar los campos. El carácter especificado para la descodificación debe ser el mismo que se utilizó para codificar el código de barras. Por ejemplo, al utilizar el formato delimitado por tabulaciones recomendado, la operación Extraer a XML debe utilizar el valor predeterminado de Tabulador para el delimitador de campo.

Conjuntos de caracteres especificados por el usuario

Cuando los autores de formularios agregan objetos de código de barras a sus formularios utilizando Designer, pueden especificar una codificación de caracteres. Las codificaciones reconocidas son UTF-8, ISO-8859-1, ISO-8859-2, ISO-8859-7, Shift-JIS, KSC-5601, Big-Five, GB-2312, UTF-16. De forma predeterminada, todos los datos se codifican en códigos de barras como UTF-8.

Al descodificar códigos de barras, se puede especificar la codificación del conjunto de caracteres que se va a utilizar. Para garantizar que todos los datos se descodifican correctamente, especifique el mismo conjunto de caracteres que el autor del formulario especificó cuando se diseñó el formulario.

Limitaciones de la API

Cuando utilice las API de BCF, tenga en cuenta las siguientes limitaciones:

  • Los formularios dinámicos no son compatibles.
  • Los formularios interactivos no se decodifican correctamente, a menos que se acoplan.
  • Los códigos de barras 1D solo deben contener valores alfanuméricos (si se admiten). Los códigos de barras 1D que contienen símbolos especiales no se descodifican.

Otras limitaciones

Además, tenga en cuenta las siguientes limitaciones al utilizar el servicio de Forms con códigos de barras:

  • El servicio es totalmente compatible con AcroForms y formularios estáticos que contienen códigos de barras 2D guardados con Adobe Reader o Acrobat. Sin embargo, para los códigos de barras 1D, aplane el formulario o suministre el formulario como PDF digitalizado o documento TIFF.
  • Los formularios XFA dinámicos no son totalmente compatibles. Para descodificar correctamente los códigos de barras 1D y 2D en un formulario dinámico, aplane el formulario o suministre el formulario como PDF o documento TIFF digitalizado.

Además, el servicio puede descodificar cualquier código de barras que utilice simbología admitida si se observan las limitaciones anteriores. Para obtener más información sobre cómo crear formularios interactivos con códigos de barras, consulte Ayuda de Designer.

Configuración de propiedades del servicio  

Puede usar la variable Servicio de Forms con códigos de barras de AEMFD en AEM Console para configurar las propiedades de este servicio. La dirección URL predeterminada de AEM consola es https://[host]:'port'/system/console/configMgr.

Uso del servicio

El servicio de Forms con códigos de barras proporciona las dos API siguientes:

  • decode: Descodifica todos los códigos de barras disponibles en un documento de PDF de entrada o en una imagen tiff. Devuelve otro documento XML que contiene datos recuperados de todos los códigos de barras disponibles en el documento de entrada o la imagen.

  • extractToXML: Convierta datos decodificados mediante la API de descodificación a datos XML. Estos datos XML se pueden combinar con un formulario XFA. Devuelve una lista de documentos XML, uno para cada código de barras.

Uso de un servicio BCF con un JSP o Servlets

El siguiente código de ejemplo descodifica un código de barras en un documento y guarda el XML de salida en el disco.

<%@ page import="java.util.List,
                com.adobe.fd.bcf.api.BarcodedFormsService,
                com.adobe.fd.bcf.api.CharSet,
                com.adobe.fd.bcf.api.Delimiter,
                com.adobe.fd.bcf.api.XMLFormat,
                com.adobe.aemfd.docmanager.Document,
                javax.xml.transform.Transformer,
                javax.xml.transform.TransformerFactory,
                java.io.StringWriter,
                javax.xml.transform.stream.StreamResult,
                javax.xml.transform.dom.DOMSource,
                javax.servlet.jsp.JspWriter,
                org.apache.commons.lang.StringEscapeUtils" %><%
%><%@taglib prefix="sling" uri="https://sling.apache.org/taglibs/sling/1.0" %><%
%><sling:defineObjects/><%

 // Get reference to BarcodedForms OSGi service.
 // Within an OSGi bundle @Reference annotation
 // can be used to retrieve service reference

 BarcodedFormsService bcfService = sling.getService(BarcodedFormsService.class);

 // Path to image containing barcodes in AEM repository.
 // Replace this with path to image in your repository
 String documentPath = "/content/dam/TestImage-010.tif";

 // Create a Docmanager Document object for
 // the tiff file containing barcode
 // Please see Docmanager Document javadoc for
 // more details
 Document inputDoc = new Document(documentPath);

 // Invoke decode operation of barcoded forms service
 // Second parameter is set to true to decode PDF417 barcode symbology
 // Please see javadoc for details of parameters

 org.w3c.dom.Document result = bcfService.decode(inputDoc, // Input Document Object
                                                    true,
                                                    false,
                                                    false,
                                                    false,
                                                    false,
                                                    false,
                                                    false,
                                                    false,
                                                    CharSet.UTF_8);// use UTF-8 character encoding

 out.println("<h2> Output Returned from decode operation </h2>");
 printDoc(result,out);

 // Invoke extractToXML to convert Carriage
 // return / Tab delimited data to XML

 List<org.w3c.dom.Document> listResult = bcfService.extractToXML(result, // w3c document from the output of decode operation
                                                                    Delimiter.Carriage_Return, // Lines are separated using "\r"
                                                                    Delimiter.Tab, // Fields are separated using "\t"
                                                                    XMLFormat.XDP); // wraps generated XML in <xdp:xdp> packet

 out.println("<h2> Output returned from extractToXML </h2>");
 printDoc(listResult.get(0),out);

%><%!

 // helper function to convert w3c document to string

 String convertToString(org.w3c.dom.Document inputDoc) throws Exception {
   TransformerFactory tf = TransformerFactory.newInstance();
   Transformer tr = tf.newTransformer();
   StringWriter sw = new StringWriter();
   StreamResult sr = new StreamResult(sw);
   tr.transform(new DOMSource(inputDoc), sr);
   return sw.toString();
 }

 // helper function to render XML to response

 void printDoc(org.w3c.dom.Document inputDoc,JspWriter out) throws Exception {
   String escapedString = StringEscapeUtils.escapeHtml(convertToString(inputDoc));
   out.println(escapedString);
 }

%>

Uso del servicio BCF con flujos de trabajo AEM

La ejecución del servicio Forms con códigos de barras desde un flujo de trabajo es similar a la ejecución del servicio desde JSP/Servlet. La única diferencia es que al ejecutar el servicio desde JSP/Servlet el objeto de documento recupera automáticamente una instancia del objeto ResourceResolver del objeto ResourceResolverHelper. Este mecanismo automático no funciona cuando se llama al código desde un flujo de trabajo.

Para un flujo de trabajo, pase explícitamente una instancia del objeto ResourceResolver al constructor de la clase Document. A continuación, el objeto Document utiliza el objeto ResourceResolver proporcionado para leer el contenido del repositorio.

El siguiente proceso de flujo de trabajo de ejemplo descodifica un código de barras en un documento y guarda el resultado en el disco. El código se escribe en ECMAScript y el documento se pasa como carga útil de flujo de trabajo:

/*
 * Imports
 */
var BarcodedFormsService = Packages.com.adobe.fd.bcf.api.BarcodedFormsService;
var CharSet = Packages.com.adobe.fd.bcf.api.CharSet;

var Document = Packages.com.adobe.aemfd.docmanager.Document;
var File = Packages.java.io.File;
var FileOutputStream = Packages.java.io.FileOutputStream;
var TransformerFactory = Packages.javax.xml.transform.TransformerFactory;
var Transformer = Packages.javax.xml.transform.Transformer;
var StreamResult = Packages.javax.xml.transform.stream.StreamResult;
var DOMSource = Packages.javax.xml.transform.dom.DOMSource;

var ResourceResolverFactory = Packages.org.apache.sling.api.resource.ResourceResolverFactory;

// get reference to BarcodedFormsService
var bcfService = sling.getService(BarcodedFormsService);

/*
 * workflow payload and path to it
 */
var payload = graniteWorkItem.getWorkflowData().getPayload();
var payload_path = payload.toString();

/* Create resource resolver using current session
 * this resource resolver needs to be passed to Document
 * object constructor when file is to be read from
 * crx repository.
 */

/* get ResourceResolverFactory service reference , used
 * to construct resource resolver
 */
var resourceResolverFactory = sling.getService(ResourceResolverFactory);

var authInfo = {
    "user.jcr.session":graniteWorkflowSession.getSession()
};

var resourceResolver = resourceResolverFactory.getResourceResolver(authInfo);

// Create Document object from payload_path
var inputDocument = new Document(payload_path, resourceResolver);

// invoke decode operation to decode barcodes in inputDocument
var decodedBarcode = bcfService.decode(inputDocument, true, false, false, false, false, false, false, false, CharSet.UTF_8);

// save decoded barcode data to disk
saveW3CDocument(decodedBarcode, "C:/temp/decoded.xml");

/*
 * Helper function to save W3C Document
 * to a file on disk
 */
function saveW3CDocument(inputDoc, filePath) {
   var tf = TransformerFactory.newInstance();
   var tr = tf.newTransformer();
   var os = new FileOutputStream(filePath);
   var sr = new StreamResult(os);
   tr.transform(new DOMSource(inputDoc), sr);
   os.close();
}

En esta página