package Ġch . p ont ius . sw iss qr . api . handlers . qr Ċ Ċ import Ġb oo fc v . factory . fid uc ial . Factory F id uc ial Ċ import Ġb oo fc v . io . image . Convert Buffered Image Ċ import Ġb oo fc v . struct . image . Gray U 8 Ċ import Ġch . p ont ius . sw iss qr . api . basics . Access Manager Ċ import Ġch . p ont ius . sw iss qr . api . basics . Post Rest Handler Ċ import Ġch . p ont ius . sw iss qr . api . model . service . status . Error Status Exception Ċ import Ġch . p ont ius . sw iss qr . api . model . service . status . Status Ċ import Ġch . p ont ius . sw iss qr . api . model . service . bill . Bill Ċ import Ġch . p ont ius . sw iss qr . api . model . users . Permission Ċ import Ġio . jav al in . core . util . Header Ċ import Ġio . jav al in . http . Context Ċ import Ġio . jav al in . plugin . openapi . annotations .* Ċ import Ġnet . code crete . q rb ill . generator . Q RB ill Ċ import Ġnet . code crete . q rb ill . generator . Q RB ill ValidationError Ċ import Ġorg . apache . pdf box . pd model . P DD ocument Ċ import Ġorg . apache . pdf box . rendering . ImageType Ċ import Ġorg . apache . pdf box . rendering . PDF Renderer Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . io . IOException Ċ import Ġjavax . image io . Image IO Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Post Rest Handler ] Ġfor ĠJ aval in Ġ Ġthat Ġscans ĠQR Ġcodes Ġfrom ĠPDF s Ġor Ġimages , Ġparses Ġthe Ġencoded Ġdata Ġand Ġconstruct Ċ Ġ* Ġa Ġlist Ġof Ġ[ Bill ] Ġdata Ġstructures . Ċ Ġ* Ċ Ġ* Ġ@ author ĠR alph ĠG asser Ċ Ġ* Ġ@ version Ġ 1 . 0 . 1 Ċ Ġ*/ Ċ class ĠScan QR Code Handler Ġ: ĠPost Rest Handler Ġ{ ĊĠĠĠ Ġ/** ĠPath Ġof Ġ[ Scan QR Code Handler ]. Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġroute : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" qr / scan " ĊĊĠĠĠ Ġ/** ĠSet Ġof Ġ[ Permission ] s Ġa Ġuser Ġrequires Ġin Ġorder Ġto Ġbe Ġallowed Ġto Ġuse Ġ[ Scan QR Code Handler ]. Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġrequired Permissions : ĠSet < Permission > Ġ= Ġset Of ( Permission . QR _ SCAN ) ĊĊĠĠĠ Ġ@ Open Api ( ĊĠĠĠĠĠĠĠ Ġsummary Ġ= Ġ" Sc ans Ġa Ġsw iss ĠQR Ġcode Ġwith Ġthe Ġgiven Ġinformation Ġand Ġreturns Ġthe Ġdata Ġit Ġcontains .", ĊĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"/ public / qr / scan ", ĊĠĠĠĠĠĠĠ Ġmethod Ġ= ĠHttpMethod . POST , ĊĠĠĠĠĠĠĠ Ġheaders Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Api Param ( Access Manager . API _ KEY _ HEADER , ĠString :: class , Ġdescription Ġ= Ġ" API ĠToken Ġused Ġfor Ġauthentication . ĠSyntax : ĠBearer Ġ< Token >", Ġrequired Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ], ĊĠĠĠĠĠĠĠ Ġrequest Body Ġ= ĠOpen Api RequestBody ( content Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Api Content ( from Ġ= ĠByteArray :: class , Ġtype Ġ= Ġ" image / png "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Api Content ( from Ġ= ĠByteArray :: class , Ġtype Ġ= Ġ" image / jpg "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Api Content ( from Ġ= ĠByteArray :: class , Ġtype Ġ= Ġ" application / pdf ") ĊĠĠĠĠĠĠĠ Ġ]), ĊĠĠĠĠĠĠĠ Ġtags Ġ= Ġ[" QR ĠScanner "], ĊĠĠĠĠĠĠĠ Ġresponses Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen ApiResponse (" 2 0 0 ", Ġ[ Open Api Content ( Array < Bill >:: class )]), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen ApiResponse (" 4 0 0 ", Ġ[ Open Api Content ( Status . Error Status :: class )]), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen ApiResponse (" 4 0 1 ", Ġ[ Open Api Content ( Status . Error Status :: class )]) ĊĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġfun Ġdo Post ( ctx : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/* ĠExtract Ġimages Ġthat Ġshould Ġbe Ġscanned . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġimages Ġ= Ġextract Image ( ctx ) ĊĠĠĠĠĠĠĠ Ġval Ġdetector Ġ= ĠFactory F id uc ial . qrcode ( null , ĠGray U 8 :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġb ills Ġ= Ġimages . flatMap Ġ{ Ġimg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgray 8 Ġ= ĠConvert Buffered Image . convert From ( img , Ġnull Ġas ĠGray U 8 ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . process ( gray 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . detection s ĊĠĠĠĠĠĠĠ Ġ}. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBill ( Q RB ill . decode Qr Code Text ( it . message )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠQ RB ill ValidationError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġ/* ĠReport Ġerror Ġif Ġno Ġresult Ġcould Ġbe Ġfound . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( b ills . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError Status Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Provided Ġdata Ġdid Ġnot Ġcontain Ġany ĠSw iss ĠQR Ġcode ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠWrite Ġresults Ġto Ġstream . Ġ*/ ĊĠĠĠĠĠĠĠ Ġctx . res . contentType Ġ= Ġ" application / json " ĊĠĠĠĠĠĠĠ Ġctx . json ( b ills ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract s Ġa Ġlist Ġof Ġ[ Buffered Image ] s Ġfrom Ġthe Ġgiven Ġ[ Context ]' s ĠHTTP Ġrequest . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġctx ĠThe Ġ[ Context ] Ġto Ġextract Ġthe Ġimages Ġfrom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Image ( ctx : ĠContext ): ĠList < Buffered Image > Ġ= Ġwhen ( ctx . req . contentType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" image / jpeg ", Ġ" image / jpg ", Ġ" image / png " Ġ-> ĠlistOf ( Image IO . read ( ctx . req . inputStream )) ĊĠĠĠĠĠĠĠ Ġ" application / pdf " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠP DD ocument . load ( ctx . req . inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrenderer Ġ= ĠPDF Renderer ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Pages : ĠInt Ġ= Ġdoc . numberOf Pages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġ( 0 Ġuntil ĠnumberOf Pages ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . render Image With DPI ( it , Ġ 3 0 0 . 0 f , ĠImage Type . RGB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError Status Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġread Ġprovided ĠPDF Ġdocument Ġdue Ġto ĠIOException : Ġ${ e . message }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠError Status Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Provided Ġcontent Ġtype Ġ'${ ctx . req . contentType } Ġis Ġnot Ġsupported !" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }