package Ġdev . al uc . pdf _ text ĊĊ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . annotation . NonNull Ċ import Ġcom . tom _ ro ush . pdf box . pd model . P DD ocument Ċ import Ġcom . tom _ ro ush . pdf box . text . PDF Text Strip per Ċ import Ġcom . tom _ ro ush . pdf box . util . PDF Box Resource Loader Ċ import Ġio . flutter . embedding . engine . plugins . Flutter Plugin Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Method Channel . Result Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar Ċ import Ġjava . io . File Ċ import Ġkotlin . concurrent . thread Ċ Ċ /** ĠPdf Text Plugin Ġ*/ Ċ class ĠPdf Text Plugin : ĠFlutter Plugin , ĠMethod Call Handler Ġ{ ĊĊĠ Ġoverride Ġfun Ġon Attached To Engine (@ NonNull Ġflutter Plugin Binding : ĠFlutter Plugin . Flutter Plugin Binding ) Ġ{ ĊĠĠĠ Ġval Ġchannel Ġ= ĠMethod Channel ( flutter Plugin Binding . binary Messenger , Ġ" pdf _ text ") ĊĠĠĠ Ġchannel . set MethodCall Handler ( Pdf Text Plugin ()) ĊĠĠĠ ĠPDF Box Resource Loader . init ( flutter Plugin Binding . application Context ) ĊĠ Ġ} ĊĊĠ Ġ// ĠThis Ġstatic Ġfunction Ġis Ġoptional Ġand Ġequivalent Ġto Ġon Attached To Engine . ĠIt Ġsupports Ġthe Ġold ĊĠ Ġ// Ġpre - Flutter - 1 . 1 2 ĠAndroid Ġprojects . ĠYou Ġare Ġencour aged Ġto Ġcontinue Ġsupporting ĊĠ Ġ// Ġplugin Ġregistration Ġvia Ġthis Ġfunction Ġwhile Ġapps Ġmigrate Ġto Ġuse Ġthe Ġnew ĠAndroid ĠAPIs ĊĠ Ġ// Ġpost - flutter - 1 . 1 2 Ġvia Ġhttps :// flutter . dev / go / android - project - migration . ĊĠ Ġ// ĊĠ Ġ// ĠIt Ġis Ġencour aged Ġto Ġshare Ġlogic Ġbetween Ġon Attached To Engine Ġand Ġregister With Ġto Ġkeep ĊĠ Ġ// Ġthem Ġfunction ally Ġequivalent . ĠOnly Ġone Ġof Ġon Attached To Engine Ġor Ġregister With Ġwill Ġbe Ġcalled ĊĠ Ġ// Ġdepending Ġon Ġthe Ġuser 's Ġproject . Ġon Attached To Engine Ġor Ġregister With Ġmust Ġboth Ġbe Ġdefined ĊĠ Ġ// Ġin Ġthe Ġsame Ġclass . ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġregister With ( regist rar : ĠRegist rar ) Ġ{ ĊĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMethod Channel ( regist rar . messenger (), Ġ" pdf _ text ") ĊĠĠĠĠĠ Ġchannel . set MethodCall Handler ( Pdf Text Plugin ()) ĊĠĠĠĠĠ ĠPDF Box Resource Loader . init ( regist rar . context ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon MethodCall (@ NonNull Ġcall : ĠMethod Call , Ġ@ NonNull Ġresult : ĠResult ) Ġ{ ĊĠĠĠ Ġthread Ġ( start Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( call . method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" init Doc " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . arguments Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġargs [" path "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġargs [" password "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Doc ( result , Ġpath , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ" get Doc Page Text " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . arguments Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġargs [" path "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Number Ġ= Ġargs [" number "] Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġargs [" password "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Doc Page Text ( result , Ġpath , Ġpage Number , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ" get Doc Text " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . arguments Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġargs [" path "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Pages Numbers Ġ= Ġargs [" missing Pages Numbers "] Ġas ĠList < Int > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġargs [" password "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Doc Text ( result , Ġpath , Ġmissing Pages Numbers , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Detached From Engine (@ NonNull Ġbinding : ĠFlutter Plugin . Flutter Plugin Binding ) Ġ{ ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠĠ ĠInitializes Ġthe ĠPDF Ġdocument Ġand Ġreturns Ġsome Ġinformation Ġinto Ġthe Ġchannel . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġinit Doc ( result : ĠResult , Ġpath : ĠString , Ġpassword : ĠString ) Ġ{ ĊĠĠĠ Ġget Doc ( result , Ġpath , Ġpassword )?. use Ġ{ Ġdoc Ġ-> ĊĠĠĠĠĠ Ġ// ĠGetting Ġthe Ġlength Ġof Ġthe ĠPDF Ġdocument Ġin Ġpages . ĊĠĠĠĠĠ Ġval Ġlength Ġ= Ġdoc . numberOf Pages ĊĊĠĠĠĠĠ Ġval Ġinfo Ġ= Ġdoc . document Information ĊĊĠĠĠĠĠ Ġvar Ġcreation Date : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠ Ġif Ġ( info . creation Date Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreation Date Ġ= Ġinfo . creation Date . time . toString () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġvar Ġmodification Date : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠ Ġif Ġ( info . modification Date Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodification Date Ġ= Ġinfo . modification Date . time . toString () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġdata Ġ= Ġhash Map Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" length " Ġto Ġlength , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" info " Ġto Ġhash Map Of (" author " Ġto Ġinfo . author , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" creation Date " Ġto Ġcreation Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" modification Date " Ġto Ġmodification Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" creator " Ġto Ġinfo . creator , Ġ" producer " Ġto Ġinfo . producer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" keywords " Ġto Ġsplit Keywords ( info . keywords ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġto Ġinfo . title , Ġ" subject " Ġto Ġinfo . subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġdoc . close () ĊĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . success ( data ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSpl its Ġa Ġstring Ġof Ġkeywords Ġinto Ġa Ġlist Ġof Ġstrings . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġsplit Keywords ( keywords String : ĠString ?): ĠList < String >? Ġ{ ĊĠĠĠ Ġif Ġ( keywords String Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġkeywords Ġ= Ġkeywords String . split ("," ). to Mutable List () ĊĠĠĠ Ġfor Ġ( i Ġin Ġkeywords . indices ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġkeyword Ġ= Ġkeywords [ i ] ĊĠĠĠĠĠ Ġkeyword Ġ= Ġkeyword . drop While Ġ{ Ġit Ġ== Ġ' Ġ' Ġ} ĊĠĠĠĠĠ Ġkeyword Ġ= Ġkeyword . drop Last While Ġ{ Ġit Ġ== Ġ' Ġ' Ġ} ĊĠĠĠĠĠ Ġkeywords [ i ] Ġ= Ġkeyword ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġkeywords ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠĠ ĠGets Ġthe Ġtext Ġ Ġof Ġa Ġdocument Ġpage , Ġgiven Ġits Ġnumber . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget Doc Page Text ( result : ĠResult , Ġpath : ĠString , Ġpage Number : ĠInt , Ġpassword : ĠString ) Ġ{ ĊĠĠĠ Ġget Doc ( result , Ġpath , Ġpassword )?. use Ġ{ Ġdoc Ġ-> ĊĠĠĠĠĠ Ġval Ġstrip per Ġ= ĠPDF Text Strip per (); ĊĠĠĠĠĠ Ġstrip per . start Page Ġ= Ġpage Number ĊĠĠĠĠĠ Ġstrip per . end Page Ġ= Ġpage Number ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġstrip per . getText ( doc ) ĊĠĠĠĠĠ Ġdoc . close () ĊĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . success ( text ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠ ĠGets Ġthe Ġtext Ġof Ġthe Ġentire Ġdocument . ĊĠ ĠIn Ġorder Ġto Ġimprove Ġthe Ġperformance , Ġit Ġonly Ġretrieves Ġthe Ġpages Ġthat Ġare Ġcurrently Ġmissing . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget Doc Text ( result : ĠResult , Ġpath : ĠString , Ġmissing Pages Numbers : ĠList < Int >, Ġpassword : ĠString ) Ġ{ ĊĠĠĠ Ġget Doc ( result , Ġpath , Ġpassword )?. use Ġ{ Ġdoc Ġ-> ĊĠĠĠĠĠ Ġval Ġmissing Pages Texts Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠ Ġval Ġstrip per Ġ= ĠPDF Text Strip per (); ĊĠĠĠĠĠ Ġmissing Pages Numbers . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġstrip per . start Page Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġstrip per . end Page Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġmissing Pages Texts . add ( strip per . getText ( doc )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġdoc . close () ĊĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . success ( missing Pages Texts ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠ ĠGets Ġa ĠPDF Ġdocument , Ġgiven Ġits Ġpath . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget Doc ( result : ĠResult , Ġpath : ĠString , Ġpassword : ĠString Ġ= Ġ"") : ĠP DD ocument ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ ĠP DD ocument . load ( File ( path ), Ġpassword ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . error (" INVALID _ PATH ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġpath Ġor Ġpassword Ġ( in Ġcase Ġof Ġencrypted Ġdocument ) Ġis Ġinvalid ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ