Esta seção aborda alguns recursos específicos do reconhecimento de códigos de barras com o ABBYY FineReader Engine 12. Os principais aspectos desse reconhecimento são abordados na descrição do cenário Reconhecimento de códigos de barras.Na maioria dos casos, se um código de barras estiver em conformidade com a especificação, ele poderá ser reconhecido com as configurações padrão. Em outros casos, é necessário especificar determinados parâmetros. Esses parâmetros são definidos por meio do subobjeto BarcodeParams do objeto PageAnalysisParams.
Códigos de barras dos tipos Code 39, Interleaved 2 of 5, Codabar e Matrix 2 of 5 podem incluir um dígito de verificação. Os dígitos de verificação são usados para detectar erros. O algoritmo de cálculo do dígito de verificação é especificado pela norma. Você deve definir a propriedade HasChecksum do objeto BarcodeParams como TRUE para que os códigos de barras com dígito de verificação sejam reconhecidos corretamente.
O resultado do reconhecimento não inclui o dígito de verificação do código de barras, se ele for definido pela norma.
Códigos de barras PDF417, Aztec, Data Matrix, QR Code, MaxiCode
Por padrão, o ABBYY FineReader Engine reconhece códigos de barras PDF417, Aztec, DataMatrix, QR Code, MaxiCode usando a página de código correspondente à especificação. As páginas de código são as seguintes:
para PDF417 — DOS dos Estados Unidos (437) (CP_US_MSDOS)
para Aztec, DataMatrix, QR Code, MaxiCode — ISO Latin 1 (8859-1) (CP_Latin_ISO)
Às vezes, esses códigos de barras não estão em conformidade com a especificação, ou seja, foram criados usando uma página de código diferente da definida pela especificação. Nesse caso, é necessário especificar manualmente a página de código por meio da propriedade CodePage do objeto BarcodeParams.
Os QR Codes podem ser usados para codificar uma grande quantidade de dados, combinando até 16 códigos em uma sequência no formato Structured Append. O objeto BarcodeBlock fornece acesso a informações específicas da sequência Structured Append por meio das propriedades QrCodeSequenceId, QrCodeSequenceCount e QrCodeSequenceIndex, e você pode usá-lo no seu programa para reunir os códigos reconhecidos.
Os códigos de barras PDF417, Aztec, DataMatrix e QR Code podem codificar tanto texto quanto dados binários. O ABBYY FineReader Engine representa todos os dados de códigos de barras reconhecidos, incluindo os dados binários, como texto. A forma de representação dos dados binários como texto depende do valor da propriedade ContainsBinaryData do objeto BarcodeParams:
Os dados binários, assim como os dados de texto, são representados como uma string Unicode (IBarcodeBlock::Text).
Os dados são convertidos em uma string Unicode usando a página de código especificada na propriedade IBarcodeParams::CodePage. Para obter os dados binários a partir da string Unicode, decodifique a string usando a página de código correspondente.
O zero binário não pode ser convertido corretamente em uma string Unicode. O caractere correspondente na string será o símbolo de “caractere não reconhecido” (”^”) e terá a propriedade IBarcodeSymbol::IsBinaryZero definida como TRUE.
Os dados binários, assim como os dados de texto, são representados como uma string Unicode (IBarcodeBlock::Text).
Os dados binários são salvos na string Unicode como uma sequência de valores hexadecimais correspondente aos bytes. Por exemplo, a string “00FF02” será usada para os 3 bytes a seguir: 0x00, 0xFF, 0x02.
Para reconhecer códigos de barras que não estejam de acordo com a especificação ou códigos de barras com dígitos de verificação, faça o seguinte (presumimos que o perfil predefinido BarcodeRecognition_Accuracy ou BarcodeRecognition_Speed já tenha sido carregado):
Altere os valores padrão das propriedades necessárias do subobjeto BarcodeParams (DocumentProcessingParams contém a propriedade PageProcessingParams, que contém PageAnalysisParams, que por sua vez inclui BarcodeParams).
Passe o objeto DocumentProcessingParams para o método Process do objeto FRDocument como parâmetro de entrada.
Se você estiver usando outros métodos de processamento, eles poderão exigir um objeto PageAnalysisParams ou um objeto PageProcessingParams como parâmetro de entrada. Siga o mesmo procedimento, alterando os valores do subobjeto BarcodeParams em um desses objetos.
// Supomos que o Engine já tenha sido carregado// e que o documento tenha sido abertoIEngine* Engine;IFRDocument* frDocument;HRESULT res; // use esta variável para verificar se a chamada do método foi bem-sucedida...// Criar um objeto DocumentProcessingParamsIDocumentProcessingParams* 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 os parâmetros necessáriosres = barcodeParams->set_Type( BT_Code39 );// Reconhecer códigos de barras// Supomos que o perfil predefinido BarcodeRecognition já tenha sido carregadores = frDocument->Process( params );...
Código em C++ (COM)
FREngine::IEnginePtr Engine;FREngine::IFRDocumentPtr frDocument;...// Criar um objeto DocumentProcessingParamsFREngine::IDocumentProcessingParamsPtr params = Engine->CreateDocumentProcessingParams();// Especificar os parâmetros necessáriosparams->PageProcessingParams->PageAnalysisParams->BarcodeParams->Type = FREngine::BT_Code39;// Reconhecer códigos de barras. Suponha que já tenhamos criado o objeto FRDocument e// que o perfil predefinido BarcodeRecognition já tenha sido carregadofrDocument->Process( params );...
Código em C#
FREngine.IEngine engine;FREngine.IFRDocument frDocument;...// Criar um objeto DocumentProcessingParamsFREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();// Especificar os parâmetros necessáriosdpp.PageProcessingParams.PageAnalysisParams.BarcodeParams.Type = (int)FREngine.BarcodeTypeEnum.BT_Code39;// Reconhecer códigos de barras. Suponha que já tenhamos criado o objeto FRDocument e// que o perfil predefinido BarcodeRecognition já tenha sido carregadofrDocument.Process( dpp );
A qualidade do reconhecimento de códigos de barras depende da qualidade de impressão do código e das configurações usadas no processo de digitalização do documento. Para que os códigos de barras sejam reconhecidos corretamente, siga estas recomendações:
Um código de barras deve estar separado de outros textos por uma faixa em branco suficientemente larga.
O tamanho do código de barras e a largura de suas barras ou pontos individuais devem atender aos seguintes requisitos:
A altura ideal do código de barras é superior a 10 milímetros. O tamanho do código de barras deve ser menor que A4.
A altura do código de barras deve ser maior que o dobro da altura de uma linha de texto.
Para códigos de barras não quadrados, o comprimento deve ser maior que a altura.
Para códigos de barras 1D, a largura da barra mais fina deve ser de pelo menos 3 a 5 pixels na imagem.
Para códigos de barras 2D, as dimensões das células devem ser de pelo menos 2x2 pixels; o tamanho recomendado é de 4x4 pixels ou mais. Além disso, para todos os códigos de barras 2D, exceto PDF417, as células devem ser quadradas, pois, se o código de barras 2D estiver esticado, muito provavelmente será reconhecido incorretamente.
Não recomendamos compactar imagens de códigos de barras com compressão JPEG, pois isso deixa as bordas do código de barras difusas.
Não recomendamos inclinar códigos de barras, ou seja, o ângulo do código de barras deve ser um múltiplo de 90 graus em relação ao eixo horizontal.
O modo de digitalização em escala de cinza é o melhor para fins de OCR (Optical Character Recognition). Ao digitalizar em preto e branco, ajuste a configuração de brilho. Se o código de barras estiver “quebrado” ou muito claro, diminua o brilho para escurecer a imagem. Se o código de barras estiver distorcido ou com partes unidas, aumente o brilho para clarear a imagem.
Evite imprimir códigos de barras dentro de molduras.
Evite imprimir códigos de barras sobre texto ou imagens.
Na prática, códigos de barras que não atendem a essas recomendações ainda podem ser reconhecidos; no entanto, a qualidade do reconhecimento pode ser baixa.