miércoles, 12 de noviembre de 2014

Detectar QR en documento PDF con C# para enviar a MS Access con SQL Server

Escenario
  • Existen documentos en formato PDF que tienen códigos QR
  • Necesitamos detectar el código QR en esos documentos
  • Mover los archivos PDF a otras carpetas
  • Actualizar datos en un SQL Server que luego será consultado vía MS Access


Enfoque de la solución

Crearemos un programa en .Net que efectúe dos tareas principales:
  • Convertir el PDF a PNG
  • Detectar el QR dentro del PNG
Para ello trabajamos con dos librerías

Ejemplo de Código

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ZXing;
using GhostscriptSharp;
using GhostscriptSharp.Settings;

namespace PRUEBA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            button1.Enabled = false;

            // Obtener la imagen de la primera página del PDF

            GhostscriptWrapper.GenerateOutput("documento.pdf", "documento.png",
               new GhostscriptSettings
               {
                   Device = GhostscriptDevices.pngalpha,
                   Page = new GhostscriptPages
                   {
                       Start = 1,
                       End = 1,
                       AllPages = false
                   },
                   Resolution = new Size
                   {
                       Height = 72,
                       Width = 72
                   },
                   Size = new GhostscriptPageSize
                   {
                       Native = GhostscriptPageSizes.letter
                   }
               }
           );

            // Detectar el QR en el PDF

            IBarcodeReader reader = new BarcodeReader();
            var barcodeBitmap = (Bitmap)Bitmap.FromFile("documento.png");
            var result = reader.Decode(barcodeBitmap);
            if (result != null)
            {
                //label1.Text = result.BarcodeFormat.ToString();
                label1.Text = result.Text;
            }

            button1.Enabled = true;

        
        }
    }
}

Nota: si tienen problemas para capturar los códigos, pueden variar la resolución, por ejemplo:

 Resolution = new Size
                   {
                       Height = 300,
                       Width = 300
                   },


El resultado

Creamos un documento de ejemplo en PDF como este:


Ejecutamos la aplicación


Y obtenemos el resultado


En el camino, el programa debió  haber generado un "documento.png"


Links de interés

1 comentario:

  1. Gracias por compartir, estuve peleando casi 1 semana con diferentes paquetes, pero ninguno funcionó tal cual necesitaba, excepto este.

    ResponderEliminar