Show Menu
TEMAS×

Servicio 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 TIFF y PDF que incluyen uno o varios códigos de barras como entrada y extrae los datos del código de barras. Los datos de códigos de barras pueden formatearse de diversas formas, como XML, cadenas delimitadas o cualquier formato personalizado creado con JavaScript.
El servicio Forms con códigos de barras admite las siguientes simbologías bidimensionales (2D) suministradas como documentos TIFF o PDF digitalizados:
  • PDF417
  • Matriz de datos
  • Código QR
El servicio también admite las siguientes simbologías unidimensionales suministradas como documentos TIFF o PDF digitalizados:
  • Codabar
  • Código 128
  • Código 3 de 9
  • EAN13
  • EAN8
Puede utilizar el servicio Forms con códigos de barras para realizar las siguientes tareas:
  • Extraiga datos de códigos de barras de imágenes de códigos de barras (TIFF o PDF). Los datos se almacenan como texto delimitado.
  • Convertir 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ódigo 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 TIFF digitalizada de un formulario contiene dos códigos de barras:
El servicio Forms con códigos de barras 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 para 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 la Ayuda de Designer). Cuando un usuario rellena un formulario con códigos de barras 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 resulta útil para convertir 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 se suelen utilizar para inicio de aplicaciones que utilizan el servicio Forms con códigos de barras. Por ejemplo, los escáneres de documento pueden guardar imágenes TIFF o PDF de formularios codificados con barras en una carpeta vigilada. El extremo de la carpeta vigilada pasa las imágenes al servicio para su descodificación.

Conjuntos de caracteres especificados por el usuario

Cuando los autores de formularios agregan objetos de código de barras a sus formularios mediante 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, 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 especificó el autor del formulario cuando se diseñó el formulario.

Limitaciones de 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 descodifican correctamente, a menos que estén acoplados.
  • Los códigos de barras 1-D 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 usar el servicio Forms con códigos de barras:
  • El servicio admite totalmente 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, acople el formulario o suministre el formulario como PDF digitalizado o documento TIFF.
  • Los formularios XFA dinámicos no son totalmente compatibles. Para descodificar correctamente códigos de barras 1D y 2D en un formulario dinámico, aplane el formulario o suministre el formulario como PDF digitalizado o documento TIFF.
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 con códigos de barras interactivos, consulte la Ayuda de Designer.

Configurar propiedades del servicio  

Puede utilizar el servicio Forms con códigos de barras AEMFD en AEM consola 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 PDF de entrada o 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 : Convertir datos descodificados 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 del servicio BCF con 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 de 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 estriba en ejecutar el servicio desde JSP/Servlet, el objeto documento recupera automáticamente una instancia del objeto ResourceResolver desde el 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 Documento. A continuación, el objeto Documento 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 del 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();
}