Biblioteca COM para manejo de e-CF DGII • Resúmenes • Envíos • QR Oficial
Desarrollada por: Natanael Sanchez M.
ECFDllVB6 es una biblioteca COM desarrollada en C# (.NET Framework 4.x), diseñada para ser utilizada desde Delphi, VB6, VB.NET, C++ y cualquier lenguaje compatible COM.
Permite procesar comprobantes electrónicos DGII (e-CF), generar resúmenes RFCE, enviar XML firmados y generar códigos QR oficiales.
1. Copie los archivos en una carpeta segura.
2. Abra una consola como Administrador.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "ECFDllVB6.dll" /codebase /tlb
3. Importe la Type Library en Delphi:
Component → Import Component → Import a Type Library
Generar el XML RFCE dinámico a partir de un e-CF firmado.
Guarda texto UTF-8 sin BOM.
Genera la URL oficial DGII para el QR.
Descarga y guarda el QR como imagen PNG.
Extrae los primeros 6 caracteres del SignatureValue.
Envía un XML firmado a DGII usando multipart/form-data.
unit HelloWorld;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Imaging.pngimage,
ECFDllVB6_TLB; // Librería de Facturación Electrónica
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
util : IUtilidades;
rutaXml : string;
rutaSalidaXml : string;
xmlName : string;
resultadoXml : string;
urlEnvio : string;
token : string;
resultadoEnvio : string;
codigoSeguridad : string;
qr : string;
qrPath : string;
begin
// --- Configuración de parámetros ---
token := 'token';
urlEnvio := 'https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
xmlName := '133398771E320000000875.xml';
// Definición de rutas
rutaXml := 'C:\Users\MeMeBigBoy\Desktop\' + xmlName;
rutaSalidaXml := 'C:\Users\MeMeBigBoy\Desktop\resumen\' + xmlName;
qrPath := 'C:\Users\MeMeBigBoy\Desktop\qr\' + xmlName + '.png';
// --- Ejecución de procesos con la DLL ---
util := CoUtilidades.Create;
// 1. Generar y Guardar Resumen
resultadoXml := util.GenerarResumen(rutaXml);
ShowMessage('Resumen generado: ' + resultadoXml);
util.GuardarResumen(rutaSalidaXml, resultadoXml);
ShowMessage('XML guardado correctamente en: ' + rutaSalidaXml);
// 2. Enviar XML al Web Service
resultadoEnvio := util.EnviarXml(rutaXml, urlEnvio, token);
ShowMessage('Resultado Envío: ' + resultadoEnvio);
// 3. Obtener Código de Seguridad
codigoSeguridad := util.ObtenerCodigoSeguridad(rutaXml);
ShowMessage('Código de Seguridad: ' + codigoSeguridad);
// 4. Manejo de QR
qr := util.GenerarQr(rutaXml);
util.GenerarQRImagen(qr, qrPath);
// Cargar imagen en el formulario
Image1.Picture.LoadFromFile(qrPath);
Edit1.Text := qr;
end;
end.
' Ejemplo de uso en VB6
Option Explicit
Private Sub Command1_Click()
' Declaración de variables (utilizando el objeto de la DLL)
Dim util As ECFDllVB6.Utilidades
Dim rutaXml As String
Dim rutaSalidaXml As String
Dim xmlName As String
Dim resultadoXml As String
Dim urlEnvio As String
Dim token As String
Dim resultadoEnvio As String
Dim codigoSeguridad As String
Dim qr As String
Dim qrPath As String
On Error GoTo ErrorHandler
' --- Configuración de parámetros ---
token = "token"
urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
xmlName = "133398771E320000000875.xml"
' Definición de rutas (ajusta según tu entorno)
rutaXml = "C:\Users\MeMeBigBoy\Desktop\" & xmlName
rutaSalidaXml = "C:\Users\MeMeBigBoy\Desktop\resumen\" & xmlName
qrPath = "C:\Users\MeMeBigBoy\Desktop\qr\" & xmlName & ".png"
' --- Inicialización del objeto COM ---
Set util = New ECFDllVB6.Utilidades
' 1. Generar y Guardar Resumen
resultadoXml = util.GenerarResumen(rutaXml)
MsgBox "Resumen generado: " & resultadoXml, vbInformation
util.GuardarResumen rutaSalidaXml, resultadoXml
MsgBox "XML guardado correctamente en: " & rutaSalidaXml, vbInformation
' 2. Enviar XML al Web Service
resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token)
MsgBox "Resultado Envío: " & resultadoEnvio, vbInformation
' 3. Obtener Código de Seguridad
codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml)
MsgBox "Código de Seguridad: " & codigoSeguridad, vbInformation
' 4. Manejo de QR
qr = util.GenerarQr(rutaXml)
util.GenerarQRImagen qr, qrPath
' Mostrar en los controles del formulario
' Nota: VB6 nativo no soporta PNG en el control Image estándar sin ayuda de GDI+
' pero si la DLL genera el archivo, intentamos cargarlo:
On Error Resume Next
Set Image1.Picture = LoadPicture(qrPath)
On Error GoTo ErrorHandler
Text1.Text = qr
' Limpieza
Set util = Nothing
Exit Sub
ErrorHandler:
MsgBox "Error: " & Err.Description, vbCritical, "Error de Ejecución"
Set util = Nothing
End Sub
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
// Asegúrate de agregar la referencia COM para que este namespace esté disponible
using ECFDllVB6;
namespace ProyectoFacturacion
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnProcesar_Click(object sender, EventArgs e)
{
// Declaración de variables
// En C#, la interfaz IUtilidades suele ser expuesta por la clase Utilidades
Utilidades util;
string rutaXml;
string rutaSalidaXml;
string xmlName;
string resultadoXml;
string urlEnvio;
string token;
string resultadoEnvio;
string codigoSeguridad;
string qr;
string qrPath;
try
{
// --- Configuración de parámetros ---
token = "token";
urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
xmlName = "133398771E320000000875.xml";
// Definición de rutas (Usando @ para ignorar caracteres de escape)
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
rutaXml = Path.Combine(desktopPath, xmlName);
rutaSalidaXml = Path.Combine(desktopPath, "resumen", xmlName);
qrPath = Path.Combine(desktopPath, "qr", xmlName + ".png");
// --- Ejecución de procesos con la DLL ---
util = new Utilidades();
// 1. Generar y Guardar Resumen
resultadoXml = util.GenerarResumen(rutaXml);
MessageBox.Show("Resumen generado: " + resultadoXml, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
util.GuardarResumen(rutaSalidaXml, resultadoXml);
MessageBox.Show("XML guardado correctamente en: " + rutaSalidaXml);
// 2. Enviar XML al Web Service
resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token);
MessageBox.Show("Resultado Envío: " + resultadoEnvio);
// 3. Obtener Código de Seguridad
codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml);
MessageBox.Show("Código de Seguridad: " + codigoSeguridad);
// 4. Manejo de QR
qr = util.GenerarQr(rutaXml);
util.GenerarQRImagen(qr, qrPath);
// Cargar imagen en el PictureBox (Equivalente a TImage)
if (File.Exists(qrPath))
{
pictureBox1.Image = Image.FromFile(qrPath);
}
// Mostrar texto del QR en un TextBox (Equivalente a TEdit)
txtQr.Text = qr;
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message, "Error de ejecución", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
using System;
using System.IO;
// Asegúrate de haber agregado la referencia COM a ECFDllVB6
using ECFDllVB6;
namespace FacturacionConsola
{
class Program
{
static void Main(string[] args)
{
// --- Declaración de variables ---
Utilidades util;
string rutaXml;
string rutaSalidaXml;
string xmlName;
string resultadoXml;
string urlEnvio;
string token;
string resultadoEnvio;
string codigoSeguridad;
string qr;
string qrPath;
Console.WriteLine("========================================");
Console.WriteLine(" PROCESAMIENTO DE E-CF (CONSOLA) ");
Console.WriteLine("========================================\n");
try
{
// --- Configuración de parámetros ---
token = "token";
urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
xmlName = "133398771E320000000875.xml";
// Definición de rutas dinámicas al Escritorio
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
rutaXml = Path.Combine(desktopPath, xmlName);
rutaSalidaXml = Path.Combine(desktopPath, "resumen", xmlName);
qrPath = Path.Combine(desktopPath, "qr", xmlName + ".png");
// --- Inicialización del objeto COM ---
util = new Utilidades();
// 1. Generar Resumen
Console.WriteLine("-> Generando Resumen...");
resultadoXml = util.GenerarResumen(rutaXml);
Console.WriteLine("Resumen generado con éxito.");
// Guardar Resumen
util.GuardarResumen(rutaSalidaXml, resultadoXml);
Console.WriteLine($"Archivo guardado en: {rutaSalidaXml}");
// 2. Enviar XML
Console.WriteLine("\n-> Enviando XML a DGII...");
resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token);
Console.WriteLine($"Resultado Envío: {resultadoEnvio}");
// 3. Obtener Código de Seguridad
codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml);
Console.WriteLine($"\n-> Código de Seguridad: {codigoSeguridad}");
// 4. Manejo de QR
Console.WriteLine("\n-> Generando QR...");
qr = util.GenerarQr(rutaXml);
util.GenerarQRImagen(qr, qrPath);
Console.WriteLine($"URL del QR: {qr}");
Console.WriteLine($"Imagen QR guardada en: {qrPath}");
Console.WriteLine("\n========================================");
Console.WriteLine(" PROCESO FINALIZADO CORRECTAMENTE ");
Console.WriteLine("========================================");
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"\n[ERROR]: {ex.Message}");
Console.ResetColor();
}
Console.WriteLine("\nPresione cualquier tecla para salir...");
Console.ReadKey();
}
}
}
using System;
using System.IO;
using ECFDllVB6;
namespace FacturacionBatch
{
class Program
{
static void Main(string[] args)
{
// Instancia de la DLL
Utilidades util = new Utilidades();
// --- Configuración de Parámetros ---
string token = "token";
string urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// Rutas principales
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string carpetaEntrada = Path.Combine(desktopPath, "Facturas_Para_Procesar");
string carpetaResumen = Path.Combine(desktopPath, "resumen");
string carpetaQR = Path.Combine(desktopPath, "qr");
// Crear carpetas si no existen
Directory.CreateDirectory(carpetaEntrada);
Directory.CreateDirectory(carpetaResumen);
Directory.CreateDirectory(carpetaQR);
Console.WriteLine("========================================");
Console.WriteLine(" BATCH PROCESSOR - e-CF DGII");
Console.WriteLine("========================================\n");
Console.WriteLine($"Buscando XMLs en: {carpetaEntrada}\n");
// Obtener todos los archivos XML de la carpeta de entrada
string[] archivos = Directory.GetFiles(carpetaEntrada, "*.xml");
if (archivos.Length == 0)
{
Console.WriteLine("No se encontraron archivos XML para procesar.");
}
else
{
foreach (string rutaXml in archivos)
{
string nombreArchivo = Path.GetFileName(rutaXml);
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine($"--- Procesando: {nombreArchivo} ---");
Console.ResetColor();
try
{
// 1. Generar y Guardar Resumen
string resultadoXml = util.GenerarResumen(rutaXml);
string rutaSalidaXml = Path.Combine(carpetaResumen, nombreArchivo);
util.GuardarResumen(rutaSalidaXml, resultadoXml);
Console.WriteLine("[OK] Resumen generado y guardado.");
// 2. Enviar XML
string resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token);
Console.WriteLine($"[OK] Envío DGII: {resultadoEnvio}");
// 3. Obtener Código de Seguridad
string codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml);
Console.WriteLine($"[OK] Código Seguridad: {codigoSeguridad}");
// 4. Generar Imagen QR
string qrUrl = util.GenerarQr(rutaXml);
string rutaImagenQr = Path.Combine(carpetaQR, nombreArchivo + ".png");
util.GenerarQRImagen(qrUrl, rutaImagenQr);
Console.WriteLine("[OK] Imagen QR generada.");
Console.WriteLine("----------------------------------------\n");
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"[ERROR] en {nombreArchivo}: {ex.Message}");
Console.ResetColor();
}
}
}
Console.WriteLine("========================================");
Console.WriteLine(" PROCESAMIENTO FINALIZADO");
Console.WriteLine("========================================");
Console.WriteLine("Presione cualquier tecla para salir...");
Console.ReadKey();
}
}
}