OCR Fotos: QR VeriFactu, TicketBAI y SEVeM
Este ejemplo de código demuestra cómo utilizar el IronTesseract motor OCR para extraer texto y analizar regiones específicas de una foto. En España, esta capacidad tiene aplicaciones regulatorias de primer orden: desde la lectura de códigos QR impresos en facturas VeriFactu verificables por la AEAT, hasta el escaneo de códigos DataMatrix en medicamentos para el sistema SEVeM de la AEMPS, pasando por la lectura de tiques TicketBAI con códigos QR en el País Vasco.
Aplicaciones regulatorias en España
La fotografía y la cámara son el vector de entrada de datos más extendido en entornos móviles y de punto de venta. En España, tres marcos regulatorios convierten la lectura de fotos con OCR en un requisito de cumplimiento para sectores clave.
VeriFactu y el QR de la AEAT. El Real Decreto 1007/2023 establece que los sistemas de facturación homologados bajo VERI*FACTU deben imprimir en cada factura física un código QR que apunte a sede.agenciatributaria.gob.es. Este código permite la verificación inmediata de la factura por parte del receptor o de un inspector de la AEAT. Las aplicaciones de gestión de gastos que permiten a los empleados fotografiar facturas con el móvil necesitan un motor OCR capaz de detectar y leer este código QR con precisión, incluso en condiciones de iluminación variable o perspectiva oblicua.
TicketBAI y los tiques del País Vasco. El sistema TicketBAI, obligatorio en Bizkaia, Gipuzkoa y Araba, exige que cada tique de venta lleve impreso un código QR firmado digitalmente que identifica al emisor, el número de serie del tique y la huella de integridad. Los sistemas de punto de venta y auditoría que operan en el País Vasco deben ser capaces de leer estos códigos QR desde fotografías tomadas en entornos de tienda, con frecuencia bajo iluminación artificial. La AEPD requiere además que cualquier dato personal contenido en estos tiques se trate con las garantías de la LOPDGDD.
SEVeM y medicamentos en farmacias. El Sistema de Verificación de Medicamentos (SEVeM), supervisado por la AEMPS (Agencia Española de Medicamentos y Productos Sanitarios) y alineado con la Directiva Europea de Medicamentos Falsificados, obliga a que cada envase de medicamento de prescripción lleve un código DataMatrix único. Las farmacias y los distribuidores deben verificar estos códigos antes de la dispensación. IronOCR puede integrarse en aplicaciones móviles de verificación que lean el código DataMatrix desde la cámara del dispositivo, devolviendo el número de serie, el lote y la fecha de caducidad para su contraste con la base de datos de la AEMPS.
Documentos con firma eIDAS y certificados FNMT. En entornos donde se fotografían documentos firmados electrónicamente (contratos, escrituras, certificados de la FNMT), IronOCR puede extraer el texto de las regiones relevantes del documento junto con las coordenadas exactas de cada bloque de texto, facilitando la validación automática de la estructura documental antes del proceso de firma o archivo.
Ejemplo práctico
Escenario: Una empresa española implanta una aplicación móvil para que sus empleados fotografíen las facturas de gastos de viaje. Muchas de estas facturas son tiques impresos por terminales de punto de venta que incluyen el código QR obligatorio de VERI*FACTU apuntando a sede.agenciatributaria.gob.es. La aplicación debe extraer el texto del tique y las coordenadas del bloque QR para validar la factura ante la AEAT de forma automática.
using IronOcr;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.SpanishBest;
// Configuración para fotos tomadas con cámara móvil (resolución variable)
ocr.Configuration.ReadBarCodes = true; // Detectar también códigos QR VeriFactu
using var input = new OcrInput();
// Cargar la foto del tique VeriFactu tomada con el móvil
input.LoadImage("foto_tique_verifactu_aeat.jpg");
OcrResult result = ocr.Read(input);
// Analizar regiones de texto reconocidas
if (result.Paragraphs.Length > 0)
{
var primerBloque = result.Paragraphs[0];
string salida = $"Número de marco: {primerBloque.FrameIndex}\n" +
$"Texto extraído: {primerBloque.Text}\n" +
$"Región (X, Y, Ancho, Alto): " +
$"({primerBloque.X}, {primerBloque.Y}, " +
$"{primerBloque.Width}, {primerBloque.Height})\n" +
$"Puntuación de confianza: {result.Confidence:P1}\n" +
$"Texto completo OCR:\n{result.Text}";
Console.WriteLine(salida);
}
// Los códigos QR VeriFactu detectados están disponibles en result.Barcodes
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"QR VeriFactu detectado: {barcode.Value}");
// Verificar en: sede.agenciatributaria.gob.es
}
using IronOcr;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.SpanishBest;
// Configuración para fotos tomadas con cámara móvil (resolución variable)
ocr.Configuration.ReadBarCodes = true; // Detectar también códigos QR VeriFactu
using var input = new OcrInput();
// Cargar la foto del tique VeriFactu tomada con el móvil
input.LoadImage("foto_tique_verifactu_aeat.jpg");
OcrResult result = ocr.Read(input);
// Analizar regiones de texto reconocidas
if (result.Paragraphs.Length > 0)
{
var primerBloque = result.Paragraphs[0];
string salida = $"Número de marco: {primerBloque.FrameIndex}\n" +
$"Texto extraído: {primerBloque.Text}\n" +
$"Región (X, Y, Ancho, Alto): " +
$"({primerBloque.X}, {primerBloque.Y}, " +
$"{primerBloque.Width}, {primerBloque.Height})\n" +
$"Puntuación de confianza: {result.Confidence:P1}\n" +
$"Texto completo OCR:\n{result.Text}";
Console.WriteLine(salida);
}
// Los códigos QR VeriFactu detectados están disponibles en result.Barcodes
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"QR VeriFactu detectado: {barcode.Value}");
// Verificar en: sede.agenciatributaria.gob.es
}
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.SpanishBest
' Configuración para fotos tomadas con cámara móvil (resolución variable)
ocr.Configuration.ReadBarCodes = True ' Detectar también códigos QR VeriFactu
Using input As New OcrInput()
' Cargar la foto del tique VeriFactu tomada con el móvil
input.LoadImage("foto_tique_verifactu_aeat.jpg")
Dim result As OcrResult = ocr.Read(input)
' Analizar regiones de texto reconocidas
If result.Paragraphs.Length > 0 Then
Dim primerBloque = result.Paragraphs(0)
Dim salida As String = $"Número de marco: {primerBloque.FrameIndex}" & vbCrLf &
$"Texto extraído: {primerBloque.Text}" & vbCrLf &
$"Región (X, Y, Ancho, Alto): " &
$"({primerBloque.X}, {primerBloque.Y}, " &
$"{primerBloque.Width}, {primerBloque.Height})" & vbCrLf &
$"Puntuación de confianza: {result.Confidence:P1}" & vbCrLf &
$"Texto completo OCR:" & vbCrLf & $"{result.Text}"
Console.WriteLine(salida)
End If
' Los códigos QR VeriFactu detectados están disponibles en result.Barcodes
For Each barcode In result.Barcodes
Console.WriteLine($"QR VeriFactu detectado: {barcode.Value}")
' Verificar en: sede.agenciatributaria.gob.es
Next
End Using
Este flujo permite extraer el texto del tique (importe, NIF del emisor, fecha) y el contenido del código QR VeriFactu en una sola pasada, facilitando la integración con los sistemas de reporte de la AEAT y el cumplimiento de la LOPDGDD en el tratamiento de datos de empleados.
Conclusión
La lectura de fotos con IronOCR va mucho más allá de la extracción de texto genérico: en España es la base técnica para el cumplimiento de VERI*FACTU (AEAT), TicketBAI (Haciendas Forales de Bizkaia, Gipuzkoa y Araba) y SEVeM (AEMPS). La combinación de OCR de alta precisión con detección de códigos QR y DataMatrix en una sola biblioteca permite a los equipos de desarrollo construir aplicaciones de gestión documental plenamente conformes con la normativa española vigente. Si su organización necesita automatizar la captura y validación de facturas físicas o tiques de venta bajo cualquiera de estos marcos regulatorios, IronOCR proporciona la solución técnica adecuada.
Explore nuestra guía para leer fotografías con IronOCR en C#.

