Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll

  • 38 odgovora
  • 17.454 pregleda
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 05.10.2010. u 07:54 · pre 195 meseci #22
Citat:
savkic: > EidStartup(1);
> EidCleanup

Ti pozivaš svaki put, oni se moraju pozvati samo jednom, najbolje na početku rada programa i na kraju. Takođe pre poziva funkcije resetuj record npr:
FillChar(PodaciOLK, SizeOf(PodaciOLK), 0);

Što se tiče pozivanja EidStartup i Cleanup si u pravu, kod koji sam napisao je samo radi probe, u realnom projektu svakako treba da se poziva samo jednom.
Citat:
savkic: > Mislim da je problem u onom CELIK-API-ju,
BTW, postoji novija verzija dlla, svakako probaj sa njom.

Koliko vidim poslednja verzija dll-a je 1.0.1.0, bar je ta okačena na sajtu MUP-a.

Citat:
savkic: > tamo su uglavnom svi elementi recorda tipa Char,

Kakve to ima veze?

> samim tim ni dobijeni stringovi nisu ispravni, pa naknadna konverzija sa Utf8Decode nema smisla.

Pošto koristim D2006 koji ne radi sa unicode-om, a na LK su podaci upisani ćirilicom, pitanje je šta se zapravo upisuje u non-unicode Char recorde (npr. NepromenljiviPodaci.surname)?
Inače u okačenom primeru se vidi da iščitavanje podataka o LK i promenljivih podataka nije problem, pošto su upisani latinicom, a greška je samo kod nepromenljivih podataka o licu koji su upisani ćirilicom.

Na kraju evo i primera sa sačuvanim ispisom podataka o LK u text fajlu.
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 05.10.2010. u 10:28 · pre 195 meseci #25
Pogrešne su dužine te koje su ispisane:
NepromenljiviPodaci.personalNumberSize: dužine 0
NepromenljiviPodaci.surnameSize: dužine 0
NepromenljiviPodaci.givenNameSize: prevelike dužine, zbog čega je i ta greška.

Inače je do te greške u dužinama došlo kod onog automatskog prevoda:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Integer;

treba:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Char;

ili za d2010:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of AnsiChar;

Nisi probao šta kod tebe ispiše, a mogao bi da probaš sa ovom izmenom gore:
Code:

  Memo1.Lines.Add('personalNumberSize: ' + IntToStr
     (NepromenljiviPodaci.personalNumberSize));
  Memo1.Lines.Add('Prezime size: ' + IntToStr(NepromenljiviPodaci.surnameSize));
  Memo1.Lines.Add('Ime size: ' + IntToStr(NepromenljiviPodaci.givenNameSize));

To je i provera koliko su tačno preneti podaci.
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 05.10.2010. u 11:31 · pre 195 meseci #26
Citat:
tkaranovic: Pogrešne su dužine te koje su ispisane:
NepromenljiviPodaci.personalNumberSize: dužine 0
NepromenljiviPodaci.surnameSize: dužine 0
NepromenljiviPodaci.givenNameSize: prevelike dužine, zbog čega je i ta greška.

Inače je do te greške u dužinama došlo kod onog automatskog prevoda:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Integer;

treba:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Char;

Sjajno, to je bio problem, sada iščitava podatke kako treba.

Jedino preostaje problem prikaza ćiriličnog imena i prezimena (na slici).


Code (delphi):

  Memo1.Lines.Add('Prezime: ' + (NepromenljiviPodaci.surname));
  Memo1.Lines.Add('Prezime size: ' + IntToStr(NepromenljiviPodaci.surnameSize));
  Memo1.Lines.Add('Ime: ' + (NepromenljiviPodaci.givenName));
  Memo1.Lines.Add('Ime size: ' + IntToStr(NepromenljiviPodaci.givenNameSize));
 


Dužinu daje dobro (2 bajta za svako slovo), ali je ispis nečitljiv.

Ako odradim konverziju sa Utf8Decode umesto prikazanih kvakica sa slike, dobijem samo upitnike ("?????????????").
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 05.10.2010. u 17:41 · pre 195 meseci #27
Kako inače prikazuješ/koristiš ćirilicu?

Trebalo bi da imaš neko trajnije rešenje ili ako nećeš da imaš onda moraš konvertovati ćirilicu u latinicu pa tako prikazati.
Evo jednog jednostavnog rešenja za prikazati ćirilicu:
Code:

...neki klik
 var
   S: AnsiString; // UTF8String;
  function WStrToAStr(const s: WideString; const CodePage: Word = CP_ACP): AnsiString;
  var
    InputLength, OutputLength: Integer;
  begin
    InputLength := Length(s);
    OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(s), InputLength, nil, 0, nil, nil);
    SetLength(Result, OutputLength);
    WideCharToMultiByte(CodePage, 0, PWideChar(s), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
  end;
begin
  S := #209#130#208#186#208#176#209#128#208#176#208#189#208#190#208#178#208#184#209#134;
  //S je ut8 cirilicni string
  label1.Font.Charset := 204; //RUSSIAN_CHARSET iliti Cyrillic
  label1.Caption := WStrToAStr(Utf8Decode(S), 1251); //uf8->unicod->ansiCP1251  CP1251 - Cyrillic
end;

Može i da se prethodno izabere ćirlični font za label1.

Umesto S iz primera moze da bude ime ili prezime, šta je već tu ćirilično.
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 05.10.2010. u 18:06 · pre 195 meseci #28
> Koliko vidim poslednja verzija dll-a je 1.0.1.0, bar je ta okačena na sajtu MUP-a.

http://ca.mup.gov.rs/download.html.

Izmenio sam CelikApi i dodao nove funkcije.

> Pošto koristim D2006 koji ne radi sa unicode-om, a na LK su podaci upisani ćirilicom, pitanje je šta se zapravo upisuje u non-unicode Char recorde (npr. NepromenljiviPodaci.surname)?

Sadržaj u UTF8 formatu.

> Inače u okačenom primeru se vidi da iščitavanje podataka o LK i promenljivih podataka nije problem, pošto su upisani latinicom, a greška je samo kod nepromenljivih podataka
> o licu koji su upisani ćirilicom.

Da bi prikazao i latinicu i ćirilicu u kontroli moraš koristiti unicode kontrolu, dakle ili ti treba neki novi Delphi ili Tnt kontrola. Ja sam uzeo Tnt kontrolu jer će to rešenje raditi i na D7.

> Na kraju evo i primera sa sačuvanim ispisom podataka o LK u text fajlu.

To ništa ne znači, moraš snimiti raw podatke, šaljem primer.
Bilo bi dobro da neko proba i ove nove funkcije (EidReadDocumentData, PEidReadFixedPersonalDataP...).
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 06.10.2010. u 11:23 · pre 195 meseci #30
Evo zapažanja:

Delphi 2006 i TNT Unicode kontrole

NormReadDocumentData, NormReadFixedPersonalData i NormReadVariablePersonalData rade savršeno.
EidReadDocumentData, EidReadFixedPersonalData i EidReadVariablePersonalData prikazuju dobro sve osim prezimena i imena, gde se kuke i kvake i dalje prikazuju. (TntMemo)


Delphi 2010 (Trial) bez korišćenja TNT Unicode kontrola

NormReadDocumentData, NormReadFixedPersonalData i NormReadVariablePersonalData rade savršeno. (TMemo)
EidReadDocumentData, EidReadFixedPersonalData i EidReadVariablePersonalData prikazuju dobro sve osim prezimena i imena, gde se kuke i kvake i dalje prikazuju. (TMemo)

Btw, Savkiću, mislim da je
Code (delphi):

uses
  JclUnicode;
 
nepotrebno (u poslednjem CelikApiTest primeru).
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 06.10.2010. u 11:44 · pre 195 meseci #31
pozzz,

oduvek me je zanimalo da izadjem iz okvira programa informacionih sistema, odnosno da probam da software integrisem sa nekim hardwareom.

Ovo mi zvuci jako zanimljivo pre svega sa stanovista upotrebe. padaju mi razne ideje na pamet, recimo autentifikacija korisnika za koriscenje neke applikacije na osnovu LK. pa vec mora da je nosi, onda nek je i iskoristi za nesto pametno :)


Da li moze neko da mi kaze koji hardware koristite, gde moze da se nabavi, neke cene ? Iskustva ?

Hvala unapred.
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 06.10.2010. u 12:03 · pre 195 meseci #32
Pozdrav za staleks....

Ja koristim PC Twin reader, iskreno ne znam gde je kupljen ali gde god ima prodavnica racunarskih komponenti mozete kupiti i citac smart kartice.U svakom slucaju potrebno je da imas Hardver tj. Smart card reader, Driver, i celikapi.dll sa sajta MUP srbije.U Windowsu moras da pokrenes servis Smartcard i to je to.


Pozdrav naravno i vama savkic, tkaranovic ... koji ste obogatili odgovorima ovu temu
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 06.10.2010. u 15:46 · pre 195 meseci #33
> NormReadDocumentData, NormReadFixedPersonalData i NormReadVariablePersonalData rade savršeno. (TMemo)
> EidReadDocumentData, EidReadFixedPersonalData i EidReadVariablePersonalData prikazuju dobro sve osim prezimena i imena, gde se kuke i kvake i dalje prikazuju. (TMemo)

Ti onda ne konvertuješ dobro dobijeni tekst, pogledaj moje funkcije (NormXXX) i vidi kako je u njima urađeno. Takođe probaj ove funkcije bez struktura (EidReadDocumentDataP...)

> Bravo, podaci se uspesno iscitavaju, a sad jos jedno pitanje postoji i slika tj. Portrait kako do nje doci.....

Pogledaj u dokumentaciji u kom je formatu ta slika, ti ćeš dobiti niz bajtova posle poziva EidReadPortrait.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 06.10.2010. u 18:44 · pre 195 meseci #35
> Slika je u JPG formatu....

Pa onda preuzmi bajtove i snimi u neki fajl (koristi TFileStream, imaš primer kako se radi sa njim u onom mom testu).
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 07.10.2010. u 06:41 · pre 195 meseci #36
Citat:
savkic:Ti onda ne konvertuješ dobro dobijeni tekst, pogledaj moje funkcije (NormXXX) i vidi kako je u njima urađeno. Takođe probaj ove funkcije bez struktura (EidReadDocumentDataP...)

Nisam ništa konvertovao, samo sam iskoristio tvoj demo primer i u slučaju D2010 umesto TntMemo-a stavio običan Memo.

Za xcsdsgn - kod za čitanje slike sa LK:
Code (delphi):

procedure TForm1.btnSaveImageClick(Sender: TObject);
var
  Slika: TEidPortrait;
  f: TFileStream;
begin
  FillChar(Slika, SizeOf(TEidPortrait), 0);

  EidBeginRead('');
  EidReadPortrait(@Slika);
  EidEndRead;

  f := TFileStream.Create('Slika.jpg', fmCreate);
  try
    f.Write(Slika, SizeOf(TEidPortrait));
  finally
    f.Free;
  end;
end;
 


[Ovu poruku je menjao dogriz dana 07.10.2010. u 10:56 GMT+1]
Re: Kako iz delphi aplikacije procitati licnu kartu uz pomoc celikapi.dll 13.12.2010. u 09:47 · pre 193 meseci #38
Pozdrav! Da se i ja prikljucim diskusiji. Imam jedan problem. Sto se citanja licnih karti iz Deplhija sve radi besprekorno. Medjutim ja koristim Delphi kako COM client za .NET aplikaciju. U Delphiju je implementiran rad sa Celikom, a iz .NET aplikacije pozivam proceduru za citanje licne karte iz COM-a. Kad testiram iz Delphija sve radi super, ali kad testiram iz VS2008 ili iz runtime-a Celik mi baca gresku EID_E_CARD_MISSING. Ima li neko ideju sta moze da bude problem? Hvala!
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme