package Ġcom . ril . pdf _ mer ger Ċ Ċ import Ġandroid . content . Context Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . pdf . Pdf Document Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . ex if interface . media . Ex if Interface Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ Ċ class ĠCreate PD FF rom Multiple Image ( getContext Ġ: ĠContext , Ġget Result Ġ: ĠMethod Channel . Result ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcontext : ĠContext Ġ= ĠgetContext ĊĠĠĠ Ġprivate Ġvar Ġresult : ĠMethod Channel . Result Ġ= Ġget Result ĊĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġcreate ( paths : ĠList < String > ?, Ġoutput DirPath : ĠString ?, Ġneed Image Compressor Ġ: ĠBoolean ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠmaxWidth Ġ: ĠInt ?, ĠmaxHeight Ġ: ĠInt ?) Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstatus Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġpdf From Multiple Image Ġ= Ġ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( output DirPath !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile OutputStream Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpdf Document Ġ= ĠPdf Document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi = 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġpaths !! ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ: ĠBitmap ? ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( need Image Compressor !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġ Ġcompress Image ( context , Ġitem , ĠmaxWidth !! , ĠmaxHeight !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap Factory . decode File ( item ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Info Ġ= ĠPdf Document . Page Info . Builder ( bitmap !!. width , Ġbitmap . height , Ġi Ġ+ Ġ 1 ). create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġpdf Document . start Page ( page Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= Ġpage . canvas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Paint ( paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġ 0 f , Ġ 0 f , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Document . finish Page ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Document . writeTo ( file OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Document . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ" success " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ" error " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpdf From Multiple Image . invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( status Ġ== Ġ" success ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġoutput DirPath !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( status Ġ== Ġ" error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ" error " ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompress Image ( context : ĠContext , Ġimage Path : ĠString , ĠmaxWidth Get Ġ: ĠInt , ĠmaxHeight Get Ġ: ĠInt ): ĠBitmap ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠmaxHeight Ġ= ĠmaxWidth Get . toFloat () ĊĠĠĠĠĠĠĠ Ġval ĠmaxWidth Ġ= ĠmaxHeight Get . toFloat () ĊĊĠĠĠĠĠĠĠ Ġvar Ġscaled Bitmap : ĠBitmap ? ĊĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" VARIABLE _ WITH _ RED UND ANT _ INITIAL IZER ") ĊĠĠĠĠĠĠĠ Ġvar Ġbmp : ĠBitmap ? Ġ= ĠBitmap Factory . decode File ( image Path , Ġoptions ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Height Ġ= Ġoptions . out Height ĊĠĠĠĠĠĠĠ Ġvar Ġactual Width Ġ= Ġoptions . out Width ĊĊĠĠĠĠĠĠĠ Ġvar Ġimg Ratio Ġ= Ġactual Width . toFloat () Ġ/ Ġactual Height . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġmax Ratio Ġ= ĠmaxWidth Ġ/ ĠmaxHeight ĊĊĠĠĠĠĠĠĠ Ġif Ġ( actual Height Ġ> ĠmaxHeight Ġ|| Ġactual Width Ġ> ĠmaxWidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( img Ratio Ġ< Ġmax Ratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ratio Ġ= ĠmaxHeight Ġ/ Ġactual Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Width Ġ= Ġ( img Ratio Ġ* Ġactual Width ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Height Ġ= ĠmaxHeight . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( img Ratio Ġ> Ġmax Ratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ratio Ġ= ĠmaxWidth Ġ/ Ġactual Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Height Ġ= Ġ( img Ratio Ġ* Ġactual Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Width Ġ= ĠmaxWidth . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Height Ġ= ĠmaxHeight . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Width Ġ= ĠmaxWidth . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcalculate In Sample Size ( options , Ġactual Width , Ġactual Height ). also Ġ{ Ġoptions . in Sample Size Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġfalse . also Ġ{ Ġoptions . in Just Decode Bounds Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġfalse . also Ġ{ Ġoptions . in D ither Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġtrue . also Ġ{ Ġoptions . in Purge able Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġtrue . also Ġ{ Ġoptions . in Input Share able Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ ĠByteArray ( 1 6 Ġ* Ġ 1 0 2 4 ). also Ġ{ Ġoptions . in Temp Storage Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbmp Ġ= ĠBitmap Factory . decode File ( image Path , Ġoptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbmp . compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 , Ġba os ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠOut Of Memory Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscaled Bitmap Ġ= ĠBitmap . create Bitmap ( actual Width , Ġactual Height , ĠBitmap . Config . RGB _ 5 6 5 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠOut Of Memory Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġratio X Ġ= Ġactual Width Ġ/ Ġoptions . out Width . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġratio Y Ġ= Ġactual Height Ġ/ Ġoptions . out Height . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġmiddle X Ġ= Ġactual Width Ġ/ Ġ 2 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġmiddle Y Ġ= Ġactual Height Ġ/ Ġ 2 . 0 f ĊĊĠĠĠĠĠĠĠ Ġval Ġscale Matrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġscale Matrix . set Scale ( ratio X , Ġratio Y , Ġmiddle X , Ġmiddle Y ) ĊĊĠĠĠĠĠĠĠ ĠCanvas ( scaled Bitmap ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Matrix ( scale Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . draw Bitmap ( bmp , Ġmiddle X Ġ- Ġbmp !!. width Ġ/ Ġ 2 , Ġmiddle Y Ġ- Ġbmp . height Ġ/ Ġ 2 , ĠPaint ( Paint . FILTER _ BITMAP _ FLAG )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbmp . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġex if : ĠEx if Interface ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex if Ġ= ĠEx if Interface ( image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġex if . getAttribute Int ( Ex if Interface . TAG _ OR IENTATION , ĠEx if Interface . OR IENTATION _ UNDEFINED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 9 0 Ġ-> Ġmatrix . post Rotate ( 9 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 1 8 0 Ġ-> Ġmatrix . post Rotate ( 1 8 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 2 7 0 Ġ-> Ġmatrix . post Rotate ( 2 7 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( scaled Bitmap !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscaled Bitmap . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscaled Bitmap . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ). also Ġ{ Ġscaled Bitmap Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġscaled Bitmap ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcalculate In Sample Size ( options : ĠBitmap Factory . Options , Ġreq Width : ĠInt , Ġreq Height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġoptions . out Height ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġoptions . out Width ĊĠĠĠĠĠĠĠ Ġvar Ġin Sample Size Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( height Ġ> Ġreq Height Ġ|| Ġwidth Ġ> Ġreq Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ratio Ġ= ĠMath . round ( height . toFloat () Ġ/ Ġreq Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ratio Ġ= ĠMath . round ( width . toFloat () Ġ/ Ġreq Width . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Sample Size Ġ= Ġif Ġ( height Ratio Ġ< Ġwidth Ratio ) Ġheight Ratio Ġelse Ġwidth Ratio ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtotal Pixels Ġ= Ġ( width Ġ* Ġheight ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġtotal Req Pixels Cap Ġ= Ġ( req Width Ġ* Ġreq Height Ġ* Ġ 2 ). toFloat () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( total Pixels Ġ/ Ġ( in Sample Size Ġ* Ġin Sample Size ) Ġ> Ġtotal Req Pixels Cap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Sample Size ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġin Sample Size ĊĠĠĠ Ġ} ĊĊĊ Ċ } Ċ