> ## 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.

# Reconocimiento de códigos de barras

> Ajuste el reconocimiento de códigos de barras en ABBYY FineReader Engine mediante BarcodeParams en PageAnalysisParams: sumas de comprobación para Code 39 / Interleaved 2 of 5 / Codabar / Matrix 2 of 5 y códigos 2D.

Esta sección aborda algunas características específicas del reconocimiento de códigos de barras con ABBYY FineReader Engine 12. Los aspectos principales del reconocimiento de códigos de barras se describen en el escenario [Reconocimiento de códigos de barras](/es/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/barcode-recognition).

En la mayoría de los casos, si un código de barras cumple la especificación, puede reconocerse con la configuración predeterminada. En otros casos, es necesario especificar determinados parámetros. Estos parámetros se especifican mediante el subobjeto [BarcodeParams](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/barcodeparams) del objeto [PageAnalysisParams](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageanalysisparams).

<div id="barcodes-with-checksum">
  ## Códigos de barras con suma de comprobación
</div>

Los códigos de barras de los tipos [Code 39](/es/fine-reader/engine/specifications/barcode-types#code_39), [Interleaved 2 of 5](/es/fine-reader/engine/specifications/barcode-types#interleaved2_5), [Codabar](/es/fine-reader/engine/specifications/barcode-types#codabar) y [Matrix 2 of 5](/es/fine-reader/engine/specifications/barcode-types#matrix2_5) pueden incluir una suma de comprobación. Las sumas de comprobación se utilizan para detectar errores. El algoritmo para calcular la suma de comprobación está definido por el estándar. Debe establecer la propiedad [HasChecksum](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/barcodeparams#haschecksum) del objeto BarcodeParams en TRUE para que los códigos de barras con suma de comprobación se reconozcan correctamente.

<Warning>
  El resultado del reconocimiento no incluye la suma de comprobación del código de barras si el estándar la contempla.
</Warning>

<div id="pdf417-aztec-data-matrix-qr-code-maxicode-barcodes">
  ## Códigos de barras PDF417, Aztec, Data Matrix, QR Code y MaxiCode
</div>

De forma predeterminada, ABBYY FineReader Engine reconoce los códigos de barras [PDF417](/es/fine-reader/engine/specifications/barcode-types#pdf_417), [Aztec](/es/fine-reader/engine/specifications/barcode-types#aztec), [DataMatrix](/es/fine-reader/engine/specifications/barcode-types#datamatrix), [QR Code](/es/fine-reader/engine/specifications/barcode-types#qrcode) y [MaxiCode](/es/fine-reader/engine/specifications/barcode-types#maxicode) utilizando la página de códigos correspondiente a la especificación. Las páginas de códigos son las siguientes:

* para PDF417 — DOS de Estados Unidos (437) ([CP\_US\_MSDOS](/es/fine-reader/engine/api-reference/enumerations/codepageenum#cp_us_msdos))
* para Aztec, DataMatrix, QR Code y MaxiCode — ISO Latin 1 (8859-1) ([CP\_Latin\_ISO](/es/fine-reader/engine/api-reference/enumerations/codepageenum#cp_latin_iso))

A veces, estos códigos de barras no se ajustan a la especificación; es decir, se crean con una página de códigos distinta de la definida por la especificación. En este caso, es necesario especificar manualmente la página de códigos mediante la propiedad [CodePage](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/barcodeparams#codepage) del objeto BarcodeParams.

<div id="qr-codes-in-structured-append-mode">
  ## Códigos QR en modo Structured Append
</div>

Los [Códigos QR](/es/fine-reader/engine/specifications/barcode-types#qrcode) pueden utilizarse para codificar una gran cantidad de datos combinando hasta 16 códigos en una secuencia con formato Structured Append. El objeto [BarcodeBlock](/es/fine-reader/engine/api-reference/layout-related-objects/barcodeblock) proporciona acceso a información específica sobre la secuencia Structured Append mediante las propiedades QrCodeSequenceId, QrCodeSequenceCount y QrCodeSequenceIndex, y puede usarlo en su programa para unir los códigos reconocidos.

<div id="binary-data-encoded-in-barcodes">
  ## Datos binarios codificados en códigos de barras
</div>

Los códigos de barras [PDF417](/es/fine-reader/engine/specifications/barcode-types#pdf_417), [Aztec](/es/fine-reader/engine/specifications/barcode-types#aztec), [DataMatrix](/es/fine-reader/engine/specifications/barcode-types#datamatrix) y [QR Code](/es/fine-reader/engine/specifications/barcode-types#qrcode) pueden codificar tanto texto como datos binarios. ABBYY FineReader Engine representa todos los datos reconocidos de códigos de barras, incluidos los datos binarios, como texto. La forma en que los datos binarios se representan como texto depende del valor de la propiedad [ContainsBinaryData](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/barcodeparams#containsbinarydata) del objeto BarcodeParams:

<table><thead><tr><th><p><strong>Valor de ContainsBinaryData</strong></p></th><th><p><strong>Representación de los datos binarios</strong></p></th></tr></thead><tbody><tr><td><p>FALSE (valor predeterminado)</p></td><td><ul><li>Cada carácter que contiene datos binarios tiene la propiedad <strong><a href="/es/fine-reader/engine/api-reference/text-related-objects/barcodesymbol#isbinarydata">IBarcodeSymbol::IsBinaryData</a></strong> establecida en TRUE.</li><li>Los datos binarios, al igual que los datos de texto, se representan como una cadena Unicode (<strong><a href="/es/fine-reader/engine/api-reference/layout-related-objects/barcodeblock#text">IBarcodeBlock::Text</a></strong>).</li><li>Los datos se convierten en una cadena Unicode mediante la página de códigos especificada en la propiedad <strong><a href="/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/barcodeparams#codepage">IBarcodeParams::CodePage</a></strong>. Para obtener los datos binarios a partir de la cadena Unicode, debe decodificar la cadena con la página de códigos correspondiente.</li></ul><Note>El cero binario no puede convertirse correctamente en una cadena Unicode. El carácter correspondiente en la cadena será el símbolo de "carácter no reconocido" ("^") y tendrá la propiedad <a href="/es/fine-reader/engine/api-reference/text-related-objects/barcodesymbol#isbinaryzero">IBarcodeSymbol::IsBinaryZero</a> establecida en TRUE.</Note></td></tr><tr><td><p>TRUE</p></td><td><ul><li>Cada carácter que contiene datos binarios tiene la propiedad <strong><a href="/es/fine-reader/engine/api-reference/text-related-objects/barcodesymbol#isbinarydata">IBarcodeSymbol::IsBinaryData</a></strong> establecida en TRUE.</li><li>Los datos binarios, al igual que los datos de texto, se representan como una cadena Unicode (<strong><a href="/es/fine-reader/engine/api-reference/layout-related-objects/barcodeblock#text">IBarcodeBlock::Text</a></strong>).</li><li>Los datos binarios se guardan en la cadena Unicode como una secuencia de valores hexadecimales de los bytes correspondientes. Por ejemplo, la cadena "00FF02" se utilizará para los siguientes 3 bytes: 0x00, 0xFF, 0x02.</li></ul></td></tr></tbody></table>

<div id="the-recognition-procedure">
  ## El procedimiento de reconocimiento
</div>

Para reconocer códigos de barras que no se ajustan a la especificación o códigos de barras con sumas de comprobación, haga lo siguiente (suponemos que ya se ha cargado el perfil predefinido BarcodeRecognition\_Accuracy o BarcodeRecognition\_Speed):

1. Cree un objeto [DocumentProcessingParams](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/documentprocessingparams) mediante el método [CreateDocumentProcessingParams](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) del objeto [Engine](/es/fine-reader/engine/api-reference/engine-object-iengine-interface).
2. Cambie los valores predeterminados de las propiedades necesarias del subobjeto BarcodeParams (DocumentProcessingParams contiene una propiedad PageProcessingParams, que contiene PageAnalysisParams, que a su vez incluye BarcodeParams).
3. Pase el objeto DocumentProcessingParams al método [Process](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/process-method) del objeto [FRDocument](/es/fine-reader/engine/api-reference/document-related-objects/frdocument) como parámetro de entrada.
4. Si utiliza otros métodos de procesamiento, es posible que requieran un objeto [PageAnalysisParams](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageanalysisparams) o un objeto [PageProcessingParams](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageprocessingparams) como parámetros de entrada. Siga el mismo procedimiento y cambie los valores del subobjeto BarcodeParams de uno de estos objetos.

<div id="code-samples">
  ### Ejemplos de código
</div>

<Accordion title="Código C++">
  ```cpp theme={null}
  // Suponemos que Engine ya se ha cargado
  // y que el documento ya está abierto
  IEngine* Engine;
  IFRDocument* frDocument;
  HRESULT res; // use esta variable para comprobar si la llamada al método se realizó correctamente
  ...
  // Crear un objeto DocumentProcessingParams
  IDocumentProcessingParams* params = 0;
  res = Engine->CreateDocumentProcessingParams( ¶ms );
   
  IPageProcessingParams* pageParams = 0;
  IPageAnalysisParams* analysisParams = 0;
  IBarcodeParams* barcodeParams = 0;
  res = params->get_PageProcessingParams( &pageParams );
  res = pageParams->get_PageAnalysisParams( &analysisParams );
  res = analysisParams->get_BarcodeParams( &barcodeParams );
   
  // Especificar los parámetros necesarios
  res = barcodeParams->set_Type( BT_Code39 );
   
  // Reconocer códigos de barras
  // Suponemos que el perfil predefinido BarcodeRecognition ya se ha cargado
  res = frDocument->Process( params );
  ...
  ```
</Accordion>

<Accordion title="Código C++ (COM)">
  ```cpp theme={null}
  FREngine::IEnginePtr Engine;
  FREngine::IFRDocumentPtr frDocument;
  ...
  // Crear un objeto DocumentProcessingParams
  FREngine::IDocumentProcessingParamsPtr params = Engine->CreateDocumentProcessingParams();
  // Especificar los parámetros necesarios
  params->PageProcessingParams->PageAnalysisParams->BarcodeParams->Type = FREngine::BT_Code39;
  // Reconocer códigos de barras. Suponemos que el objeto FRDocument ya se ha creado y
  // que el perfil predefinido BarcodeRecognition ya se ha cargado
  frDocument->Process( params );
  ...
  ```
</Accordion>

<Accordion title="Código C#">
  ```csharp theme={null}
  FREngine.IEngine engine;
  FREngine.IFRDocument frDocument;
  ...
  // Crear un objeto DocumentProcessingParams
  FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
  // Especificar los parámetros necesarios
  dpp.PageProcessingParams.PageAnalysisParams.BarcodeParams.Type = (int)FREngine.BarcodeTypeEnum.BT_Code39;
  // Reconocer códigos de barras. Suponemos que el objeto FRDocument ya se ha creado y
  // que el perfil predefinido BarcodeRecognition ya se ha cargado
  frDocument.Process( dpp );
  ```
</Accordion>

<div id="tips-for-working-with-barcodes">
  ## Consejos para trabajar con códigos de barras
</div>

La calidad del reconocimiento de códigos de barras depende de la calidad de impresión del código y de la configuración utilizada durante el proceso de escaneado del documento. Para que los códigos de barras se reconozcan correctamente, siga estas recomendaciones:

* Un código de barras debe estar separado de cualquier otro texto por un espacio en blanco bastante amplio.
* El tamaño del código de barras y el ancho de cada una de sus barras o puntos deben cumplir los siguientes requisitos:
  * La altura óptima del código de barras es superior a 10 milímetros. El tamaño de un código de barras debe ser inferior al tamaño A4.
  * La altura del código de barras debe ser superior al doble de la altura de una línea de texto.
  * En los códigos de barras no cuadrados, la longitud debe ser mayor que la altura.
  * En los códigos de barras 1D, el ancho de la barra más fina debe ser de al menos 3-5 píxeles de la imagen.
  * En los códigos de barras 2D, las dimensiones de sus celdas deben ser de al menos 2x2 píxeles; el tamaño recomendado es de 4x4 píxeles o más. Además, en todos los códigos de barras 2D excepto PDF417, las celdas deben ser cuadradas porque, si el código de barras 2D está estirado, lo más probable es que se reconozca incorrectamente.
* No recomendamos comprimir imágenes de códigos de barras con compresión JPEG, ya que esto hace que los bordes se vean borrosos.
* No recomendamos inclinar los códigos de barras; es decir, el ángulo del código de barras debe ser un múltiplo de 90 grados con respecto al eje horizontal.
* El modo de escaneado en escala de grises es el mejor para fines de Reconocimiento óptico de caracteres (OCR). Al escanear en blanco y negro, ajuste la configuración de brillo. Si el código de barras aparece "cortado" o es muy claro, reduzca el brillo para oscurecer la imagen. Si el código de barras está distorsionado o sus partes aparecen pegadas entre sí, aumente el brillo para aclarar la imagen.
* Evite imprimir códigos de barras dentro de marcos.
* Evite imprimir códigos de barras sobre texto o imágenes.

En la práctica, los códigos de barras que no cumplen estas recomendaciones pueden seguir reconociéndose; sin embargo, la calidad del reconocimiento puede ser baja.

<div id="see-also">
  ## Consulte también
</div>

[Reconocimiento de códigos de barras](/es/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/barcode-recognition)

[Tipos de código de barras](/es/fine-reader/engine/specifications/barcode-types)
