Estoy preparando una aplicación (en Delphi 7) para leer los comprobantes, revisar su vigencia y registrarlos en nuestra BD.
Hasta ahora todo bien, excepto con unos casos donde el comprobante esta codificado de manera diferente a utf-8 (con y sin bom).
Estos vienen codificados como UCS2-L (al menos hasta ahora) creo que estos son Unicode.
Entonces, con este código he logrado identificar los utf-8 que si puedo cargar y procesar.
Código: Seleccionar todo
function UTF8Comprueba (FileName : string): boolean;
var
Stream: TFileStream;
bom : array[0..3] of byte;
flagTest : boolean;
begin
flagTest:= False;
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
Stream.ReadBuffer(bom, SizeOf(bom)); //rGet the byte-order mark, if there is one
if ((bom[0] = $ef) and (bom[1] = $bb) and (bom[2] = $bf))
or ((bom[0] = $3c) and (bom[1] = $3f) and (bom[2] = $78)) //3C 3F 78 6D
or ((bom[0] = $3c) and (bom[1] = $63) and (bom[2] = $66)) //60 99 102 100 utf-8 w/o BOM
then flagTest:= True; // utf-8
finally
Stream.Free;
end;
Result:= flagTest;
end;
Código: Seleccionar todo
function LeerDatosCFD (sFileName : string; var vData: TdataCFD) : boolean;
var flag: boolean;
temp : TStringList;
XMLDoc1, TimbreXMLDoc : IXMLDocument; //TXMLDocument;
CFD32 : cfdv32.IXMLComprobante;
CFD3 : cfdv2030.IXMLComprobante;
CFD2 : cfdv2030.IXMLComprobante;
TimbreDatos : TimbreFiscalDigital.IXMLTimbreFiscalDigital;
AttrNode : IXMLNode;
begin
flag:= False;
with vData do begin
version := ''; Emisor := ''; Receptor := ''; Fecha := ''; FechaTimbrado:= '';
UUID := ''; Serie := ''; Folio := ''; Total := ''; TotalImpuestosRetenidos := '';
TotalImpuestosTrasladados := ''; Moneda:= ''; TipoCambio := '';
end;
if UTF8Comprueba(sFileName) then
begin
try
temp:= TStringList.Create;
temp.LoadFromFile(sFileName);
XMLDoc1:= NewXMLDocument;
TimbreXMLDoc:= NewXMLDocument;
XMLDoc1.LoadFromFile(sFileName); // este carga los comprobantes correctos UTF-8 y truena con los unicode
if pos('version="3.2"', temp.Text) > 0 then
begin
XMLDoc1.Active := true;
CFD32 := cfdv32.GetComprobante(XMLDoc1);
// obtener complemento...
AttrNode:= CFD32.Complemento.ChildNodes.FindNode('TimbreFiscalDigital', CFD32.Complemento.FindNamespaceURI('tfd'));
TimbreXMLDoc.XML.Text:= UTF8Encode(AttrNode.XML);
TimbreXMLDoc.Active := true;
TimbreDatos := GetTimbreFiscalDigital(TimbreXMLDoc);
with vData do begin
version := CFD32.version; Emisor := CFD32.Emisor.Rfc; Receptor := CFD32.Receptor.Rfc;
Fecha := CFD32.Fecha; UUID := TimbreDatos.UUID; FechaTimbrado := TimbreDatos.FechaTimbrado;
Serie := CFD32.Serie; Folio := CFD32.Folio;
Total := CFD32.Total; Moneda:= CFD32.Moneda; TipoCambio:= CFD32.TipoCambio;
TotalImpuestosRetenidos := CFD32.Impuestos.TotalImpuestosRetenidos;
TotalImpuestosTrasladados := CFD32.Impuestos.TotalImpuestosTrasladados;
end;
flag:= True;
end //3.2
else
if pos('version="3.0"', temp.Text) > 0 then
begin
//... blah blah
flag:= True;
end //3.0
else
if pos('version="2.0"', temp.Text) > 0 then
begin
XMLDoc1.Active:= true;
CFD2 := cfdv2030.GetComprobante(XMLDoc1);
with vData do begin
version := CFD2.version; Emisor := CFD2.Emisor.Rfc; Receptor := CFD2.Receptor.Rfc;
Fecha := CFD2.Fecha; UUID := ''; // no, aqui no hay
Serie := CFD2.Serie; Folio := CFD2.Folio; Total := CFD2.Total;
TotalImpuestosRetenidos := CFD2.Impuestos.TotalImpuestosRetenidos;
TotalImpuestosTrasladados := CFD2.Impuestos.TotalImpuestosTrasladados;
end;
flag:= True;
end; // 2.0
finally
temp.Free;
end;
end;
Result:= flag;
end;
¿Alguien que puede compartir algún tip-truco-código en Delphi7 para leer estos archivos? para así obtener los datos del comprobante.
Hasta ahora, los tengo que abrir en notepad++ y convertir a utf8... algo bastante "problematico" para los usuarios.
Saludos y gracias de antemano.