Normas para el QR-Code

postinelli
Posts: 128
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: Normas para el QR-Code

Post by postinelli »

Hola Cesar

yo uso H 3.2.0dev (r1703231115)
fwh17.07
bcc 7.0

pero no creo que esté por ahi el problema

ni por que debes hacer bmp en lugar de jpg

subite la imagen de qr que te genera a ver si lo puedo leer o ver el problema
o bien el código que usaste

viste que hay veces que pones una coma o punto de mas que escapa a la vista y es el problema
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Normas para el QR-Code

Post by cmsoft »

Pablo:
El jpg me lo genera con el codigo negro.
Ahí hago zoom en el preview y me lo lee (con el bmp)
El tema es que tambien tengo programas que imprimen en comanderas termicas, y ahi me parece que la calidad con la que imprime es mala, por eso no me lo lee
postinelli
Posts: 128
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: Normas para el QR-Code

Post by postinelli »

ah ah
aclaro
yo sólo programo para mis actividades comerciales, no soy profesional, de hecho soy autodidacta pero ahi vamos
con lo cual, te imaginaras mis limitaciones

las facturas las genero via webserver de afip y las guardo como pdf y envío x email a los clientes, siempre en formato A4
en estos dias les saque el codigo de barras y puse el qr asi como te mostré

tambien uso ticketera para imprimir no fiscal, pero jamás pude imprimir imagenes ( uso epson tm 88 )
logro imprimir texto, codigo de barras y el corte automatico de papel

dicho esto
si sos tan amable te pido me muestres como imprimis imagenes en ticketeras

saludos
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Normas para el QR-Code

Post by cmsoft »

Excelente Pablo!

La imprimo de igual manera que en la impresora laser.
(La impresora de ticket tiene que estar instalada en windows)

Code: Select all

*********** Impresion ticket           
           DEFINE FONT oFont   NAME "COURIER NEW"       SIZE -config:fon,config:fon*2.5
           DEFINE FONT oFont3  NAME "COURIER NEW"       SIZE -config:fon,config:fon*2.5 BOLD
           PRINT oPrn TO  ALLTRIM(oQryComand:name) //Imprime por comandera
              PAGE                                  
                 @ 0,1 PRINT TO oPrn IMAGE "logo.jpg" SIZE 3, 1.5 CM  STRETCH
                 @ 0, .1 PRINT TO oPrn TEXT ALLTRIM(oApp:nomb_emp) ;
                              SIZE 5,1 CM FONT oFont ALIGN "C" LASTROW nRow
                 @ nRow, .1 PRINT TO oPrn TEXT ALLTRIM(oApp:dire_emp) ;
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"    
                 @ nRow, .1 PRINT TO oPrn TEXT ALLTRIM(aiva[oApp:tipo_iva]) ;
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"

                 @ nRow, .1 PRINT TO oPrn TEXT "CUIT:"+oApp:cuit_emp ;
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"
                 @ nRow, .1 PRINT TO oPrn TEXT "Ing.br:"+ALLTRIM(oApp:ingb_emp);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"
                 @ nRow, .1 PRINT TO oPrn TEXT "Inic.Act.:"+DTOC(oApp:inac_emp);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"
                              
                 @ nRow, .1 PRINT TO oPrn TEXT IF(cTipoDoc="NC","NOTA DE CREDITO ","TICKET ") + LEFT(cNumComp,1) ;
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"
                 @ nRow, .1 PRINT TO oPrn TEXT "Cod:" + oQryVen1:tipfor+" Nro:"+RIGHT(cNumcomp,13) ;
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"                 
                 @ nRow, .1 PRINT TO oPrn TEXT "Fecha Emision:" + +DTOC(oQryVen1:fecha);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"                                                  
                 IF oQryVen1:coniva = 5
                    @ nRow, .1 PRINT TO oPrn TEXT "A Consumidor Final";
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "C"
                    ELSE 
                    @ nRow, .1 PRINT TO oPrn TEXT ALLTRIM(oQryVen1:nombre);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                    @ nRow, .1 PRINT TO oPrn TEXT oQryVen1:cuit;
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                    @ nRow, .1 PRINT TO oPrn TEXT aIva[oQryVen1:coniva];
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                    @ nRow, .1 PRINT TO oPrn TEXT ALLTRIM(oQryVen1:direccion) + " " + ;
                                                       ALLTRIM(oQryVen1:localidad);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                 ENDIF 
                 @ nRow, 00 PRINT TO oPrn TEXT "Descripcion";
                              SIZE 2.5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                 @ nRow, 2.7 PRINT TO oPrn TEXT "Cant";
                              SIZE .9,.5 CM FONT oFont LASTROW nRow ALIGN "R"
                 @ nRow, 3.7 PRINT TO oPrn TEXT "Total";
                              SIZE 1,.5 CM FONT oFont LASTROW nRow ALIGN "R"
                                  oQryDet1:GoTop()                 
                     FOR i = 1 TO oQryDet1:nRecCount           
                         nRow1 := nRow
                         @ nRow1, 00 PRINT TO oPrn TEXT ALLTRIM(oQryDet1:detart);
                              SIZE 2.5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                         @ nRow1, 2.7 PRINT TO oPrn TEXT STR(oQryDet1:cantidad,06);
                              SIZE 0.9,.5 CM FONT oFont LASTROW nRow ALIGN "R"
                         @ nRow1, 3.7 PRINT TO oPrn TEXT IF(LEFT(cNumComp,1) <> "A",;
                                                     STR((oQryDet1:neton*1.21),9,2),;
                                                     STR(oQryDet1:neton,9,2));
                              SIZE 1,.5 CM FONT oFont LASTROW nRow ALIGN "R"                     
                         nSuma := nSuma + oQryDet1:importe
                         oQryDet1:Skip()                     
                      NEXT
                  IF LEFT(cNumComp,1)<>"A"       
                     @ nRow, .1 PRINT TO oPrn TEXT "Total $ " + STR(oQryVen1:importe,10,2);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"                     
                     ELSE 
                     @ nRow, .1 PRINT TO oPrn TEXT "Subtotal $ " + STR(oQryVen1:neto,10,2);
                              SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"                     
                     oQryIvaDet:GoTop()
                     FOR i = 1 TO oQryIvaDet:nRecCount           
                         @ nRow, .1 PRINT TO oPrn TEXT "I.V.A. "+ALLTRIM(oQryIvaDet:nomiva) + " $:" +STR(oQryIvaDet:iva,10,2) ;
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"                         
                     NEXT
                     @ nRow, .1 PRINT TO oPrn TEXT "Total $:"+STR(oQryVen1:importe,10,2) ;
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"                     
                 ENDIF    
                 @ nRow, .1 PRINT TO oPrn TEXT "CAE Nro:"+oQryVen1:cae ;
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"                     
                 @ nRow, .1 PRINT TO oPrn TEXT "Fecha Vto CAE:"+DTOC(oQryVen1:fecVto);
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"

                  IF oQryPar:emite_pie
                        @ nRow, .1 PRINT TO oPrn TEXT oQryPar:texto_pie;
                          SIZE 5,.5 CM FONT oFont3 LASTROW nRow ALIGN "L"        
                  ENDIF    
                  @ nRow,.1 PRINT TO oPrn TEXT ".";
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                  @ nRow,.4 PRINT TO oPrn IMAGE "FactQR.bmp" SIZE 2.5,2.5 CM NOTRANSPARENT;
                   LASTROW nRow
                  
                  @ nRow,.1 PRINT TO oPrn TEXT "...";
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
                  @ nRow,.1 PRINT TO oPrn TEXT "...";
                          SIZE 5,.5 CM FONT oFont LASTROW nRow ALIGN "L"
              ENDPAGE
           ENDPRINT 
 
Tengo una POS58 para hacer las pruebas...
postinelli
Posts: 128
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: Normas para el QR-Code

Post by postinelli »

gracias

voy a probar

para las ticketeras uso tdosprn y manda siempre cualquiera sea la impresora instalada
manda directo a com,lpt o usb

no se si con PRINT podes enviar el corte automatico de papel
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Normas para el QR-Code

Post by cmsoft »

En algunas que he probado, el corte de papel (si la impresora tiene) lo hace al hacer endpage
jpcavagnaro
Posts: 35
Joined: Tue Oct 11, 2016 1:02 pm

Re: Normas para el QR-Code

Post by jpcavagnaro »

Hola buenas tardes, estoy viendo este tema, compilo el ejemplo y me da error StrToBase64 no existe la función.

me falta alguna librería?

Saludos
Jorge
postinelli wrote://----------------------------------------------------------------------------//

function GeneraQR()

Local cOrigen, cJason, cDestino, ElTxt

cOrigen:="https://www.afip.gob.ar/fe/qr/?p="
cJason:='{"ver":1,"fecha":"2020-10-13","cuit":30000000007,"ptoVta":10,"tipoCmp":1,"nroCmp":94,"importe":12100,"moneda":"DOL","ctz":65,"tipoDocRec":80,"nroDocRec":20000000001,"tipoCodAut":"E","codAut":70417054367476}'
cJason=StrToBase64( cJason )
cOrigen=cOrigen+cJason

//MsgAlert(cOrigen)

ElTxt:= "QrJason.txt"
Nhandle:= fcreate(ElTxt)
If (nhandle > 0)
fwrite(Nhandle, cOrigen + CRLF)
fclose(nhandle)
EndIf

cDestino:="FastQR.jpg"

QRCode(cOrigen,cDestino)

MsgInfo("Qr Generado OK")

Return NIL

//----------------------------------------------------------------------------//

DLL32 STATIC FUNCTION QRCode(cStr As STRING, cFile As STRING) AS LONG PASCAL FROM "FastQRCode" LIB "QRCodelib.Dll"
RETURN NIL
/*
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Normas para el QR-Code

Post by karinha »

João Santos - São Paulo - Brasil
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Normas para el QR-Code

Post by cmsoft »

Copiado del Foro Brasil

Code: Select all

//
FUNCTION StrToBase64( cTexte )
  //******************
// Conversion en base 64 de la chaine cTexte
// Un alphabet de 65 caractères est utilisé pour permettre la représentation de 6 bits par caractère :
// "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
// Le '=' (65e caractère) est utilisé dans le processus de codage pour les caractères finaux.
   LOCAL cTexte64 := ""
   LOCAL X
   LOCAL cHex
   DO WHILE !( cTexte == "" )
      cHex := ""
      // Le processus de codage représente des groupes de 24 bits de données en entrée par une chaîne en sortie de 4 caractères codés.
      // En procédant de gauche à droite, un groupe de 24 bits est créé en concaténant 3 octets (8 bits par octet).
      FOR X := 1 TO 3
         // Conversion de chaque caractère en chaine binaire de 8 octets
         cHex += CarToBin( LEFT( cTexte, 1 ) )
         IF LEN( cTexte ) > 1
            cTexte := SUBSTR( cTexte, 2 )
         ELSE
            cTexte := ""
            EXIT
         ENDIF
      NEXT X
      // Ces 24 bits (ici contenus dans cHex, ou au moins un multiple) sont traités comme 4 groupes concaténés de 6 bits chacun convertis
      // en un unique caractère dans l'alphabet de la base 64.
      // Chaque groupe de 6 bits est utilisé comme index dans la table des caractères de la base 64.
      // Le caractère référencé par l'index correspondant est utilisé comme codage de ce groupe de 6 bits.
      FOR X := 1 TO 4
         IF SUBSTR( cHex, ( (X - 1 ) * 6 ) + 1 ) == ""
            cTexte64 += REPLICATE( "=", 4 - X + 1 )
            EXIT
         ELSE
            // Un traitement spécial est effectué si moins de 24 bits sont disponibles à la fin des données
            // à coder. Aucun bit ne restant non-codé,
            // si moins de 24 bits sont disponibles alors des bits à zéro sont ajoutés à la droite des données
            // pour former un nombre entier de groupes de 6 bits.
            IF LEN( cHex ) % 6 > 0
               // Ajout des bits à zéro
               cHex += REPLICATE( "0", 6 - ( LEN( cHex ) % 6 ) )
            ENDIF
            cTexte64 += Carac64( "00" + SUBSTR( cHex, ( (X - 1 ) * 6 ) + 1, 6 ) )
         ENDIF
      NEXT X
   ENDDO
RETURN cTexte64


FUNCTION Carac64( cBin )
  //***************
// Renvoie le caractère correspondant en base 64
   LOCAL nPos := ASC( BinToCar( @cBin ) ) + 1
RETURN SUBSTR( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", nPos, 1 )
FUNCTION Hex64( carac64 )
  //*************
// Renvoie le caractère correspondant en base 64
   LOCAL cCodeAsc := CHR( AT( carac64, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ) - 1 )
RETURN SUBSTR( CarToBin( @cCodeAsc ) , 3, 6 )

FUNCTION CarToBin( carac, lInverse )
  //****************
// Renvoie le caractère correspondant dans une chaine binaire (composée de 0 et 1) de 8 bits
#define cHexa "0123456789ABCDEF"
#define aBin {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }
   LOCAL cToHex
   IF EMPTY( lInverse )
      // Retourne la chaine binaire en ayant reçu le caractère ASCII
      cToHex := str2Hex( carac )
      RETURN aBin[ AT( LEFT(cToHex,1), cHexa ) ] + aBin[ AT( SUBSTR(cToHex,2), cHexa ) ]
   ELSE
      // Retourne le caractère ASCII en ayant reçu la chaine binaire
      cToHex := SUBSTR( cHexa, ASCAN( aBin, LEFT(carac,4 ) ), 1 ) + SUBSTR( cHexa, ASCAN( aBin, SUBSTR(carac,5,4 ) ), 1 )
      RETURN Hex2str( cToHex )
   ENDIF
RETURN NIL

FUNCTION BinToCar( cBin )
  //****************
RETURN CarToBin( @cBin, .T. )
 
jpcavagnaro
Posts: 35
Joined: Tue Oct 11, 2016 1:02 pm

Re: Normas para el QR-Code

Post by jpcavagnaro »

Hola, logre generar el código e imprimirlo perfecto.

Quise validarlo, saben si funciona la página que recibirá estos códigos.

Saludos.
Jorge
postinelli
Posts: 128
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: Normas para el QR-Code

Post by postinelli »

Estimado

la pagina de afip aun está a prueba, no valida una factura en si, solo te lleva a la pagina informativa de codigos qr de afip
siempre te lleva a https://www.afip.gob.ar/fe/qr/conceptos-generales.asp

yo lo que hice fue generar un txt con el link completo
lo abro con el block de notas y copio el json y lo decodifico en https://www.base64decode.org/

ahi vas a ver si el link generado es correcto comparandolo con la informacion que da la afip para este tema

es todo bastante simple
jpcavagnaro
Posts: 35
Joined: Tue Oct 11, 2016 1:02 pm

Re: Normas para el QR-Code

Post by jpcavagnaro »

Joya, ahí lo probé, quedo perfecto.

Muchas gracias
Saludos
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Normas para el QR-Code

Post by karinha »

Excelente.

Saludos.
João Santos - São Paulo - Brasil
Post Reply