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) proporcionadas como documentos TIFF o PDF digitalizados:
El servicio también admite las siguientes simbologías unidimensionales suministradas como documentos TIFF o PDF escaneados:
Puede utilizar el servicio Forms con códigos de barras para realizar las siguientes tareas:
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>
Los autores de formularios crean formularios interactivos con códigos de barras mediante Designer. (Consulte 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.
Se recomienda a los autores de formularios con códigos de barras que utilicen un formato sencillo y delimitado (como delimitado por tabuladores) 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 descodificados tienen los nombres de campo en la primera línea y sus valores en la segunda línea, con fichas 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 la codificación del código de barras. Por ejemplo, al utilizar el formato delimitado por tabuladores recomendado, la operación Extraer a XML debe utilizar el valor predeterminado de Tab para el delimitador de campo.
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.
Cuando utilice las API de BCF, tenga en cuenta las siguientes limitaciones:
Además, tenga en cuenta las siguientes limitaciones al usar el servicio Forms con códigos de barras:
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 Ayuda de Designer.
Puede utilizar el servicio de 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
.
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.
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);
}
%>
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();
}