Teknik is a suite of services with attractive and functional interfaces. https://www.teknik.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tcpdf.php 863KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144
  1. <?php
  2. //============================================================+
  3. // File name : tcpdf.php
  4. // Version : 6.0.044
  5. // Begin : 2002-08-03
  6. // Last Update : 2013-10-29
  7. // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
  8. // License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
  9. // -------------------------------------------------------------------
  10. // Copyright (C) 2002-2013 Nicola Asuni - Tecnick.com LTD
  11. //
  12. // This file is part of TCPDF software library.
  13. //
  14. // TCPDF is free software: you can ioredistribute it and/or modify it
  15. // under the terms of the GNU Lesser General Public License as
  16. // published by the Free Software Foundation, either version 3 of the
  17. // License, or (at your option) any later version.
  18. //
  19. // TCPDF is distributed in the hope that it will be useful, but
  20. // WITHOUT ANY WARRANTY; without even the implied warranty of
  21. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  22. // See the GNU Lesser General Public License for more details.
  23. //
  24. // You should have received a copy of the License
  25. // along with TCPDF. If not, see
  26. // <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
  27. //
  28. // See LICENSE.TXT file for more information.
  29. // -------------------------------------------------------------------
  30. //
  31. // Description :
  32. // This is a PHP class for generating PDF documents without requiring external extensions.
  33. //
  34. // NOTE:
  35. // This class was originally derived in 2002 from the Public
  36. // Domain FPDF class by Olivier Plathey (http://www.fpdf.org),
  37. // but now is almost entirely rewritten and contains thousands of
  38. // new lines of code and hundreds new features.
  39. //
  40. // Main features:
  41. // * no external libraries are required for the basic functions;
  42. // * all standard page formats, custom page formats, custom margins and units of measure;
  43. // * UTF-8 Unicode and Right-To-Left languages;
  44. // * TrueTypeUnicode, TrueType, Type1 and CID-0 fonts;
  45. // * font subsetting;
  46. // * methods to publish some XHTML + CSS code, Javascript and Forms;
  47. // * images, graphic (geometric figures) and transformation methods;
  48. // * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html)
  49. // * 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, Datamatrix, QR-Code, PDF417;
  50. // * JPEG and PNG ICC profiles, Grayscale, RGB, CMYK, Spot Colors and Transparencies;
  51. // * automatic page header and footer management;
  52. // * document encryption up to 256 bit and digital signature certifications;
  53. // * transactions to UNDO commands;
  54. // * PDF annotations, including links, text and file attachments;
  55. // * text rendering modes (fill, stroke and clipping);
  56. // * multiple columns mode;
  57. // * no-write page regions;
  58. // * bookmarks, named destinations and table of content;
  59. // * text hyphenation;
  60. // * text stretching and spacing (tracking);
  61. // * automatic page break, line break and text alignments including justification;
  62. // * automatic page numbering and page groups;
  63. // * move and delete pages;
  64. // * page compression (requires php-zlib extension);
  65. // * XOBject Templates;
  66. // * Layers and object visibility.
  67. // * PDF/A-1b support
  68. //============================================================+
  69. /**
  70. * @file
  71. * This is a PHP class for generating PDF documents without requiring external extensions.<br>
  72. * TCPDF project (http://www.tcpdf.org) was originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br>
  73. * <h3>TCPDF main features are:</h3>
  74. * <ul>
  75. * <li>no external libraries are required for the basic functions;</li>
  76. * <li>all standard page formats, custom page formats, custom margins and units of measure;</li>
  77. * <li>UTF-8 Unicode and Right-To-Left languages;</li>
  78. * <li>TrueTypeUnicode, TrueType, Type1 and CID-0 fonts;</li>
  79. * <li>font subsetting;</li>
  80. * <li>methods to publish some XHTML + CSS code, Javascript and Forms;</li>
  81. * <li>images, graphic (geometric figures) and transformation methods;
  82. * <li>supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html)</li>
  83. * <li>1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, Datamatrix, QR-Code, PDF417;</li>
  84. * <li>JPEG and PNG ICC profiles, Grayscale, RGB, CMYK, Spot Colors and Transparencies;</li>
  85. * <li>automatic page header and footer management;</li>
  86. * <li>document encryption up to 256 bit and digital signature certifications;</li>
  87. * <li>transactions to UNDO commands;</li>
  88. * <li>PDF annotations, including links, text and file attachments;</li>
  89. * <li>text rendering modes (fill, stroke and clipping);</li>
  90. * <li>multiple columns mode;</li>
  91. * <li>no-write page regions;</li>
  92. * <li>bookmarks, named destinations and table of content;</li>
  93. * <li>text hyphenation;</li>
  94. * <li>text stretching and spacing (tracking);</li>
  95. * <li>automatic page break, line break and text alignments including justification;</li>
  96. * <li>automatic page numbering and page groups;</li>
  97. * <li>move and delete pages;</li>
  98. * <li>page compression (requires php-zlib extension);</li>
  99. * <li>XOBject Templates;</li>
  100. * <li>Layers and object visibility;</li>
  101. * <li>PDF/A-1b support.</li>
  102. * </ul>
  103. * Tools to encode your unicode fonts are on fonts/utils directory.</p>
  104. * @package com.tecnick.tcpdf
  105. * @author Nicola Asuni
  106. * @version 6.0.044
  107. */
  108. // TCPDF configuration
  109. require_once(dirname(__FILE__).'/tcpdf_autoconfig.php');
  110. // TCPDF static font methods and data
  111. require_once(dirname(__FILE__).'/include/tcpdf_font_data.php');
  112. // TCPDF static font methods and data
  113. require_once(dirname(__FILE__).'/include/tcpdf_fonts.php');
  114. // TCPDF static color methods and data
  115. require_once(dirname(__FILE__).'/include/tcpdf_colors.php');
  116. // TCPDF static image methods and data
  117. require_once(dirname(__FILE__).'/include/tcpdf_images.php');
  118. // TCPDF static methods and data
  119. require_once(dirname(__FILE__).'/include/tcpdf_static.php');
  120. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  121. /**
  122. * @class TCPDF
  123. * PHP class for generating PDF documents without requiring external extensions.
  124. * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br>
  125. * @package com.tecnick.tcpdf
  126. * @brief PHP class for generating PDF documents without requiring external extensions.
  127. * @version 6.0.044
  128. * @author Nicola Asuni - info@tecnick.com
  129. */
  130. class TCPDF {
  131. // Protected properties
  132. /**
  133. * Current page number.
  134. * @protected
  135. */
  136. protected $page;
  137. /**
  138. * Current object number.
  139. * @protected
  140. */
  141. protected $n;
  142. /**
  143. * Array of object offsets.
  144. * @protected
  145. */
  146. protected $offsets = array();
  147. /**
  148. * Array of object IDs for each page.
  149. * @protected
  150. */
  151. protected $pageobjects = array();
  152. /**
  153. * Buffer holding in-memory PDF.
  154. * @protected
  155. */
  156. protected $buffer;
  157. /**
  158. * Array containing pages.
  159. * @protected
  160. */
  161. protected $pages = array();
  162. /**
  163. * Current document state.
  164. * @protected
  165. */
  166. protected $state;
  167. /**
  168. * Compression flag.
  169. * @protected
  170. */
  171. protected $compress;
  172. /**
  173. * Current page orientation (P = Portrait, L = Landscape).
  174. * @protected
  175. */
  176. protected $CurOrientation;
  177. /**
  178. * Page dimensions.
  179. * @protected
  180. */
  181. protected $pagedim = array();
  182. /**
  183. * Scale factor (number of points in user unit).
  184. * @protected
  185. */
  186. protected $k;
  187. /**
  188. * Width of page format in points.
  189. * @protected
  190. */
  191. protected $fwPt;
  192. /**
  193. * Height of page format in points.
  194. * @protected
  195. */
  196. protected $fhPt;
  197. /**
  198. * Current width of page in points.
  199. * @protected
  200. */
  201. protected $wPt;
  202. /**
  203. * Current height of page in points.
  204. * @protected
  205. */
  206. protected $hPt;
  207. /**
  208. * Current width of page in user unit.
  209. * @protected
  210. */
  211. protected $w;
  212. /**
  213. * Current height of page in user unit.
  214. * @protected
  215. */
  216. protected $h;
  217. /**
  218. * Left margin.
  219. * @protected
  220. */
  221. protected $lMargin;
  222. /**
  223. * Right margin.
  224. * @protected
  225. */
  226. protected $rMargin;
  227. /**
  228. * Cell left margin (used by regions).
  229. * @protected
  230. */
  231. protected $clMargin;
  232. /**
  233. * Cell right margin (used by regions).
  234. * @protected
  235. */
  236. protected $crMargin;
  237. /**
  238. * Top margin.
  239. * @protected
  240. */
  241. protected $tMargin;
  242. /**
  243. * Page break margin.
  244. * @protected
  245. */
  246. protected $bMargin;
  247. /**
  248. * Array of cell internal paddings ('T' => top, 'R' => right, 'B' => bottom, 'L' => left).
  249. * @since 5.9.000 (2010-10-03)
  250. * @protected
  251. */
  252. protected $cell_padding = array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0);
  253. /**
  254. * Array of cell margins ('T' => top, 'R' => right, 'B' => bottom, 'L' => left).
  255. * @since 5.9.000 (2010-10-04)
  256. * @protected
  257. */
  258. protected $cell_margin = array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0);
  259. /**
  260. * Current horizontal position in user unit for cell positioning.
  261. * @protected
  262. */
  263. protected $x;
  264. /**
  265. * Current vertical position in user unit for cell positioning.
  266. * @protected
  267. */
  268. protected $y;
  269. /**
  270. * Height of last cell printed.
  271. * @protected
  272. */
  273. protected $lasth;
  274. /**
  275. * Line width in user unit.
  276. * @protected
  277. */
  278. protected $LineWidth;
  279. /**
  280. * Array of standard font names.
  281. * @protected
  282. */
  283. protected $CoreFonts;
  284. /**
  285. * Array of used fonts.
  286. * @protected
  287. */
  288. protected $fonts = array();
  289. /**
  290. * Array of font files.
  291. * @protected
  292. */
  293. protected $FontFiles = array();
  294. /**
  295. * Array of encoding differences.
  296. * @protected
  297. */
  298. protected $diffs = array();
  299. /**
  300. * Array of used images.
  301. * @protected
  302. */
  303. protected $images = array();
  304. /**
  305. * Array of cached files.
  306. * @protected
  307. */
  308. protected $cached_files = array();
  309. /**
  310. * Array of Annotations in pages.
  311. * @protected
  312. */
  313. protected $PageAnnots = array();
  314. /**
  315. * Array of internal links.
  316. * @protected
  317. */
  318. protected $links = array();
  319. /**
  320. * Current font family.
  321. * @protected
  322. */
  323. protected $FontFamily;
  324. /**
  325. * Current font style.
  326. * @protected
  327. */
  328. protected $FontStyle;
  329. /**
  330. * Current font ascent (distance between font top and baseline).
  331. * @protected
  332. * @since 2.8.000 (2007-03-29)
  333. */
  334. protected $FontAscent;
  335. /**
  336. * Current font descent (distance between font bottom and baseline).
  337. * @protected
  338. * @since 2.8.000 (2007-03-29)
  339. */
  340. protected $FontDescent;
  341. /**
  342. * Underlining flag.
  343. * @protected
  344. */
  345. protected $underline;
  346. /**
  347. * Overlining flag.
  348. * @protected
  349. */
  350. protected $overline;
  351. /**
  352. * Current font info.
  353. * @protected
  354. */
  355. protected $CurrentFont;
  356. /**
  357. * Current font size in points.
  358. * @protected
  359. */
  360. protected $FontSizePt;
  361. /**
  362. * Current font size in user unit.
  363. * @protected
  364. */
  365. protected $FontSize;
  366. /**
  367. * Commands for drawing color.
  368. * @protected
  369. */
  370. protected $DrawColor;
  371. /**
  372. * Commands for filling color.
  373. * @protected
  374. */
  375. protected $FillColor;
  376. /**
  377. * Commands for text color.
  378. * @protected
  379. */
  380. protected $TextColor;
  381. /**
  382. * Indicates whether fill and text colors are different.
  383. * @protected
  384. */
  385. protected $ColorFlag;
  386. /**
  387. * Automatic page breaking.
  388. * @protected
  389. */
  390. protected $AutoPageBreak;
  391. /**
  392. * Threshold used to trigger page breaks.
  393. * @protected
  394. */
  395. protected $PageBreakTrigger;
  396. /**
  397. * Flag set when processing page header.
  398. * @protected
  399. */
  400. protected $InHeader = false;
  401. /**
  402. * Flag set when processing page footer.
  403. * @protected
  404. */
  405. protected $InFooter = false;
  406. /**
  407. * Zoom display mode.
  408. * @protected
  409. */
  410. protected $ZoomMode;
  411. /**
  412. * Layout display mode.
  413. * @protected
  414. */
  415. protected $LayoutMode;
  416. /**
  417. * If true set the document information dictionary in Unicode.
  418. * @protected
  419. */
  420. protected $docinfounicode = true;
  421. /**
  422. * Document title.
  423. * @protected
  424. */
  425. protected $title = '';
  426. /**
  427. * Document subject.
  428. * @protected
  429. */
  430. protected $subject = '';
  431. /**
  432. * Document author.
  433. * @protected
  434. */
  435. protected $author = '';
  436. /**
  437. * Document keywords.
  438. * @protected
  439. */
  440. protected $keywords = '';
  441. /**
  442. * Document creator.
  443. * @protected
  444. */
  445. protected $creator = '';
  446. /**
  447. * Starting page number.
  448. * @protected
  449. */
  450. protected $starting_page_number = 1;
  451. /**
  452. * The right-bottom (or left-bottom for RTL) corner X coordinate of last inserted image.
  453. * @since 2002-07-31
  454. * @author Nicola Asuni
  455. * @protected
  456. */
  457. protected $img_rb_x;
  458. /**
  459. * The right-bottom corner Y coordinate of last inserted image.
  460. * @since 2002-07-31
  461. * @author Nicola Asuni
  462. * @protected
  463. */
  464. protected $img_rb_y;
  465. /**
  466. * Adjusting factor to convert pixels to user units.
  467. * @since 2004-06-14
  468. * @author Nicola Asuni
  469. * @protected
  470. */
  471. protected $imgscale = 1;
  472. /**
  473. * Boolean flag set to true when the input text is unicode (require unicode fonts).
  474. * @since 2005-01-02
  475. * @author Nicola Asuni
  476. * @protected
  477. */
  478. protected $isunicode = false;
  479. /**
  480. * PDF version.
  481. * @since 1.5.3
  482. * @protected
  483. */
  484. protected $PDFVersion = '1.7';
  485. /**
  486. * ID of the stored default header template (-1 = not set).
  487. * @protected
  488. */
  489. protected $header_xobjid = -1;
  490. /**
  491. * If true reset the Header Xobject template at each page
  492. * @protected
  493. */
  494. protected $header_xobj_autoreset = false;
  495. /**
  496. * Minimum distance between header and top page margin.
  497. * @protected
  498. */
  499. protected $header_margin;
  500. /**
  501. * Minimum distance between footer and bottom page margin.
  502. * @protected
  503. */
  504. protected $footer_margin;
  505. /**
  506. * Original left margin value.
  507. * @protected
  508. * @since 1.53.0.TC013
  509. */
  510. protected $original_lMargin;
  511. /**
  512. * Original right margin value.
  513. * @protected
  514. * @since 1.53.0.TC013
  515. */
  516. protected $original_rMargin;
  517. /**
  518. * Default font used on page header.
  519. * @protected
  520. */
  521. protected $header_font;
  522. /**
  523. * Default font used on page footer.
  524. * @protected
  525. */
  526. protected $footer_font;
  527. /**
  528. * Language templates.
  529. * @protected
  530. */
  531. protected $l;
  532. /**
  533. * Barcode to print on page footer (only if set).
  534. * @protected
  535. */
  536. protected $barcode = false;
  537. /**
  538. * Boolean flag to print/hide page header.
  539. * @protected
  540. */
  541. protected $print_header = true;
  542. /**
  543. * Boolean flag to print/hide page footer.
  544. * @protected
  545. */
  546. protected $print_footer = true;
  547. /**
  548. * Header image logo.
  549. * @protected
  550. */
  551. protected $header_logo = '';
  552. /**
  553. * Width of header image logo in user units.
  554. * @protected
  555. */
  556. protected $header_logo_width = 30;
  557. /**
  558. * Title to be printed on default page header.
  559. * @protected
  560. */
  561. protected $header_title = '';
  562. /**
  563. * String to pring on page header after title.
  564. * @protected
  565. */
  566. protected $header_string = '';
  567. /**
  568. * Color for header text (RGB array).
  569. * @since 5.9.174 (2012-07-25)
  570. * @protected
  571. */
  572. protected $header_text_color = array(0,0,0);
  573. /**
  574. * Color for header line (RGB array).
  575. * @since 5.9.174 (2012-07-25)
  576. * @protected
  577. */
  578. protected $header_line_color = array(0,0,0);
  579. /**
  580. * Color for footer text (RGB array).
  581. * @since 5.9.174 (2012-07-25)
  582. * @protected
  583. */
  584. protected $footer_text_color = array(0,0,0);
  585. /**
  586. * Color for footer line (RGB array).
  587. * @since 5.9.174 (2012-07-25)
  588. * @protected
  589. */
  590. protected $footer_line_color = array(0,0,0);
  591. /**
  592. * Text shadow data array.
  593. * @since 5.9.174 (2012-07-25)
  594. * @protected
  595. */
  596. protected $txtshadow = array('enabled'=>false, 'depth_w'=>0, 'depth_h'=>0, 'color'=>false, 'opacity'=>1, 'blend_mode'=>'Normal');
  597. /**
  598. * Default number of columns for html table.
  599. * @protected
  600. */
  601. protected $default_table_columns = 4;
  602. // variables for html parser
  603. /**
  604. * HTML PARSER: array to store current link and rendering styles.
  605. * @protected
  606. */
  607. protected $HREF = array();
  608. /**
  609. * List of available fonts on filesystem.
  610. * @protected
  611. */
  612. protected $fontlist = array();
  613. /**
  614. * Current foreground color.
  615. * @protected
  616. */
  617. protected $fgcolor;
  618. /**
  619. * HTML PARSER: array of boolean values, true in case of ordered list (OL), false otherwise.
  620. * @protected
  621. */
  622. protected $listordered = array();
  623. /**
  624. * HTML PARSER: array count list items on nested lists.
  625. * @protected
  626. */
  627. protected $listcount = array();
  628. /**
  629. * HTML PARSER: current list nesting level.
  630. * @protected
  631. */
  632. protected $listnum = 0;
  633. /**
  634. * HTML PARSER: indent amount for lists.
  635. * @protected
  636. */
  637. protected $listindent = 0;
  638. /**
  639. * HTML PARSER: current list indententation level.
  640. * @protected
  641. */
  642. protected $listindentlevel = 0;
  643. /**
  644. * Current background color.
  645. * @protected
  646. */
  647. protected $bgcolor;
  648. /**
  649. * Temporary font size in points.
  650. * @protected
  651. */
  652. protected $tempfontsize = 10;
  653. /**
  654. * Spacer string for LI tags.
  655. * @protected
  656. */
  657. protected $lispacer = '';
  658. /**
  659. * Default encoding.
  660. * @protected
  661. * @since 1.53.0.TC010
  662. */
  663. protected $encoding = 'UTF-8';
  664. /**
  665. * PHP internal encoding.
  666. * @protected
  667. * @since 1.53.0.TC016
  668. */
  669. protected $internal_encoding;
  670. /**
  671. * Boolean flag to indicate if the document language is Right-To-Left.
  672. * @protected
  673. * @since 2.0.000
  674. */
  675. protected $rtl = false;
  676. /**
  677. * Boolean flag used to force RTL or LTR string direction.
  678. * @protected
  679. * @since 2.0.000
  680. */
  681. protected $tmprtl = false;
  682. // --- Variables used for document encryption:
  683. /**
  684. * IBoolean flag indicating whether document is protected.
  685. * @protected
  686. * @since 2.0.000 (2008-01-02)
  687. */
  688. protected $encrypted;
  689. /**
  690. * Array containing encryption settings.
  691. * @protected
  692. * @since 5.0.005 (2010-05-11)
  693. */
  694. protected $encryptdata = array();
  695. /**
  696. * Last RC4 key encrypted (cached for optimisation).
  697. * @protected
  698. * @since 2.0.000 (2008-01-02)
  699. */
  700. protected $last_enc_key;
  701. /**
  702. * Last RC4 computed key.
  703. * @protected
  704. * @since 2.0.000 (2008-01-02)
  705. */
  706. protected $last_enc_key_c;
  707. /**
  708. * File ID (used on document trailer).
  709. * @protected
  710. * @since 5.0.005 (2010-05-12)
  711. */
  712. protected $file_id;
  713. // --- bookmark ---
  714. /**
  715. * Outlines for bookmark.
  716. * @protected
  717. * @since 2.1.002 (2008-02-12)
  718. */
  719. protected $outlines = array();
  720. /**
  721. * Outline root for bookmark.
  722. * @protected
  723. * @since 2.1.002 (2008-02-12)
  724. */
  725. protected $OutlineRoot;
  726. // --- javascript and form ---
  727. /**
  728. * Javascript code.
  729. * @protected
  730. * @since 2.1.002 (2008-02-12)
  731. */
  732. protected $javascript = '';
  733. /**
  734. * Javascript counter.
  735. * @protected
  736. * @since 2.1.002 (2008-02-12)
  737. */
  738. protected $n_js;
  739. /**
  740. * line through state
  741. * @protected
  742. * @since 2.8.000 (2008-03-19)
  743. */
  744. protected $linethrough;
  745. /**
  746. * Array with additional document-wide usage rights for the document.
  747. * @protected
  748. * @since 5.8.014 (2010-08-23)
  749. */
  750. protected $ur = array();
  751. /**
  752. * DPI (Dot Per Inch) Document Resolution (do not change).
  753. * @protected
  754. * @since 3.0.000 (2008-03-27)
  755. */
  756. protected $dpi = 72;
  757. /**
  758. * Array of page numbers were a new page group was started (the page numbers are the keys of the array).
  759. * @protected
  760. * @since 3.0.000 (2008-03-27)
  761. */
  762. protected $newpagegroup = array();
  763. /**
  764. * Array that contains the number of pages in each page group.
  765. * @protected
  766. * @since 3.0.000 (2008-03-27)
  767. */
  768. protected $pagegroups = array();
  769. /**
  770. * Current page group number.
  771. * @protected
  772. * @since 3.0.000 (2008-03-27)
  773. */
  774. protected $currpagegroup = 0;
  775. /**
  776. * Array of transparency objects and parameters.
  777. * @protected
  778. * @since 3.0.000 (2008-03-27)
  779. */
  780. protected $extgstates;
  781. /**
  782. * Set the default JPEG compression quality (1-100).
  783. * @protected
  784. * @since 3.0.000 (2008-03-27)
  785. */
  786. protected $jpeg_quality;
  787. /**
  788. * Default cell height ratio.
  789. * @protected
  790. * @since 3.0.014 (2008-05-23)
  791. */
  792. protected $cell_height_ratio = K_CELL_HEIGHT_RATIO;
  793. /**
  794. * PDF viewer preferences.
  795. * @protected
  796. * @since 3.1.000 (2008-06-09)
  797. */
  798. protected $viewer_preferences;
  799. /**
  800. * A name object specifying how the document should be displayed when opened.
  801. * @protected
  802. * @since 3.1.000 (2008-06-09)
  803. */
  804. protected $PageMode;
  805. /**
  806. * Array for storing gradient information.
  807. * @protected
  808. * @since 3.1.000 (2008-06-09)
  809. */
  810. protected $gradients = array();
  811. /**
  812. * Array used to store positions inside the pages buffer (keys are the page numbers).
  813. * @protected
  814. * @since 3.2.000 (2008-06-26)
  815. */
  816. protected $intmrk = array();
  817. /**
  818. * Array used to store positions inside the pages buffer (keys are the page numbers).
  819. * @protected
  820. * @since 5.7.000 (2010-08-03)
  821. */
  822. protected $bordermrk = array();
  823. /**
  824. * Array used to store page positions to track empty pages (keys are the page numbers).
  825. * @protected
  826. * @since 5.8.007 (2010-08-18)
  827. */
  828. protected $emptypagemrk = array();
  829. /**
  830. * Array used to store content positions inside the pages buffer (keys are the page numbers).
  831. * @protected
  832. * @since 4.6.021 (2009-07-20)
  833. */
  834. protected $cntmrk = array();
  835. /**
  836. * Array used to store footer positions of each page.
  837. * @protected
  838. * @since 3.2.000 (2008-07-01)
  839. */
  840. protected $footerpos = array();
  841. /**
  842. * Array used to store footer length of each page.
  843. * @protected
  844. * @since 4.0.014 (2008-07-29)
  845. */
  846. protected $footerlen = array();
  847. /**
  848. * Boolean flag to indicate if a new line is created.
  849. * @protected
  850. * @since 3.2.000 (2008-07-01)
  851. */
  852. protected $newline = true;
  853. /**
  854. * End position of the latest inserted line.
  855. * @protected
  856. * @since 3.2.000 (2008-07-01)
  857. */
  858. protected $endlinex = 0;
  859. /**
  860. * PDF string for width value of the last line.
  861. * @protected
  862. * @since 4.0.006 (2008-07-16)
  863. */
  864. protected $linestyleWidth = '';
  865. /**
  866. * PDF string for CAP value of the last line.
  867. * @protected
  868. * @since 4.0.006 (2008-07-16)
  869. */
  870. protected $linestyleCap = '0 J';
  871. /**
  872. * PDF string for join value of the last line.
  873. * @protected
  874. * @since 4.0.006 (2008-07-16)
  875. */
  876. protected $linestyleJoin = '0 j';
  877. /**
  878. * PDF string for dash value of the last line.
  879. * @protected
  880. * @since 4.0.006 (2008-07-16)
  881. */
  882. protected $linestyleDash = '[] 0 d';
  883. /**
  884. * Boolean flag to indicate if marked-content sequence is open.
  885. * @protected
  886. * @since 4.0.013 (2008-07-28)
  887. */
  888. protected $openMarkedContent = false;
  889. /**
  890. * Count the latest inserted vertical spaces on HTML.
  891. * @protected
  892. * @since 4.0.021 (2008-08-24)
  893. */
  894. protected $htmlvspace = 0;
  895. /**
  896. * Array of Spot colors.
  897. * @protected
  898. * @since 4.0.024 (2008-09-12)
  899. */
  900. protected $spot_colors = array();
  901. /**
  902. * Symbol used for HTML unordered list items.
  903. * @protected
  904. * @since 4.0.028 (2008-09-26)
  905. */
  906. protected $lisymbol = '';
  907. /**
  908. * String used to mark the beginning and end of EPS image blocks.
  909. * @protected
  910. * @since 4.1.000 (2008-10-18)
  911. */
  912. protected $epsmarker = 'x#!#EPS#!#x';
  913. /**
  914. * Array of transformation matrix.
  915. * @protected
  916. * @since 4.2.000 (2008-10-29)
  917. */
  918. protected $transfmatrix = array();
  919. /**
  920. * Current key for transformation matrix.
  921. * @protected
  922. * @since 4.8.005 (2009-09-17)
  923. */
  924. protected $transfmatrix_key = 0;
  925. /**
  926. * Booklet mode for double-sided pages.
  927. * @protected
  928. * @since 4.2.000 (2008-10-29)
  929. */
  930. protected $booklet = false;
  931. /**
  932. * Epsilon value used for float calculations.
  933. * @protected
  934. * @since 4.2.000 (2008-10-29)
  935. */
  936. protected $feps = 0.005;
  937. /**
  938. * Array used for custom vertical spaces for HTML tags.
  939. * @protected
  940. * @since 4.2.001 (2008-10-30)
  941. */
  942. protected $tagvspaces = array();
  943. /**
  944. * HTML PARSER: custom indent amount for lists. Negative value means disabled.
  945. * @protected
  946. * @since 4.2.007 (2008-11-12)
  947. */
  948. protected $customlistindent = -1;
  949. /**
  950. * Boolean flag to indicate if the border of the cell sides that cross the page should be removed.
  951. * @protected
  952. * @since 4.2.010 (2008-11-14)
  953. */
  954. protected $opencell = true;
  955. /**
  956. * Array of files to embedd.
  957. * @protected
  958. * @since 4.4.000 (2008-12-07)
  959. */
  960. protected $embeddedfiles = array();
  961. /**
  962. * Boolean flag to indicate if we are inside a PRE tag.
  963. * @protected
  964. * @since 4.4.001 (2008-12-08)
  965. */
  966. protected $premode = false;
  967. /**
  968. * Array used to store positions of graphics transformation blocks inside the page buffer.
  969. * keys are the page numbers
  970. * @protected
  971. * @since 4.4.002 (2008-12-09)
  972. */
  973. protected $transfmrk = array();
  974. /**
  975. * Default color for html links.
  976. * @protected
  977. * @since 4.4.003 (2008-12-09)
  978. */
  979. protected $htmlLinkColorArray = array(0, 0, 255);
  980. /**
  981. * Default font style to add to html links.
  982. * @protected
  983. * @since 4.4.003 (2008-12-09)
  984. */
  985. protected $htmlLinkFontStyle = 'U';
  986. /**
  987. * Counts the number of pages.
  988. * @protected
  989. * @since 4.5.000 (2008-12-31)
  990. */
  991. protected $numpages = 0;
  992. /**
  993. * Array containing page lengths in bytes.
  994. * @protected
  995. * @since 4.5.000 (2008-12-31)
  996. */
  997. protected $pagelen = array();
  998. /**
  999. * Counts the number of pages.
  1000. * @protected
  1001. * @since 4.5.000 (2008-12-31)
  1002. */
  1003. protected $numimages = 0;
  1004. /**
  1005. * Store the image keys.
  1006. * @protected
  1007. * @since 4.5.000 (2008-12-31)
  1008. */
  1009. protected $imagekeys = array();
  1010. /**
  1011. * Length of the buffer in bytes.
  1012. * @protected
  1013. * @since 4.5.000 (2008-12-31)
  1014. */
  1015. protected $bufferlen = 0;
  1016. /**
  1017. * If true enables disk caching.
  1018. * @protected
  1019. * @since 4.5.000 (2008-12-31)
  1020. */
  1021. protected $diskcache = false;
  1022. /**
  1023. * Counts the number of fonts.
  1024. * @protected
  1025. * @since 4.5.000 (2009-01-02)
  1026. */
  1027. protected $numfonts = 0;
  1028. /**
  1029. * Store the font keys.
  1030. * @protected
  1031. * @since 4.5.000 (2009-01-02)
  1032. */
  1033. protected $fontkeys = array();
  1034. /**
  1035. * Store the font object IDs.
  1036. * @protected
  1037. * @since 4.8.001 (2009-09-09)
  1038. */
  1039. protected $font_obj_ids = array();
  1040. /**
  1041. * Store the fage status (true when opened, false when closed).
  1042. * @protected
  1043. * @since 4.5.000 (2009-01-02)
  1044. */
  1045. protected $pageopen = array();
  1046. /**
  1047. * Default monospace font.
  1048. * @protected
  1049. * @since 4.5.025 (2009-03-10)
  1050. */
  1051. protected $default_monospaced_font = 'courier';
  1052. /**
  1053. * Cloned copy of the current class object.
  1054. * @protected
  1055. * @since 4.5.029 (2009-03-19)
  1056. */
  1057. protected $objcopy;
  1058. /**
  1059. * Array used to store the lengths of cache files.
  1060. * @protected
  1061. * @since 4.5.029 (2009-03-19)
  1062. */
  1063. protected $cache_file_length = array();
  1064. /**
  1065. * Table header content to be repeated on each new page.
  1066. * @protected
  1067. * @since 4.5.030 (2009-03-20)
  1068. */
  1069. protected $thead = '';
  1070. /**
  1071. * Margins used for table header.
  1072. * @protected
  1073. * @since 4.5.030 (2009-03-20)
  1074. */
  1075. protected $theadMargins = array();
  1076. /**
  1077. * Boolean flag to enable document digital signature.
  1078. * @protected
  1079. * @since 4.6.005 (2009-04-24)
  1080. */
  1081. protected $sign = false;
  1082. /**
  1083. * Digital signature data.
  1084. * @protected
  1085. * @since 4.6.005 (2009-04-24)
  1086. */
  1087. protected $signature_data = array();
  1088. /**
  1089. * Digital signature max length.
  1090. * @protected
  1091. * @since 4.6.005 (2009-04-24)
  1092. */
  1093. protected $signature_max_length = 11742;
  1094. /**
  1095. * Data for digital signature appearance.
  1096. * @protected
  1097. * @since 5.3.011 (2010-06-16)
  1098. */
  1099. protected $signature_appearance = array('page' => 1, 'rect' => '0 0 0 0');
  1100. /**
  1101. * Array of empty digital signature appearances.
  1102. * @protected
  1103. * @since 5.9.101 (2011-07-06)
  1104. */
  1105. protected $empty_signature_appearance = array();
  1106. /**
  1107. * Regular expression used to find blank characters (required for word-wrapping).
  1108. * @protected
  1109. * @since 4.6.006 (2009-04-28)
  1110. */
  1111. protected $re_spaces = '/[^\S\xa0]/';
  1112. /**
  1113. * Array of $re_spaces parts.
  1114. * @protected
  1115. * @since 5.5.011 (2010-07-09)
  1116. */
  1117. protected $re_space = array('p' => '[^\S\xa0]', 'm' => '');
  1118. /**
  1119. * Digital signature object ID.
  1120. * @protected
  1121. * @since 4.6.022 (2009-06-23)
  1122. */
  1123. protected $sig_obj_id = 0;
  1124. /**
  1125. * ID of page objects.
  1126. * @protected
  1127. * @since 4.7.000 (2009-08-29)
  1128. */
  1129. protected $page_obj_id = array();
  1130. /**
  1131. * List of form annotations IDs.
  1132. * @protected
  1133. * @since 4.8.000 (2009-09-07)
  1134. */
  1135. protected $form_obj_id = array();
  1136. /**
  1137. * Deafult Javascript field properties. Possible values are described on official Javascript for Acrobat API reference. Annotation options can be directly specified using the 'aopt' entry.
  1138. * @protected
  1139. * @since 4.8.000 (2009-09-07)
  1140. */
  1141. protected $default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128));
  1142. /**
  1143. * Javascript objects array.
  1144. * @protected
  1145. * @since 4.8.000 (2009-09-07)
  1146. */
  1147. protected $js_objects = array();
  1148. /**
  1149. * Current form action (used during XHTML rendering).
  1150. * @protected
  1151. * @since 4.8.000 (2009-09-07)
  1152. */
  1153. protected $form_action = '';
  1154. /**
  1155. * Current form encryption type (used during XHTML rendering).
  1156. * @protected
  1157. * @since 4.8.000 (2009-09-07)
  1158. */
  1159. protected $form_enctype = 'application/x-www-form-urlencoded';
  1160. /**
  1161. * Current method to submit forms.
  1162. * @protected
  1163. * @since 4.8.000 (2009-09-07)
  1164. */
  1165. protected $form_mode = 'post';
  1166. /**
  1167. * List of fonts used on form fields (fontname => fontkey).
  1168. * @protected
  1169. * @since 4.8.001 (2009-09-09)
  1170. */
  1171. protected $annotation_fonts = array();
  1172. /**
  1173. * List of radio buttons parent objects.
  1174. * @protected
  1175. * @since 4.8.001 (2009-09-09)
  1176. */
  1177. protected $radiobutton_groups = array();
  1178. /**
  1179. * List of radio group objects IDs.
  1180. * @protected
  1181. * @since 4.8.001 (2009-09-09)
  1182. */
  1183. protected $radio_groups = array();
  1184. /**
  1185. * Text indentation value (used for text-indent CSS attribute).
  1186. * @protected
  1187. * @since 4.8.006 (2009-09-23)
  1188. */
  1189. protected $textindent = 0;
  1190. /**
  1191. * Store page number when startTransaction() is called.
  1192. * @protected
  1193. * @since 4.8.006 (2009-09-23)
  1194. */
  1195. protected $start_transaction_page = 0;
  1196. /**
  1197. * Store Y position when startTransaction() is called.
  1198. * @protected
  1199. * @since 4.9.001 (2010-03-28)
  1200. */
  1201. protected $start_transaction_y = 0;
  1202. /**
  1203. * True when we are printing the thead section on a new page.
  1204. * @protected
  1205. * @since 4.8.027 (2010-01-25)
  1206. */
  1207. protected $inthead = false;
  1208. /**
  1209. * Array of column measures (width, space, starting Y position).
  1210. * @protected
  1211. * @since 4.9.001 (2010-03-28)
  1212. */
  1213. protected $columns = array();
  1214. /**
  1215. * Number of colums.
  1216. * @protected
  1217. * @since 4.9.001 (2010-03-28)
  1218. */
  1219. protected $num_columns = 1;
  1220. /**
  1221. * Current column number.
  1222. * @protected
  1223. * @since 4.9.001 (2010-03-28)
  1224. */
  1225. protected $current_column = 0;
  1226. /**
  1227. * Starting page for columns.
  1228. * @protected
  1229. * @since 4.9.001 (2010-03-28)
  1230. */
  1231. protected $column_start_page = 0;
  1232. /**
  1233. * Maximum page and column selected.
  1234. * @protected
  1235. * @since 5.8.000 (2010-08-11)
  1236. */
  1237. protected $maxselcol = array('page' => 0, 'column' => 0);
  1238. /**
  1239. * Array of: X difference between table cell x start and starting page margin, cellspacing, cellpadding.
  1240. * @protected
  1241. * @since 5.8.000 (2010-08-11)
  1242. */
  1243. protected $colxshift = array('x' => 0, 's' => array('H' => 0, 'V' => 0), 'p' => array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0));
  1244. /**
  1245. * Text rendering mode: 0 = Fill text; 1 = Stroke text; 2 = Fill, then stroke text; 3 = Neither fill nor stroke text (invisible); 4 = Fill text and add to path for clipping; 5 = Stroke text and add to path for clipping; 6 = Fill, then stroke text and add to path for clipping; 7 = Add text to path for clipping.
  1246. * @protected
  1247. * @since 4.9.008 (2010-04-03)
  1248. */
  1249. protected $textrendermode = 0;
  1250. /**
  1251. * Text stroke width in doc units.
  1252. * @protected
  1253. * @since 4.9.008 (2010-04-03)
  1254. */
  1255. protected $textstrokewidth = 0;
  1256. /**
  1257. * Current stroke color.
  1258. * @protected
  1259. * @since 4.9.008 (2010-04-03)
  1260. */
  1261. protected $strokecolor;
  1262. /**
  1263. * Default unit of measure for document.
  1264. * @protected
  1265. * @since 5.0.000 (2010-04-22)
  1266. */
  1267. protected $pdfunit = 'mm';
  1268. /**
  1269. * Boolean flag true when we are on TOC (Table Of Content) page.
  1270. * @protected
  1271. */
  1272. protected $tocpage = false;
  1273. /**
  1274. * Boolean flag: if true convert vector images (SVG, EPS) to raster image using GD or ImageMagick library.
  1275. * @protected
  1276. * @since 5.0.000 (2010-04-26)
  1277. */
  1278. protected $rasterize_vector_images = false;
  1279. /**
  1280. * Boolean flag: if true enables font subsetting by default.
  1281. * @protected
  1282. * @since 5.3.002 (2010-06-07)
  1283. */
  1284. protected $font_subsetting = true;
  1285. /**
  1286. * Array of default graphic settings.
  1287. * @protected
  1288. * @since 5.5.008 (2010-07-02)
  1289. */
  1290. protected $default_graphic_vars = array();
  1291. /**
  1292. * Array of XObjects.
  1293. * @protected
  1294. * @since 5.8.014 (2010-08-23)
  1295. */
  1296. protected $xobjects = array();
  1297. /**
  1298. * Boolean value true when we are inside an XObject.
  1299. * @protected
  1300. * @since 5.8.017 (2010-08-24)
  1301. */
  1302. protected $inxobj = false;
  1303. /**
  1304. * Current XObject ID.
  1305. * @protected
  1306. * @since 5.8.017 (2010-08-24)
  1307. */
  1308. protected $xobjid = '';
  1309. /**
  1310. * Percentage of character stretching.
  1311. * @protected
  1312. * @since 5.9.000 (2010-09-29)
  1313. */
  1314. protected $font_stretching = 100;
  1315. /**
  1316. * Increases or decreases the space between characters in a text by the specified amount (tracking).
  1317. * @protected
  1318. * @since 5.9.000 (2010-09-29)
  1319. */
  1320. protected $font_spacing = 0;
  1321. /**
  1322. * Array of no-write regions.
  1323. * ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right)
  1324. * @protected
  1325. * @since 5.9.003 (2010-10-14)
  1326. */
  1327. protected $page_regions = array();
  1328. /**
  1329. * Boolean value true when page region check is active.
  1330. * @protected
  1331. */
  1332. protected $check_page_regions = true;
  1333. /**
  1334. * Array of PDF layers data.
  1335. * @protected
  1336. * @since 5.9.102 (2011-07-13)
  1337. */
  1338. protected $pdflayers = array();
  1339. /**
  1340. * A dictionary of names and corresponding destinations (Dests key on document Catalog).
  1341. * @protected
  1342. * @since 5.9.097 (2011-06-23)
  1343. */
  1344. protected $dests = array();
  1345. /**
  1346. * Object ID for Named Destinations
  1347. * @protected
  1348. * @since 5.9.097 (2011-06-23)
  1349. */
  1350. protected $n_dests;
  1351. /**
  1352. * Embedded Files Names
  1353. * @protected
  1354. * @since 5.9.204 (2013-01-23)
  1355. */
  1356. protected $efnames = array();
  1357. /**
  1358. * Directory used for the last SVG image.
  1359. * @protected
  1360. * @since 5.0.000 (2010-05-05)
  1361. */
  1362. protected $svgdir = '';
  1363. /**
  1364. * Deafult unit of measure for SVG.
  1365. * @protected
  1366. * @since 5.0.000 (2010-05-02)
  1367. */
  1368. protected $svgunit = 'px';
  1369. /**
  1370. * Array of SVG gradients.
  1371. * @protected
  1372. * @since 5.0.000 (2010-05-02)
  1373. */
  1374. protected $svggradients = array();
  1375. /**
  1376. * ID of last SVG gradient.
  1377. * @protected
  1378. * @since 5.0.000 (2010-05-02)
  1379. */
  1380. protected $svggradientid = 0;
  1381. /**
  1382. * Boolean value true when in SVG defs group.
  1383. * @protected
  1384. * @since 5.0.000 (2010-05-02)
  1385. */
  1386. protected $svgdefsmode = false;
  1387. /**
  1388. * Array of SVG defs.
  1389. * @protected
  1390. * @since 5.0.000 (2010-05-02)
  1391. */
  1392. protected $svgdefs = array();
  1393. /**
  1394. * Boolean value true when in SVG clipPath tag.
  1395. * @protected
  1396. * @since 5.0.000 (2010-04-26)
  1397. */
  1398. protected $svgclipmode = false;
  1399. /**
  1400. * Array of SVG clipPath commands.
  1401. * @protected
  1402. * @since 5.0.000 (2010-05-02)
  1403. */
  1404. protected $svgclippaths = array();
  1405. /**
  1406. * Array of SVG clipPath tranformation matrix.
  1407. * @protected
  1408. * @since 5.8.022 (2010-08-31)
  1409. */
  1410. protected $svgcliptm = array();
  1411. /**
  1412. * ID of last SVG clipPath.
  1413. * @protected
  1414. * @since 5.0.000 (2010-05-02)
  1415. */
  1416. protected $svgclipid = 0;
  1417. /**
  1418. * SVG text.
  1419. * @protected
  1420. * @since 5.0.000 (2010-05-02)
  1421. */
  1422. protected $svgtext = '';
  1423. /**
  1424. * SVG text properties.
  1425. * @protected
  1426. * @since 5.8.013 (2010-08-23)
  1427. */
  1428. protected $svgtextmode = array();
  1429. /**
  1430. * Array of SVG properties.
  1431. * @protected
  1432. * @since 5.0.000 (2010-05-02)
  1433. */
  1434. protected $svgstyles = array(array(
  1435. 'alignment-baseline' => 'auto',
  1436. 'baseline-shift' => 'baseline',
  1437. 'clip' => 'auto',
  1438. 'clip-path' => 'none',
  1439. 'clip-rule' => 'nonzero',
  1440. 'color' => 'black',
  1441. 'color-interpolation' => 'sRGB',
  1442. 'color-interpolation-filters' => 'linearRGB',
  1443. 'color-profile' => 'auto',
  1444. 'color-rendering' => 'auto',
  1445. 'cursor' => 'auto',
  1446. 'direction' => 'ltr',
  1447. 'display' => 'inline',
  1448. 'dominant-baseline' => 'auto',
  1449. 'enable-background' => 'accumulate',
  1450. 'fill' => 'black',
  1451. 'fill-opacity' => 1,
  1452. 'fill-rule' => 'nonzero',
  1453. 'filter' => 'none',
  1454. 'flood-color' => 'black',
  1455. 'flood-opacity' => 1,
  1456. 'font' => '',
  1457. 'font-family' => 'helvetica',
  1458. 'font-size' => 'medium',
  1459. 'font-size-adjust' => 'none',
  1460. 'font-stretch' => 'normal',
  1461. 'font-style' => 'normal',
  1462. 'font-variant' => 'normal',
  1463. 'font-weight' => 'normal',
  1464. 'glyph-orientation-horizontal' => '0deg',
  1465. 'glyph-orientation-vertical' => 'auto',
  1466. 'image-rendering' => 'auto',
  1467. 'kerning' => 'auto',
  1468. 'letter-spacing' => 'normal',
  1469. 'lighting-color' => 'white',
  1470. 'marker' => '',
  1471. 'marker-end' => 'none',
  1472. 'marker-mid' => 'none',
  1473. 'marker-start' => 'none',
  1474. 'mask' => 'none',
  1475. 'opacity' => 1,
  1476. 'overflow' => 'auto',
  1477. 'pointer-events' => 'visiblePainted',
  1478. 'shape-rendering' => 'auto',
  1479. 'stop-color' => 'black',
  1480. 'stop-opacity' => 1,
  1481. 'stroke' => 'none',
  1482. 'stroke-dasharray' => 'none',
  1483. 'stroke-dashoffset' => 0,
  1484. 'stroke-linecap' => 'butt',
  1485. 'stroke-linejoin' => 'miter',
  1486. 'stroke-miterlimit' => 4,
  1487. 'stroke-opacity' => 1,
  1488. 'stroke-width' => 1,
  1489. 'text-anchor' => 'start',
  1490. 'text-decoration' => 'none',
  1491. 'text-rendering' => 'auto',
  1492. 'unicode-bidi' => 'normal',
  1493. 'visibility' => 'visible',
  1494. 'word-spacing' => 'normal',
  1495. 'writing-mode' => 'lr-tb',
  1496. 'text-color' => 'black',
  1497. 'transfmatrix' => array(1, 0, 0, 1, 0, 0)
  1498. ));
  1499. /**
  1500. * If true force sRGB color profile for all document.
  1501. * @protected
  1502. * @since 5.9.121 (2011-09-28)
  1503. */
  1504. protected $force_srgb = false;
  1505. /**
  1506. * If true set the document to PDF/A mode.
  1507. * @protected
  1508. * @since 5.9.121 (2011-09-27)
  1509. */
  1510. protected $pdfa_mode = false;
  1511. /**
  1512. * Document creation date-time
  1513. * @protected
  1514. * @since 5.9.152 (2012-03-22)
  1515. */
  1516. protected $doc_creation_timestamp;
  1517. /**
  1518. * Document modification date-time
  1519. * @protected
  1520. * @since 5.9.152 (2012-03-22)
  1521. */
  1522. protected $doc_modification_timestamp;
  1523. /**
  1524. * Custom XMP data.
  1525. * @protected
  1526. * @since 5.9.128 (2011-10-06)
  1527. */
  1528. protected $custom_xmp = '';
  1529. /**
  1530. * Overprint mode array.
  1531. * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
  1532. * @protected
  1533. * @since 5.9.152 (2012-03-23)
  1534. */
  1535. protected $overprint = array('OP' => false, 'op' => false, 'OPM' => 0);
  1536. /**
  1537. * Alpha mode array.
  1538. * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
  1539. * @protected
  1540. * @since 5.9.152 (2012-03-23)
  1541. */
  1542. protected $alpha = array('CA' => 1, 'ca' => 1, 'BM' => '/Normal', 'AIS' => false);
  1543. /**
  1544. * Define the page boundaries boxes to be set on document.
  1545. * @protected
  1546. * @since 5.9.152 (2012-03-23)
  1547. */
  1548. protected $page_boxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox');
  1549. /**
  1550. * If true print TCPDF meta link.
  1551. * @protected
  1552. * @since 5.9.152 (2012-03-23)
  1553. */
  1554. protected $tcpdflink = true;
  1555. /**
  1556. * Cache array for computed GD gamma values.
  1557. * @protected
  1558. * @since 5.9.1632 (2012-06-05)
  1559. */
  1560. protected $gdgammacache = array();
  1561. //------------------------------------------------------------
  1562. // METHODS
  1563. //------------------------------------------------------------
  1564. /**
  1565. * This is the class constructor.
  1566. * It allows to set up the page format, the orientation and the measure unit used in all the methods (except for the font sizes).
  1567. *
  1568. * IMPORTANT: Please note that this method sets the mb_internal_encoding to ASCII, so if you are using the mbstring module functions with TCPDF you need to correctly set/unset the mb_internal_encoding when needed.
  1569. *
  1570. * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li><li>'' (empty string) for automatic orientation</li></ul>
  1571. * @param $unit (string) User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit.
  1572. * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
  1573. * @param $unicode (boolean) TRUE means that the input text is unicode (default = true)
  1574. * @param $encoding (string) Charset encoding (used only when converting back html entities); default is UTF-8.
  1575. * @param $diskcache (boolean) If TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower).
  1576. * @param $pdfa (boolean) If TRUE set the document to PDF/A mode.
  1577. * @public
  1578. * @see getPageSizeFromFormat(), setPageFormat()
  1579. */
  1580. public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false, $pdfa=false) {
  1581. /* Set internal character encoding to ASCII */
  1582. if (function_exists('mb_internal_encoding') AND mb_internal_encoding()) {
  1583. $this->internal_encoding = mb_internal_encoding();
  1584. mb_internal_encoding('ASCII');
  1585. }
  1586. $this->font_obj_ids = array();
  1587. $this->page_obj_id = array();
  1588. $this->form_obj_id = array();
  1589. // set pdf/a mode
  1590. $this->pdfa_mode = $pdfa;
  1591. $this->force_srgb = false;
  1592. // set disk caching
  1593. $this->diskcache = $diskcache ? true : false;
  1594. // set language direction
  1595. $this->rtl = false;
  1596. $this->tmprtl = false;
  1597. // some checks
  1598. $this->_dochecks();
  1599. // initialization of properties
  1600. $this->isunicode = $unicode;
  1601. $this->page = 0;
  1602. $this->transfmrk[0] = array();
  1603. $this->pagedim = array();
  1604. $this->n = 2;
  1605. $this->buffer = '';
  1606. $this->pages = array();
  1607. $this->state = 0;
  1608. $this->fonts = array();
  1609. $this->FontFiles = array();
  1610. $this->diffs = array();
  1611. $this->images = array();
  1612. $this->links = array();
  1613. $this->gradients = array();
  1614. $this->InFooter = false;
  1615. $this->lasth = 0;
  1616. $this->FontFamily = defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica';
  1617. $this->FontStyle = '';
  1618. $this->FontSizePt = 12;
  1619. $this->underline = false;
  1620. $this->overline = false;
  1621. $this->linethrough = false;
  1622. $this->DrawColor = '0 G';
  1623. $this->FillColor = '0 g';
  1624. $this->TextColor = '0 g';
  1625. $this->ColorFlag = false;
  1626. $this->pdflayers = array();
  1627. // encryption values
  1628. $this->encrypted = false;
  1629. $this->last_enc_key = '';
  1630. // standard Unicode fonts
  1631. $this->CoreFonts = array(
  1632. 'courier'=>'Courier',
  1633. 'courierB'=>'Courier-Bold',
  1634. 'courierI'=>'Courier-Oblique',
  1635. 'courierBI'=>'Courier-BoldOblique',
  1636. 'helvetica'=>'Helvetica',
  1637. 'helveticaB'=>'Helvetica-Bold',
  1638. 'helveticaI'=>'Helvetica-Oblique',
  1639. 'helveticaBI'=>'Helvetica-BoldOblique',
  1640. 'times'=>'Times-Roman',
  1641. 'timesB'=>'Times-Bold',
  1642. 'timesI'=>'Times-Italic',
  1643. 'timesBI'=>'Times-BoldItalic',
  1644. 'symbol'=>'Symbol',
  1645. 'zapfdingbats'=>'ZapfDingbats'
  1646. );
  1647. // set scale factor
  1648. $this->setPageUnit($unit);
  1649. // set page format and orientation
  1650. $this->setPageFormat($format, $orientation);
  1651. // page margins (1 cm)
  1652. $margin = 28.35 / $this->k;
  1653. $this->SetMargins($margin, $margin);
  1654. $this->clMargin = $this->lMargin;
  1655. $this->crMargin = $this->rMargin;
  1656. // internal cell padding
  1657. $cpadding = $margin / 10;
  1658. $this->setCellPaddings($cpadding, 0, $cpadding, 0);
  1659. // cell margins
  1660. $this->setCellMargins(0, 0, 0, 0);
  1661. // line width (0.2 mm)
  1662. $this->LineWidth = 0.57 / $this->k;
  1663. $this->linestyleWidth = sprintf('%F w', ($this->LineWidth * $this->k));
  1664. $this->linestyleCap = '0 J';
  1665. $this->linestyleJoin = '0 j';
  1666. $this->linestyleDash = '[] 0 d';
  1667. // automatic page break
  1668. $this->SetAutoPageBreak(true, (2 * $margin));
  1669. // full width display mode
  1670. $this->SetDisplayMode('fullwidth');
  1671. // compression
  1672. $this->SetCompression();
  1673. // set default PDF version number
  1674. $this->setPDFVersion();
  1675. $this->tcpdflink = true;
  1676. $this->encoding = $encoding;
  1677. $this->HREF = array();
  1678. $this->getFontsList();
  1679. $this->fgcolor = array('R' => 0, 'G' => 0, 'B' => 0);
  1680. $this->strokecolor = array('R' => 0, 'G' => 0, 'B' => 0);
  1681. $this->bgcolor = array('R' => 255, 'G' => 255, 'B' => 255);
  1682. $this->extgstates = array();
  1683. $this->setTextShadow();
  1684. // user's rights
  1685. $this->sign = false;
  1686. $this->ur['enabled'] = false;
  1687. $this->ur['document'] = '/FullSave';
  1688. $this->ur['annots'] = '/Create/Delete/Modify/Copy/Import/Export';
  1689. $this->ur['form'] = '/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate';
  1690. $this->ur['signature'] = '/Modify';
  1691. $this->ur['ef'] = '/Create/Delete/Modify/Import';
  1692. $this->ur['formex'] = '';
  1693. $this->signature_appearance = array('page' => 1, 'rect' => '0 0 0 0', 'name' => 'Signature');
  1694. $this->empty_signature_appearance = array();
  1695. // set default JPEG quality
  1696. $this->jpeg_quality = 75;
  1697. // initialize some settings
  1698. TCPDF_FONTS::utf8Bidi(array(''), '', false, $this->isunicode, $this->CurrentFont);
  1699. // set default font
  1700. $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt);
  1701. // check if PCRE Unicode support is enabled
  1702. if ($this->isunicode AND (@preg_match('/\pL/u', 'a') == 1)) {
  1703. // PCRE unicode support is turned ON
  1704. // \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator.
  1705. // \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants.
  1706. // \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between.
  1707. //$this->setSpacesRE('/[^\S\P{Z}\P{Lo}\xa0]/u');
  1708. $this->setSpacesRE('/[^\S\P{Z}\xa0]/u');
  1709. } else {
  1710. // PCRE unicode support is turned OFF
  1711. $this->setSpacesRE('/[^\S\xa0]/');
  1712. }
  1713. $this->default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128));
  1714. // set file ID for trailer
  1715. $serformat = (is_array($format) ? serialize($format) : $format);
  1716. $this->file_id = md5(TCPDF_STATIC::getRandomSeed('TCPDF'.$orientation.$unit.$serformat.$encoding));
  1717. // set document creation and modification timestamp
  1718. $this->doc_creation_timestamp = time();
  1719. $this->doc_modification_timestamp = $this->doc_creation_timestamp;
  1720. // get default graphic vars
  1721. $this->default_graphic_vars = $this->getGraphicVars();
  1722. $this->header_xobj_autoreset = false;
  1723. $this->custom_xmp = '';
  1724. }
  1725. /**
  1726. * Default destructor.
  1727. * @public
  1728. * @since 1.53.0.TC016
  1729. */
  1730. public function __destruct() {
  1731. // restore internal encoding
  1732. if (isset($this->internal_encoding) AND !empty($this->internal_encoding)) {
  1733. mb_internal_encoding($this->internal_encoding);
  1734. }
  1735. // unset all class variables
  1736. $this->_destroy(true);
  1737. }
  1738. /**
  1739. * Set the units of measure for the document.
  1740. * @param $unit (string) User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit.
  1741. * @public
  1742. * @since 3.0.015 (2008-06-06)
  1743. */
  1744. public function setPageUnit($unit) {
  1745. $unit = strtolower($unit);
  1746. //Set scale factor
  1747. switch ($unit) {
  1748. // points
  1749. case 'px':
  1750. case 'pt': {
  1751. $this->k = 1;
  1752. break;
  1753. }
  1754. // millimeters
  1755. case 'mm': {
  1756. $this->k = $this->dpi / 25.4;
  1757. break;
  1758. }
  1759. // centimeters
  1760. case 'cm': {
  1761. $this->k = $this->dpi / 2.54;
  1762. break;
  1763. }
  1764. // inches
  1765. case 'in': {
  1766. $this->k = $this->dpi;
  1767. break;
  1768. }
  1769. // unsupported unit
  1770. default : {
  1771. $this->Error('Incorrect unit: '.$unit);
  1772. break;
  1773. }
  1774. }
  1775. $this->pdfunit = $unit;
  1776. if (isset($this->CurOrientation)) {
  1777. $this->setPageOrientation($this->CurOrientation);
  1778. }
  1779. }
  1780. /**
  1781. * Change the format of the current page
  1782. * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() documentation or an array of two numners (width, height) or an array containing the following measures and options:<ul>
  1783. * <li>['format'] = page format name (one of the above);</li>
  1784. * <li>['Rotate'] : The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.</li>
  1785. * <li>['PZ'] : The page's preferred zoom (magnification) factor.</li>
  1786. * <li>['MediaBox'] : the boundaries of the physical medium on which the page shall be displayed or printed:</li>
  1787. * <li>['MediaBox']['llx'] : lower-left x coordinate in points</li>
  1788. * <li>['MediaBox']['lly'] : lower-left y coordinate in points</li>
  1789. * <li>['MediaBox']['urx'] : upper-right x coordinate in points</li>
  1790. * <li>['MediaBox']['ury'] : upper-right y coordinate in points</li>
  1791. * <li>['CropBox'] : the visible region of default user space:</li>
  1792. * <li>['CropBox']['llx'] : lower-left x coordinate in points</li>
  1793. * <li>['CropBox']['lly'] : lower-left y coordinate in points</li>
  1794. * <li>['CropBox']['urx'] : upper-right x coordinate in points</li>
  1795. * <li>['CropBox']['ury'] : upper-right y coordinate in points</li>
  1796. * <li>['BleedBox'] : the region to which the contents of the page shall be clipped when output in a production environment:</li>
  1797. * <li>['BleedBox']['llx'] : lower-left x coordinate in points</li>
  1798. * <li>['BleedBox']['lly'] : lower-left y coordinate in points</li>
  1799. * <li>['BleedBox']['urx'] : upper-right x coordinate in points</li>
  1800. * <li>['BleedBox']['ury'] : upper-right y coordinate in points</li>
  1801. * <li>['TrimBox'] : the intended dimensions of the finished page after trimming:</li>
  1802. * <li>['TrimBox']['llx'] : lower-left x coordinate in points</li>
  1803. * <li>['TrimBox']['lly'] : lower-left y coordinate in points</li>
  1804. * <li>['TrimBox']['urx'] : upper-right x coordinate in points</li>
  1805. * <li>['TrimBox']['ury'] : upper-right y coordinate in points</li>
  1806. * <li>['ArtBox'] : the extent of the page's meaningful content:</li>
  1807. * <li>['ArtBox']['llx'] : lower-left x coordinate in points</li>
  1808. * <li>['ArtBox']['lly'] : lower-left y coordinate in points</li>
  1809. * <li>['ArtBox']['urx'] : upper-right x coordinate in points</li>
  1810. * <li>['ArtBox']['ury'] : upper-right y coordinate in points</li>
  1811. * <li>['BoxColorInfo'] :specify the colours and other visual characteristics that should be used in displaying guidelines on the screen for each of the possible page boundaries other than the MediaBox:</li>
  1812. * <li>['BoxColorInfo'][BOXTYPE]['C'] : an array of three numbers in the range 0-255, representing the components in the DeviceRGB colour space.</li>
  1813. * <li>['BoxColorInfo'][BOXTYPE]['W'] : the guideline width in default user units</li>
  1814. * <li>['BoxColorInfo'][BOXTYPE]['S'] : the guideline style: S = Solid; D = Dashed</li>
  1815. * <li>['BoxColorInfo'][BOXTYPE]['D'] : dash array defining a pattern of dashes and gaps to be used in drawing dashed guidelines</li>
  1816. * <li>['trans'] : the style and duration of the visual transition to use when moving from another page to the given page during a presentation</li>
  1817. * <li>['trans']['Dur'] : The page's display duration (also called its advance timing): the maximum length of time, in seconds, that the page shall be displayed during presentations before the viewer application shall automatically advance to the next page.</li>
  1818. * <li>['trans']['S'] : transition style : Split, Blinds, Box, Wipe, Dissolve, Glitter, R, Fly, Push, Cover, Uncover, Fade</li>
  1819. * <li>['trans']['D'] : The duration of the transition effect, in seconds.</li>
  1820. * <li>['trans']['Dm'] : (Split and Blinds transition styles only) The dimension in which the specified transition effect shall occur: H = Horizontal, V = Vertical. Default value: H.</li>
  1821. * <li>['trans']['M'] : (Split, Box and Fly transition styles only) The direction of motion for the specified transition effect: I = Inward from the edges of the page, O = Outward from the center of the pageDefault value: I.</li>
  1822. * <li>['trans']['Di'] : (Wipe, Glitter, Fly, Cover, Uncover and Push transition styles only) The direction in which the specified transition effect shall moves, expressed in degrees counterclockwise starting from a left-to-right direction. If the value is a number, it shall be one of: 0 = Left to right, 90 = Bottom to top (Wipe only), 180 = Right to left (Wipe only), 270 = Top to bottom, 315 = Top-left to bottom-right (Glitter only). If the value is a name, it shall be None, which is relevant only for the Fly transition when the value of SS is not 1.0. Default value: 0.</li>
  1823. * <li>['trans']['SS'] : (Fly transition style only) The starting or ending scale at which the changes shall be drawn. If M specifies an inward transition, the scale of the changes drawn shall progress from SS to 1.0 over the course of the transition. If M specifies an outward transition, the scale of the changes drawn shall progress from 1.0 to SS over the course of the transition. Default: 1.0.</li>
  1824. * <li>['trans']['B'] : (Fly transition style only) If true, the area that shall be flown in is rectangular and opaque. Default: false.</li>
  1825. * </ul>
  1826. * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul>
  1827. * <li>P or Portrait (default)</li>
  1828. * <li>L or Landscape</li>
  1829. * <li>'' (empty string) for automatic orientation</li>
  1830. * </ul>
  1831. * @protected
  1832. * @since 3.0.015 (2008-06-06)
  1833. * @see getPageSizeFromFormat()
  1834. */
  1835. protected function setPageFormat($format, $orientation='P') {
  1836. if (!empty($format) AND isset($this->pagedim[$this->page])) {
  1837. // remove inherited values
  1838. unset($this->pagedim[$this->page]);
  1839. }
  1840. if (is_string($format)) {
  1841. // get page measures from format name
  1842. $pf = TCPDF_STATIC::getPageSizeFromFormat($format);
  1843. $this->fwPt = $pf[0];
  1844. $this->fhPt = $pf[1];
  1845. } else {
  1846. // the boundaries of the physical medium on which the page shall be displayed or printed
  1847. if (isset($format['MediaBox'])) {
  1848. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'MediaBox', $format['MediaBox']['llx'], $format['MediaBox']['lly'], $format['MediaBox']['urx'], $format['MediaBox']['ury'], false, $this->k, $this->pagedim);
  1849. $this->fwPt = (($format['MediaBox']['urx'] - $format['MediaBox']['llx']) * $this->k);
  1850. $this->fhPt = (($format['MediaBox']['ury'] - $format['MediaBox']['lly']) * $this->k);
  1851. } else {
  1852. if (isset($format[0]) AND is_numeric($format[0]) AND isset($format[1]) AND is_numeric($format[1])) {
  1853. $pf = array(($format[0] * $this->k), ($format[1] * $this->k));
  1854. } else {
  1855. if (!isset($format['format'])) {
  1856. // default value
  1857. $format['format'] = 'A4';
  1858. }
  1859. $pf = TCPDF_STATIC::getPageSizeFromFormat($format['format']);
  1860. }
  1861. $this->fwPt = $pf[0];
  1862. $this->fhPt = $pf[1];
  1863. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'MediaBox', 0, 0, $this->fwPt, $this->fhPt, true, $this->k, $this->pagedim);
  1864. }
  1865. // the visible region of default user space
  1866. if (isset($format['CropBox'])) {
  1867. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'CropBox', $format['CropBox']['llx'], $format['CropBox']['lly'], $format['CropBox']['urx'], $format['CropBox']['ury'], false, $this->k, $this->pagedim);
  1868. }
  1869. // the region to which the contents of the page shall be clipped when output in a production environment
  1870. if (isset($format['BleedBox'])) {
  1871. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'BleedBox', $format['BleedBox']['llx'], $format['BleedBox']['lly'], $format['BleedBox']['urx'], $format['BleedBox']['ury'], false, $this->k, $this->pagedim);
  1872. }
  1873. // the intended dimensions of the finished page after trimming
  1874. if (isset($format['TrimBox'])) {
  1875. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'TrimBox', $format['TrimBox']['llx'], $format['TrimBox']['lly'], $format['TrimBox']['urx'], $format['TrimBox']['ury'], false, $this->k, $this->pagedim);
  1876. }
  1877. // the page's meaningful content (including potential white space)
  1878. if (isset($format['ArtBox'])) {
  1879. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'ArtBox', $format['ArtBox']['llx'], $format['ArtBox']['lly'], $format['ArtBox']['urx'], $format['ArtBox']['ury'], false, $this->k, $this->pagedim);
  1880. }
  1881. // specify the colours and other visual characteristics that should be used in displaying guidelines on the screen for the various page boundaries
  1882. if (isset($format['BoxColorInfo'])) {
  1883. $this->pagedim[$this->page]['BoxColorInfo'] = $format['BoxColorInfo'];
  1884. }
  1885. if (isset($format['Rotate']) AND (($format['Rotate'] % 90) == 0)) {
  1886. // The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.
  1887. $this->pagedim[$this->page]['Rotate'] = intval($format['Rotate']);
  1888. }
  1889. if (isset($format['PZ'])) {
  1890. // The page's preferred zoom (magnification) factor
  1891. $this->pagedim[$this->page]['PZ'] = floatval($format['PZ']);
  1892. }
  1893. if (isset($format['trans'])) {
  1894. // The style and duration of the visual transition to use when moving from another page to the given page during a presentation
  1895. if (isset($format['trans']['Dur'])) {
  1896. // The page's display duration
  1897. $this->pagedim[$this->page]['trans']['Dur'] = floatval($format['trans']['Dur']);
  1898. }
  1899. $stansition_styles = array('Split', 'Blinds', 'Box', 'Wipe', 'Dissolve', 'Glitter', 'R', 'Fly', 'Push', 'Cover', 'Uncover', 'Fade');
  1900. if (isset($format['trans']['S']) AND in_array($format['trans']['S'], $stansition_styles)) {
  1901. // The transition style that shall be used when moving to this page from another during a presentation
  1902. $this->pagedim[$this->page]['trans']['S'] = $format['trans']['S'];
  1903. $valid_effect = array('Split', 'Blinds');
  1904. $valid_vals = array('H', 'V');
  1905. if (isset($format['trans']['Dm']) AND in_array($format['trans']['S'], $valid_effect) AND in_array($format['trans']['Dm'], $valid_vals)) {
  1906. $this->pagedim[$this->page]['trans']['Dm'] = $format['trans']['Dm'];
  1907. }
  1908. $valid_effect = array('Split', 'Box', 'Fly');
  1909. $valid_vals = array('I', 'O');
  1910. if (isset($format['trans']['M']) AND in_array($format['trans']['S'], $valid_effect) AND in_array($format['trans']['M'], $valid_vals)) {
  1911. $this->pagedim[$this->page]['trans']['M'] = $format['trans']['M'];
  1912. }
  1913. $valid_effect = array('Wipe', 'Glitter', 'Fly', 'Cover', 'Uncover', 'Push');
  1914. if (isset($format['trans']['Di']) AND in_array($format['trans']['S'], $valid_effect)) {
  1915. if (((($format['trans']['Di'] == 90) OR ($format['trans']['Di'] == 180)) AND ($format['trans']['S'] == 'Wipe'))
  1916. OR (($format['trans']['Di'] == 315) AND ($format['trans']['S'] == 'Glitter'))
  1917. OR (($format['trans']['Di'] == 0) OR ($format['trans']['Di'] == 270))) {
  1918. $this->pagedim[$this->page]['trans']['Di'] = intval($format['trans']['Di']);
  1919. }
  1920. }
  1921. if (isset($format['trans']['SS']) AND ($format['trans']['S'] == 'Fly')) {
  1922. $this->pagedim[$this->page]['trans']['SS'] = floatval($format['trans']['SS']);
  1923. }
  1924. if (isset($format['trans']['B']) AND ($format['trans']['B'] === true) AND ($format['trans']['S'] == 'Fly')) {
  1925. $this->pagedim[$this->page]['trans']['B'] = 'true';
  1926. }
  1927. } else {
  1928. $this->pagedim[$this->page]['trans']['S'] = 'R';
  1929. }
  1930. if (isset($format['trans']['D'])) {
  1931. // The duration of the transition effect, in seconds
  1932. $this->pagedim[$this->page]['trans']['D'] = floatval($format['trans']['D']);
  1933. } else {
  1934. $this->pagedim[$this->page]['trans']['D'] = 1;
  1935. }
  1936. }
  1937. }
  1938. $this->setPageOrientation($orientation);
  1939. }
  1940. /**
  1941. * Set page orientation.
  1942. * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li><li>'' (empty string) for automatic orientation</li></ul>
  1943. * @param $autopagebreak (boolean) Boolean indicating if auto-page-break mode should be on or off.
  1944. * @param $bottommargin (float) bottom margin of the page.
  1945. * @public
  1946. * @since 3.0.015 (2008-06-06)
  1947. */
  1948. public function setPageOrientation($orientation, $autopagebreak='', $bottommargin='') {
  1949. if (!isset($this->pagedim[$this->page]['MediaBox'])) {
  1950. // the boundaries of the physical medium on which the page shall be displayed or printed
  1951. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'MediaBox', 0, 0, $this->fwPt, $this->fhPt, true, $this->k, $this->pagedim);
  1952. }
  1953. if (!isset($this->pagedim[$this->page]['CropBox'])) {
  1954. // the visible region of default user space
  1955. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'CropBox', $this->pagedim[$this->page]['MediaBox']['llx'], $this->pagedim[$this->page]['MediaBox']['lly'], $this->pagedim[$this->page]['MediaBox']['urx'], $this->pagedim[$this->page]['MediaBox']['ury'], true, $this->k, $this->pagedim);
  1956. }
  1957. if (!isset($this->pagedim[$this->page]['BleedBox'])) {
  1958. // the region to which the contents of the page shall be clipped when output in a production environment
  1959. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'BleedBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true, $this->k, $this->pagedim);
  1960. }
  1961. if (!isset($this->pagedim[$this->page]['TrimBox'])) {
  1962. // the intended dimensions of the finished page after trimming
  1963. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'TrimBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true, $this->k, $this->pagedim);
  1964. }
  1965. if (!isset($this->pagedim[$this->page]['ArtBox'])) {
  1966. // the page's meaningful content (including potential white space)
  1967. $this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'ArtBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true, $this->k, $this->pagedim);
  1968. }
  1969. if (!isset($this->pagedim[$this->page]['Rotate'])) {
  1970. // The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.
  1971. $this->pagedim[$this->page]['Rotate'] = 0;
  1972. }
  1973. if (!isset($this->pagedim[$this->page]['PZ'])) {
  1974. // The page's preferred zoom (magnification) factor
  1975. $this->pagedim[$this->page]['PZ'] = 1;
  1976. }
  1977. if ($this->fwPt > $this->fhPt) {
  1978. // landscape
  1979. $default_orientation = 'L';
  1980. } else {
  1981. // portrait
  1982. $default_orientation = 'P';
  1983. }
  1984. $valid_orientations = array('P', 'L');
  1985. if (empty($orientation)) {
  1986. $orientation = $default_orientation;
  1987. } else {
  1988. $orientation = strtoupper($orientation{0});
  1989. }
  1990. if (in_array($orientation, $valid_orientations) AND ($orientation != $default_orientation)) {
  1991. $this->CurOrientation = $orientation;
  1992. $this->wPt = $this->fhPt;
  1993. $this->hPt = $this->fwPt;
  1994. } else {
  1995. $this->CurOrientation = $default_orientation;
  1996. $this->wPt = $this->fwPt;
  1997. $this->hPt = $this->fhPt;
  1998. }
  1999. if ((abs($this->pagedim[$this->page]['MediaBox']['urx'] - $this->hPt) < $this->feps) AND (abs($this->pagedim[$this->page]['MediaBox']['ury'] - $this->wPt) < $this->feps)){
  2000. // swap X and Y coordinates (change page orientation)
  2001. $this->pagedim = TCPDF_STATIC::swapPageBoxCoordinates($this->page, $this->pagedim);
  2002. }
  2003. $this->w = ($this->wPt / $this->k);
  2004. $this->h = ($this->hPt / $this->k);
  2005. if (TCPDF_STATIC::empty_string($autopagebreak)) {
  2006. if (isset($this->AutoPageBreak)) {
  2007. $autopagebreak = $this->AutoPageBreak;
  2008. } else {
  2009. $autopagebreak = true;
  2010. }
  2011. }
  2012. if (TCPDF_STATIC::empty_string($bottommargin)) {
  2013. if (isset($this->bMargin)) {
  2014. $bottommargin = $this->bMargin;
  2015. } else {
  2016. // default value = 2 cm
  2017. $bottommargin = 2 * 28.35 / $this->k;
  2018. }
  2019. }
  2020. $this->SetAutoPageBreak($autopagebreak, $bottommargin);
  2021. // store page dimensions
  2022. $this->pagedim[$this->page]['w'] = $this->wPt;
  2023. $this->pagedim[$this->page]['h'] = $this->hPt;
  2024. $this->pagedim[$this->page]['wk'] = $this->w;
  2025. $this->pagedim[$this->page]['hk'] = $this->h;
  2026. $this->pagedim[$this->page]['tm'] = $this->tMargin;
  2027. $this->pagedim[$this->page]['bm'] = $bottommargin;
  2028. $this->pagedim[$this->page]['lm'] = $this->lMargin;
  2029. $this->pagedim[$this->page]['rm'] = $this->rMargin;
  2030. $this->pagedim[$this->page]['pb'] = $autopagebreak;
  2031. $this->pagedim[$this->page]['or'] = $this->CurOrientation;
  2032. $this->pagedim[$this->page]['olm'] = $this->original_lMargin;
  2033. $this->pagedim[$this->page]['orm'] = $this->original_rMargin;
  2034. }
  2035. /**
  2036. * Set regular expression to detect withespaces or word separators.
  2037. * The pattern delimiter must be the forward-slash character "/".
  2038. * Some example patterns are:
  2039. * <pre>
  2040. * Non-Unicode or missing PCRE unicode support: "/[^\S\xa0]/"
  2041. * Unicode and PCRE unicode support: "/[^\S\P{Z}\xa0]/u"
  2042. * Unicode and PCRE unicode support in Chinese mode: "/[^\S\P{Z}\P{Lo}\xa0]/u"
  2043. * if PCRE unicode support is turned ON ("\P" is the negate class of "\p"):
  2044. * "\p{Z}" or "\p{Separator}": any kind of Unicode whitespace or invisible separator.
  2045. * "\p{Lo}" or "\p{Other_Letter}": a Unicode letter or ideograph that does not have lowercase and uppercase variants.
  2046. * "\p{Lo}" is needed for Chinese characters because are packed next to each other without spaces in between.
  2047. * </pre>
  2048. * @param $re (string) regular expression (leave empty for default).
  2049. * @public
  2050. * @since 4.6.016 (2009-06-15)
  2051. */
  2052. public function setSpacesRE($re='/[^\S\xa0]/') {
  2053. $this->re_spaces = $re;
  2054. $re_parts = explode('/', $re);
  2055. // get pattern parts
  2056. $this->re_space = array();
  2057. if (isset($re_parts[1]) AND !empty($re_parts[1])) {
  2058. $this->re_space['p'] = $re_parts[1];
  2059. } else {
  2060. $this->re_space['p'] = '[\s]';
  2061. }
  2062. // set pattern modifiers
  2063. if (isset($re_parts[2]) AND !empty($re_parts[2])) {
  2064. $this->re_space['m'] = $re_parts[2];
  2065. } else {
  2066. $this->re_space['m'] = '';
  2067. }
  2068. }
  2069. /**
  2070. * Enable or disable Right-To-Left language mode
  2071. * @param $enable (Boolean) if true enable Right-To-Left language mode.
  2072. * @param $resetx (Boolean) if true reset the X position on direction change.
  2073. * @public
  2074. * @since 2.0.000 (2008-01-03)
  2075. */
  2076. public function setRTL($enable, $resetx=true) {
  2077. $enable = $enable ? true : false;
  2078. $resetx = ($resetx AND ($enable != $this->rtl));
  2079. $this->rtl = $enable;
  2080. $this->tmprtl = false;
  2081. if ($resetx) {
  2082. $this->Ln(0);
  2083. }
  2084. }
  2085. /**
  2086. * Return the RTL status
  2087. * @return boolean
  2088. * @public
  2089. * @since 4.0.012 (2008-07-24)
  2090. */
  2091. public function getRTL() {
  2092. return $this->rtl;
  2093. }
  2094. /**
  2095. * Force temporary RTL language direction
  2096. * @param $mode (mixed) can be false, 'L' for LTR or 'R' for RTL
  2097. * @public
  2098. * @since 2.1.000 (2008-01-09)
  2099. */
  2100. public function setTempRTL($mode) {
  2101. $newmode = false;
  2102. switch (strtoupper($mode)) {
  2103. case 'LTR':
  2104. case 'L': {
  2105. if ($this->rtl) {
  2106. $newmode = 'L';
  2107. }
  2108. break;
  2109. }
  2110. case 'RTL':
  2111. case 'R': {
  2112. if (!$this->rtl) {
  2113. $newmode = 'R';
  2114. }
  2115. break;
  2116. }
  2117. case false:
  2118. default: {
  2119. $newmode = false;
  2120. break;
  2121. }
  2122. }
  2123. $this->tmprtl = $newmode;
  2124. }
  2125. /**
  2126. * Return the current temporary RTL status
  2127. * @return boolean
  2128. * @public
  2129. * @since 4.8.014 (2009-11-04)
  2130. */
  2131. public function isRTLTextDir() {
  2132. return ($this->rtl OR ($this->tmprtl == 'R'));
  2133. }
  2134. /**
  2135. * Set the last cell height.
  2136. * @param $h (float) cell height.
  2137. * @author Nicola Asuni
  2138. * @public
  2139. * @since 1.53.0.TC034
  2140. */
  2141. public function setLastH($h) {
  2142. $this->lasth = $h;
  2143. }
  2144. /**
  2145. * Reset the last cell height.
  2146. * @public
  2147. * @since 5.9.000 (2010-10-03)
  2148. */
  2149. public function resetLastH() {
  2150. $this->lasth = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B'];
  2151. }
  2152. /**
  2153. * Get the last cell height.
  2154. * @return last cell height
  2155. * @public
  2156. * @since 4.0.017 (2008-08-05)
  2157. */
  2158. public function getLastH() {
  2159. return $this->lasth;
  2160. }
  2161. /**
  2162. * Set the adjusting factor to convert pixels to user units.
  2163. * @param $scale (float) adjusting factor to convert pixels to user units.
  2164. * @author Nicola Asuni
  2165. * @public
  2166. * @since 1.5.2
  2167. */
  2168. public function setImageScale($scale) {
  2169. $this->imgscale = $scale;
  2170. }
  2171. /**
  2172. * Returns the adjusting factor to convert pixels to user units.
  2173. * @return float adjusting factor to convert pixels to user units.
  2174. * @author Nicola Asuni
  2175. * @public
  2176. * @since 1.5.2
  2177. */
  2178. public function getImageScale() {
  2179. return $this->imgscale;
  2180. }
  2181. /**
  2182. * Returns an array of page dimensions:
  2183. * <ul><li>$this->pagedim[$this->page]['w'] = page width in points</li><li>$this->pagedim[$this->page]['h'] = height in points</li><li>$this->pagedim[$this->page]['wk'] = page width in user units</li><li>$this->pagedim[$this->page]['hk'] = page height in user units</li><li>$this->pagedim[$this->page]['tm'] = top margin</li><li>$this->pagedim[$this->page]['bm'] = bottom margin</li><li>$this->pagedim[$this->page]['lm'] = left margin</li><li>$this->pagedim[$this->page]['rm'] = right margin</li><li>$this->pagedim[$this->page]['pb'] = auto page break</li><li>$this->pagedim[$this->page]['or'] = page orientation</li><li>$this->pagedim[$this->page]['olm'] = original left margin</li><li>$this->pagedim[$this->page]['orm'] = original right margin</li><li>$this->pagedim[$this->page]['Rotate'] = The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.</li><li>$this->pagedim[$this->page]['PZ'] = The page's preferred zoom (magnification) factor.</li><li>$this->pagedim[$this->page]['trans'] : the style and duration of the visual transition to use when moving from another page to the given page during a presentation<ul><li>$this->pagedim[$this->page]['trans']['Dur'] = The page's display duration (also called its advance timing): the maximum length of time, in seconds, that the page shall be displayed during presentations before the viewer application shall automatically advance to the next page.</li><li>$this->pagedim[$this->page]['trans']['S'] = transition style : Split, Blinds, Box, Wipe, Dissolve, Glitter, R, Fly, Push, Cover, Uncover, Fade</li><li>$this->pagedim[$this->page]['trans']['D'] = The duration of the transition effect, in seconds.</li><li>$this->pagedim[$this->page]['trans']['Dm'] = (Split and Blinds transition styles only) The dimension in which the specified transition effect shall occur: H = Horizontal, V = Vertical. Default value: H.</li><li>$this->pagedim[$this->page]['trans']['M'] = (Split, Box and Fly transition styles only) The direction of motion for the specified transition effect: I = Inward from the edges of the page, O = Outward from the center of the pageDefault value: I.</li><li>$this->pagedim[$this->page]['trans']['Di'] = (Wipe, Glitter, Fly, Cover, Uncover and Push transition styles only) The direction in which the specified transition effect shall moves, expressed in degrees counterclockwise starting from a left-to-right direction. If the value is a number, it shall be one of: 0 = Left to right, 90 = Bottom to top (Wipe only), 180 = Right to left (Wipe only), 270 = Top to bottom, 315 = Top-left to bottom-right (Glitter only). If the value is a name, it shall be None, which is relevant only for the Fly transition when the value of SS is not 1.0. Default value: 0.</li><li>$this->pagedim[$this->page]['trans']['SS'] = (Fly transition style only) The starting or ending scale at which the changes shall be drawn. If M specifies an inward transition, the scale of the changes drawn shall progress from SS to 1.0 over the course of the transition. If M specifies an outward transition, the scale of the changes drawn shall progress from 1.0 to SS over the course of the transition. Default: 1.0. </li><li>$this->pagedim[$this->page]['trans']['B'] = (Fly transition style only) If true, the area that shall be flown in is rectangular and opaque. Default: false.</li></ul></li><li>$this->pagedim[$this->page]['MediaBox'] : the boundaries of the physical medium on which the page shall be displayed or printed<ul><li>$this->pagedim[$this->page]['MediaBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['MediaBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['MediaBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['MediaBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['CropBox'] : the visible region of default user space<ul><li>$this->pagedim[$this->page]['CropBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['CropBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['CropBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['CropBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['BleedBox'] : the region to which the contents of the page shall be clipped when output in a production environment<ul><li>$this->pagedim[$this->page]['BleedBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['BleedBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['BleedBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['BleedBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['TrimBox'] : the intended dimensions of the finished page after trimming<ul><li>$this->pagedim[$this->page]['TrimBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['TrimBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['TrimBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['TrimBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['ArtBox'] : the extent of the page's meaningful content<ul><li>$this->pagedim[$this->page]['ArtBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['ArtBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['ArtBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['ArtBox']['ury'] = upper-right y coordinate in points</li></ul></li></ul>
  2184. * @param $pagenum (int) page number (empty = current page)
  2185. * @return array of page dimensions.
  2186. * @author Nicola Asuni
  2187. * @public
  2188. * @since 4.5.027 (2009-03-16)
  2189. */
  2190. public function getPageDimensions($pagenum='') {
  2191. if (empty($pagenum)) {
  2192. $pagenum = $this->page;
  2193. }
  2194. return $this->pagedim[$pagenum];
  2195. }
  2196. /**
  2197. * Returns the page width in units.
  2198. * @param $pagenum (int) page number (empty = current page)
  2199. * @return int page width.
  2200. * @author Nicola Asuni
  2201. * @public
  2202. * @since 1.5.2
  2203. * @see getPageDimensions()
  2204. */
  2205. public function getPageWidth($pagenum='') {
  2206. if (empty($pagenum)) {
  2207. return $this->w;
  2208. }
  2209. return $this->pagedim[$pagenum]['w'];
  2210. }
  2211. /**
  2212. * Returns the page height in units.
  2213. * @param $pagenum (int) page number (empty = current page)
  2214. * @return int page height.
  2215. * @author Nicola Asuni
  2216. * @public
  2217. * @since 1.5.2
  2218. * @see getPageDimensions()
  2219. */
  2220. public function getPageHeight($pagenum='') {
  2221. if (empty($pagenum)) {
  2222. return $this->h;
  2223. }
  2224. return $this->pagedim[$pagenum]['h'];
  2225. }
  2226. /**
  2227. * Returns the page break margin.
  2228. * @param $pagenum (int) page number (empty = current page)
  2229. * @return int page break margin.
  2230. * @author Nicola Asuni
  2231. * @public
  2232. * @since 1.5.2
  2233. * @see getPageDimensions()
  2234. */
  2235. public function getBreakMargin($pagenum='') {
  2236. if (empty($pagenum)) {
  2237. return $this->bMargin;
  2238. }
  2239. return $this->pagedim[$pagenum]['bm'];
  2240. }
  2241. /**
  2242. * Returns the scale factor (number of points in user unit).
  2243. * @return int scale factor.
  2244. * @author Nicola Asuni
  2245. * @public
  2246. * @since 1.5.2
  2247. */
  2248. public function getScaleFactor() {
  2249. return $this->k;
  2250. }
  2251. /**
  2252. * Defines the left, top and right margins.
  2253. * @param $left (float) Left margin.
  2254. * @param $top (float) Top margin.
  2255. * @param $right (float) Right margin. Default value is the left one.
  2256. * @param $keepmargins (boolean) if true overwrites the default page margins
  2257. * @public
  2258. * @since 1.0
  2259. * @see SetLeftMargin(), SetTopMargin(), SetRightMargin(), SetAutoPageBreak()
  2260. */
  2261. public function SetMargins($left, $top, $right=-1, $keepmargins=false) {
  2262. //Set left, top and right margins
  2263. $this->lMargin = $left;
  2264. $this->tMargin = $top;
  2265. if ($right == -1) {
  2266. $right = $left;
  2267. }
  2268. $this->rMargin = $right;
  2269. if ($keepmargins) {
  2270. // overwrite original values
  2271. $this->original_lMargin = $this->lMargin;
  2272. $this->original_rMargin = $this->rMargin;
  2273. }
  2274. }
  2275. /**
  2276. * Defines the left margin. The method can be called before creating the first page. If the current abscissa gets out of page, it is brought back to the margin.
  2277. * @param $margin (float) The margin.
  2278. * @public
  2279. * @since 1.4
  2280. * @see SetTopMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins()
  2281. */
  2282. public function SetLeftMargin($margin) {
  2283. //Set left margin
  2284. $this->lMargin = $margin;
  2285. if (($this->page > 0) AND ($this->x < $margin)) {
  2286. $this->x = $margin;
  2287. }
  2288. }
  2289. /**
  2290. * Defines the top margin. The method can be called before creating the first page.
  2291. * @param $margin (float) The margin.
  2292. * @public
  2293. * @since 1.5
  2294. * @see SetLeftMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins()
  2295. */
  2296. public function SetTopMargin($margin) {
  2297. //Set top margin
  2298. $this->tMargin = $margin;
  2299. if (($this->page > 0) AND ($this->y < $margin)) {
  2300. $this->y = $margin;
  2301. }
  2302. }
  2303. /**
  2304. * Defines the right margin. The method can be called before creating the first page.
  2305. * @param $margin (float) The margin.
  2306. * @public
  2307. * @since 1.5
  2308. * @see SetLeftMargin(), SetTopMargin(), SetAutoPageBreak(), SetMargins()
  2309. */
  2310. public function SetRightMargin($margin) {
  2311. $this->rMargin = $margin;
  2312. if (($this->page > 0) AND ($this->x > ($this->w - $margin))) {
  2313. $this->x = $this->w - $margin;
  2314. }
  2315. }
  2316. /**
  2317. * Set the same internal Cell padding for top, right, bottom, left-
  2318. * @param $pad (float) internal padding.
  2319. * @public
  2320. * @since 2.1.000 (2008-01-09)
  2321. * @see getCellPaddings(), setCellPaddings()
  2322. */
  2323. public function SetCellPadding($pad) {
  2324. if ($pad >= 0) {
  2325. $this->cell_padding['L'] = $pad;
  2326. $this->cell_padding['T'] = $pad;
  2327. $this->cell_padding['R'] = $pad;
  2328. $this->cell_padding['B'] = $pad;
  2329. }
  2330. }
  2331. /**
  2332. * Set the internal Cell paddings.
  2333. * @param $left (float) left padding
  2334. * @param $top (float) top padding
  2335. * @param $right (float) right padding
  2336. * @param $bottom (float) bottom padding
  2337. * @public
  2338. * @since 5.9.000 (2010-10-03)
  2339. * @see getCellPaddings(), SetCellPadding()
  2340. */
  2341. public function setCellPaddings($left='', $top='', $right='', $bottom='') {
  2342. if (($left !== '') AND ($left >= 0)) {
  2343. $this->cell_padding['L'] = $left;
  2344. }
  2345. if (($top !== '') AND ($top >= 0)) {
  2346. $this->cell_padding['T'] = $top;
  2347. }
  2348. if (($right !== '') AND ($right >= 0)) {
  2349. $this->cell_padding['R'] = $right;
  2350. }
  2351. if (($bottom !== '') AND ($bottom >= 0)) {
  2352. $this->cell_padding['B'] = $bottom;
  2353. }
  2354. }
  2355. /**
  2356. * Get the internal Cell padding array.
  2357. * @return array of padding values
  2358. * @public
  2359. * @since 5.9.000 (2010-10-03)
  2360. * @see setCellPaddings(), SetCellPadding()
  2361. */
  2362. public function getCellPaddings() {
  2363. return $this->cell_padding;
  2364. }
  2365. /**
  2366. * Set the internal Cell margins.
  2367. * @param $left (float) left margin
  2368. * @param $top (float) top margin
  2369. * @param $right (float) right margin
  2370. * @param $bottom (float) bottom margin
  2371. * @public
  2372. * @since 5.9.000 (2010-10-03)
  2373. * @see getCellMargins()
  2374. */
  2375. public function setCellMargins($left='', $top='', $right='', $bottom='') {
  2376. if (($left !== '') AND ($left >= 0)) {
  2377. $this->cell_margin['L'] = $left;
  2378. }
  2379. if (($top !== '') AND ($top >= 0)) {
  2380. $this->cell_margin['T'] = $top;
  2381. }
  2382. if (($right !== '') AND ($right >= 0)) {
  2383. $this->cell_margin['R'] = $right;
  2384. }
  2385. if (($bottom !== '') AND ($bottom >= 0)) {
  2386. $this->cell_margin['B'] = $bottom;
  2387. }
  2388. }
  2389. /**
  2390. * Get the internal Cell margin array.
  2391. * @return array of margin values
  2392. * @public
  2393. * @since 5.9.000 (2010-10-03)
  2394. * @see setCellMargins()
  2395. */
  2396. public function getCellMargins() {
  2397. return $this->cell_margin;
  2398. }
  2399. /**
  2400. * Adjust the internal Cell padding array to take account of the line width.
  2401. * @param $brd (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
  2402. * @return array of adjustments
  2403. * @public
  2404. * @since 5.9.000 (2010-10-03)
  2405. */
  2406. protected function adjustCellPadding($brd=0) {
  2407. if (empty($brd)) {
  2408. return;
  2409. }
  2410. if (is_string($brd)) {
  2411. // convert string to array
  2412. $slen = strlen($brd);
  2413. $newbrd = array();
  2414. for ($i = 0; $i < $slen; ++$i) {
  2415. $newbrd[$brd[$i]] = true;
  2416. }
  2417. $brd = $newbrd;
  2418. } elseif (($brd === 1) OR ($brd === true) OR (is_numeric($brd) AND (intval($brd) > 0))) {
  2419. $brd = array('LRTB' => true);
  2420. }
  2421. if (!is_array($brd)) {
  2422. return;
  2423. }
  2424. // store current cell padding
  2425. $cp = $this->cell_padding;
  2426. // select border mode
  2427. if (isset($brd['mode'])) {
  2428. $mode = $brd['mode'];
  2429. unset($brd['mode']);
  2430. } else {
  2431. $mode = 'normal';
  2432. }
  2433. // process borders
  2434. foreach ($brd as $border => $style) {
  2435. $line_width = $this->LineWidth;
  2436. if (is_array($style) AND isset($style['width'])) {
  2437. // get border width
  2438. $line_width = $style['width'];
  2439. }
  2440. $adj = 0; // line width inside the cell
  2441. switch ($mode) {
  2442. case 'ext': {
  2443. $adj = 0;
  2444. break;
  2445. }
  2446. case 'int': {
  2447. $adj = $line_width;
  2448. break;
  2449. }
  2450. case 'normal':
  2451. default: {
  2452. $adj = ($line_width / 2);
  2453. break;
  2454. }
  2455. }
  2456. // correct internal cell padding if required to avoid overlap between text and lines
  2457. if ((strpos($border,'T') !== false) AND ($this->cell_padding['T'] < $adj)) {
  2458. $this->cell_padding['T'] = $adj;
  2459. }
  2460. if ((strpos($border,'R') !== false) AND ($this->cell_padding['R'] < $adj)) {
  2461. $this->cell_padding['R'] = $adj;
  2462. }
  2463. if ((strpos($border,'B') !== false) AND ($this->cell_padding['B'] < $adj)) {
  2464. $this->cell_padding['B'] = $adj;
  2465. }
  2466. if ((strpos($border,'L') !== false) AND ($this->cell_padding['L'] < $adj)) {
  2467. $this->cell_padding['L'] = $adj;
  2468. }
  2469. }
  2470. return array('T' => ($this->cell_padding['T'] - $cp['T']), 'R' => ($this->cell_padding['R'] - $cp['R']), 'B' => ($this->cell_padding['B'] - $cp['B']), 'L' => ($this->cell_padding['L'] - $cp['L']));
  2471. }
  2472. /**
  2473. * Enables or disables the automatic page breaking mode. When enabling, the second parameter is the distance from the bottom of the page that defines the triggering limit. By default, the mode is on and the margin is 2 cm.
  2474. * @param $auto (boolean) Boolean indicating if mode should be on or off.
  2475. * @param $margin (float) Distance from the bottom of the page.
  2476. * @public
  2477. * @since 1.0
  2478. * @see Cell(), MultiCell(), AcceptPageBreak()
  2479. */
  2480. public function SetAutoPageBreak($auto, $margin=0) {
  2481. $this->AutoPageBreak = $auto ? true : false;
  2482. $this->bMargin = $margin;
  2483. $this->PageBreakTrigger = $this->h - $margin;
  2484. }
  2485. /**
  2486. * Return the auto-page-break mode (true or false).
  2487. * @return boolean auto-page-break mode
  2488. * @public
  2489. * @since 5.9.088
  2490. */
  2491. public function getAutoPageBreak() {
  2492. return $this->AutoPageBreak;
  2493. }
  2494. /**
  2495. * Defines the way the document is to be displayed by the viewer.
  2496. * @param $zoom (mixed) The zoom to use. It can be one of the following string values or a number indicating the zooming factor to use. <ul><li>fullpage: displays the entire page on screen </li><li>fullwidth: uses maximum width of window</li><li>real: uses real size (equivalent to 100% zoom)</li><li>default: uses viewer default mode</li></ul>
  2497. * @param $layout (string) The page layout. Possible values are:<ul><li>SinglePage Display one page at a time</li><li>OneColumn Display the pages in one column</li><li>TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left</li><li>TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right</li><li>TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left</li><li>TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right</li></ul>
  2498. * @param $mode (string) A name object specifying how the document should be displayed when opened:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible</li><li>UseOC (PDF 1.5) Optional content group panel visible</li><li>UseAttachments (PDF 1.6) Attachments panel visible</li></ul>
  2499. * @public
  2500. * @since 1.2
  2501. */
  2502. public function SetDisplayMode($zoom, $layout='SinglePage', $mode='UseNone') {
  2503. if (($zoom == 'fullpage') OR ($zoom == 'fullwidth') OR ($zoom == 'real') OR ($zoom == 'default') OR (!is_string($zoom))) {
  2504. $this->ZoomMode = $zoom;
  2505. } else {
  2506. $this->Error('Incorrect zoom display mode: '.$zoom);
  2507. }
  2508. $this->LayoutMode = TCPDF_STATIC::getPageLayoutMode($layout);
  2509. $this->PageMode = TCPDF_STATIC::getPageMode($mode);
  2510. }
  2511. /**
  2512. * Activates or deactivates page compression. When activated, the internal representation of each page is compressed, which leads to a compression ratio of about 2 for the resulting document. Compression is on by default.
  2513. * Note: the Zlib extension is required for this feature. If not present, compression will be turned off.
  2514. * @param $compress (boolean) Boolean indicating if compression must be enabled.
  2515. * @public
  2516. * @since 1.4
  2517. */
  2518. public function SetCompression($compress=true) {
  2519. if (function_exists('gzcompress')) {
  2520. $this->compress = $compress ? true : false;
  2521. } else {
  2522. $this->compress = false;
  2523. }
  2524. }
  2525. /**
  2526. * Set flag to force sRGB_IEC61966-2.1 black scaled ICC color profile for the whole document.
  2527. * @param $mode (boolean) If true force sRGB output intent.
  2528. * @public
  2529. * @since 5.9.121 (2011-09-28)
  2530. */
  2531. public function setSRGBmode($mode=false) {
  2532. $this->force_srgb = $mode ? true : false;
  2533. }
  2534. /**
  2535. * Turn on/off Unicode mode for document information dictionary (meta tags).
  2536. * This has effect only when unicode mode is set to false.
  2537. * @param $unicode (boolean) if true set the meta information in Unicode
  2538. * @since 5.9.027 (2010-12-01)
  2539. * @public
  2540. */
  2541. public function SetDocInfoUnicode($unicode=true) {
  2542. $this->docinfounicode = $unicode ? true : false;
  2543. }
  2544. /**
  2545. * Defines the title of the document.
  2546. * @param $title (string) The title.
  2547. * @public
  2548. * @since 1.2
  2549. * @see SetAuthor(), SetCreator(), SetKeywords(), SetSubject()
  2550. */
  2551. public function SetTitle($title) {
  2552. $this->title = $title;
  2553. }
  2554. /**
  2555. * Defines the subject of the document.
  2556. * @param $subject (string) The subject.
  2557. * @public
  2558. * @since 1.2
  2559. * @see SetAuthor(), SetCreator(), SetKeywords(), SetTitle()
  2560. */
  2561. public function SetSubject($subject) {
  2562. $this->subject = $subject;
  2563. }
  2564. /**
  2565. * Defines the author of the document.
  2566. * @param $author (string) The name of the author.
  2567. * @public
  2568. * @since 1.2
  2569. * @see SetCreator(), SetKeywords(), SetSubject(), SetTitle()
  2570. */
  2571. public function SetAuthor($author) {
  2572. $this->author = $author;
  2573. }
  2574. /**
  2575. * Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'.
  2576. * @param $keywords (string) The list of keywords.
  2577. * @public
  2578. * @since 1.2
  2579. * @see SetAuthor(), SetCreator(), SetSubject(), SetTitle()
  2580. */
  2581. public function SetKeywords($keywords) {
  2582. $this->keywords = $keywords;
  2583. }
  2584. /**
  2585. * Defines the creator of the document. This is typically the name of the application that generates the PDF.
  2586. * @param $creator (string) The name of the creator.
  2587. * @public
  2588. * @since 1.2
  2589. * @see SetAuthor(), SetKeywords(), SetSubject(), SetTitle()
  2590. */
  2591. public function SetCreator($creator) {
  2592. $this->creator = $creator;
  2593. }
  2594. /**
  2595. * Throw an exception or print an error message and die if the K_TCPDF_PARSER_THROW_EXCEPTION_ERROR constant is set to true.
  2596. * @param $msg (string) The error message
  2597. * @public
  2598. * @since 1.0
  2599. */
  2600. public function Error($msg) {
  2601. // unset all class variables
  2602. $this->_destroy(true);
  2603. if (defined('K_TCPDF_THROW_EXCEPTION_ERROR') AND !K_TCPDF_THROW_EXCEPTION_ERROR) {
  2604. die('<strong>TCPDF ERROR: </strong>'.$msg);
  2605. } else {
  2606. throw new Exception('TCPDF ERROR: '.$msg);
  2607. }
  2608. }
  2609. /**
  2610. * This method begins the generation of the PDF document.
  2611. * It is not necessary to call it explicitly because AddPage() does it automatically.
  2612. * Note: no page is created by this method
  2613. * @public
  2614. * @since 1.0
  2615. * @see AddPage(), Close()
  2616. */
  2617. public function Open() {
  2618. $this->state = 1;
  2619. }
  2620. /**
  2621. * Terminates the PDF document.
  2622. * It is not necessary to call this method explicitly because Output() does it automatically.
  2623. * If the document contains no page, AddPage() is called to prevent from getting an invalid document.
  2624. * @public
  2625. * @since 1.0
  2626. * @see Open(), Output()
  2627. */
  2628. public function Close() {
  2629. if ($this->state == 3) {
  2630. return;
  2631. }
  2632. if ($this->page == 0) {
  2633. $this->AddPage();
  2634. }
  2635. $this->endLayer();
  2636. if ($this->tcpdflink) {
  2637. // save current graphic settings
  2638. $gvars = $this->getGraphicVars();
  2639. $this->setEqualColumns();
  2640. $this->lastpage(true);
  2641. $this->SetAutoPageBreak(false);
  2642. $this->x = 0;
  2643. $this->y = $this->h - (1 / $this->k);
  2644. $this->lMargin = 0;
  2645. $this->_out('q');
  2646. $font = defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica';
  2647. $this->SetFont($font, '', 1);
  2648. $this->setTextRenderingMode(0, false, false);
  2649. $msg = "\x50\x6f\x77\x65\x72\x65\x64\x20\x62\x79\x20\x54\x43\x50\x44\x46\x20\x28\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29";
  2650. $lnk = "\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67";
  2651. $this->Cell(0, 0, $msg, 0, 0, 'L', 0, $lnk, 0, false, 'D', 'B');
  2652. $this->_out('Q');
  2653. // restore graphic settings
  2654. $this->setGraphicVars($gvars);
  2655. }
  2656. // close page
  2657. $this->endPage();
  2658. // close document
  2659. $this->_enddoc();
  2660. // unset all class variables (except critical ones)
  2661. $this->_destroy(false);
  2662. }
  2663. /**
  2664. * Move pointer at the specified document page and update page dimensions.
  2665. * @param $pnum (int) page number (1 ... numpages)
  2666. * @param $resetmargins (boolean) if true reset left, right, top margins and Y position.
  2667. * @public
  2668. * @since 2.1.000 (2008-01-07)
  2669. * @see getPage(), lastpage(), getNumPages()
  2670. */
  2671. public function setPage($pnum, $resetmargins=false) {
  2672. if (($pnum == $this->page) AND ($this->state == 2)) {
  2673. return;
  2674. }
  2675. if (($pnum > 0) AND ($pnum <= $this->numpages)) {
  2676. $this->state = 2;
  2677. // save current graphic settings
  2678. //$gvars = $this->getGraphicVars();
  2679. $oldpage = $this->page;
  2680. $this->page = $pnum;
  2681. $this->wPt = $this->pagedim[$this->page]['w'];
  2682. $this->hPt = $this->pagedim[$this->page]['h'];
  2683. $this->w = $this->pagedim[$this->page]['wk'];
  2684. $this->h = $this->pagedim[$this->page]['hk'];
  2685. $this->tMargin = $this->pagedim[$this->page]['tm'];
  2686. $this->bMargin = $this->pagedim[$this->page]['bm'];
  2687. $this->original_lMargin = $this->pagedim[$this->page]['olm'];
  2688. $this->original_rMargin = $this->pagedim[$this->page]['orm'];
  2689. $this->AutoPageBreak = $this->pagedim[$this->page]['pb'];
  2690. $this->CurOrientation = $this->pagedim[$this->page]['or'];
  2691. $this->SetAutoPageBreak($this->AutoPageBreak, $this->bMargin);
  2692. // restore graphic settings
  2693. //$this->setGraphicVars($gvars);
  2694. if ($resetmargins) {
  2695. $this->lMargin = $this->pagedim[$this->page]['olm'];
  2696. $this->rMargin = $this->pagedim[$this->page]['orm'];
  2697. $this->SetY($this->tMargin);
  2698. } else {
  2699. // account for booklet mode
  2700. if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) {
  2701. $deltam = $this->pagedim[$this->page]['olm'] - $this->pagedim[$this->page]['orm'];
  2702. $this->lMargin += $deltam;
  2703. $this->rMargin -= $deltam;
  2704. }
  2705. }
  2706. } else {
  2707. $this->Error('Wrong page number on setPage() function: '.$pnum);
  2708. }
  2709. }
  2710. /**
  2711. * Reset pointer to the last document page.
  2712. * @param $resetmargins (boolean) if true reset left, right, top margins and Y position.
  2713. * @public
  2714. * @since 2.0.000 (2008-01-04)
  2715. * @see setPage(), getPage(), getNumPages()
  2716. */
  2717. public function lastPage($resetmargins=false) {
  2718. $this->setPage($this->getNumPages(), $resetmargins);
  2719. }
  2720. /**
  2721. * Get current document page number.
  2722. * @return int page number
  2723. * @public
  2724. * @since 2.1.000 (2008-01-07)
  2725. * @see setPage(), lastpage(), getNumPages()
  2726. */
  2727. public function getPage() {
  2728. return $this->page;
  2729. }
  2730. /**
  2731. * Get the total number of insered pages.
  2732. * @return int number of pages
  2733. * @public
  2734. * @since 2.1.000 (2008-01-07)
  2735. * @see setPage(), getPage(), lastpage()
  2736. */
  2737. public function getNumPages() {
  2738. return $this->numpages;
  2739. }
  2740. /**
  2741. * Adds a new TOC (Table Of Content) page to the document.
  2742. * @param $orientation (string) page orientation.
  2743. * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
  2744. * @param $keepmargins (boolean) if true overwrites the default page margins with the current margins
  2745. * @public
  2746. * @since 5.0.001 (2010-05-06)
  2747. * @see AddPage(), startPage(), endPage(), endTOCPage()
  2748. */
  2749. public function addTOCPage($orientation='', $format='', $keepmargins=false) {
  2750. $this->AddPage($orientation, $format, $keepmargins, true);
  2751. }
  2752. /**
  2753. * Terminate the current TOC (Table Of Content) page
  2754. * @public
  2755. * @since 5.0.001 (2010-05-06)
  2756. * @see AddPage(), startPage(), endPage(), addTOCPage()
  2757. */
  2758. public function endTOCPage() {
  2759. $this->endPage(true);
  2760. }
  2761. /**
  2762. * Adds a new page to the document. If a page is already present, the Footer() method is called first to output the footer (if enabled). Then the page is added, the current position set to the top-left corner according to the left and top margins (or top-right if in RTL mode), and Header() is called to display the header (if enabled).
  2763. * The origin of the coordinate system is at the top-left corner (or top-right for RTL) and increasing ordinates go downwards.
  2764. * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul>
  2765. * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
  2766. * @param $keepmargins (boolean) if true overwrites the default page margins with the current margins
  2767. * @param $tocpage (boolean) if true set the tocpage state to true (the added page will be used to display Table Of Content).
  2768. * @public
  2769. * @since 1.0
  2770. * @see startPage(), endPage(), addTOCPage(), endTOCPage(), getPageSizeFromFormat(), setPageFormat()
  2771. */
  2772. public function AddPage($orientation='', $format='', $keepmargins=false, $tocpage=false) {
  2773. if ($this->inxobj) {
  2774. // we are inside an XObject template
  2775. return;
  2776. }
  2777. if (!isset($this->original_lMargin) OR $keepmargins) {
  2778. $this->original_lMargin = $this->lMargin;
  2779. }
  2780. if (!isset($this->original_rMargin) OR $keepmargins) {
  2781. $this->original_rMargin = $this->rMargin;
  2782. }
  2783. // terminate previous page
  2784. $this->endPage();
  2785. // start new page
  2786. $this->startPage($orientation, $format, $tocpage);
  2787. }
  2788. /**
  2789. * Terminate the current page
  2790. * @param $tocpage (boolean) if true set the tocpage state to false (end the page used to display Table Of Content).
  2791. * @public
  2792. * @since 4.2.010 (2008-11-14)
  2793. * @see AddPage(), startPage(), addTOCPage(), endTOCPage()
  2794. */
  2795. public function endPage($tocpage=false) {
  2796. // check if page is already closed
  2797. if (($this->page == 0) OR ($this->numpages > $this->page) OR (!$this->pageopen[$this->page])) {
  2798. return;
  2799. }
  2800. // print page footer
  2801. $this->setFooter();
  2802. // close page
  2803. $this->_endpage();
  2804. // mark page as closed
  2805. $this->pageopen[$this->page] = false;
  2806. if ($tocpage) {
  2807. $this->tocpage = false;
  2808. }
  2809. }
  2810. /**
  2811. * Starts a new page to the document. The page must be closed using the endPage() function.
  2812. * The origin of the coordinate system is at the top-left corner and increasing ordinates go downwards.
  2813. * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul>
  2814. * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
  2815. * @param $tocpage (boolean) if true the page is designated to contain the Table-Of-Content.
  2816. * @since 4.2.010 (2008-11-14)
  2817. * @see AddPage(), endPage(), addTOCPage(), endTOCPage(), getPageSizeFromFormat(), setPageFormat()
  2818. * @public
  2819. */
  2820. public function startPage($orientation='', $format='', $tocpage=false) {
  2821. if ($tocpage) {
  2822. $this->tocpage = true;
  2823. }
  2824. // move page numbers of documents to be attached
  2825. if ($this->tocpage) {
  2826. // move reference to unexistent pages (used for page attachments)
  2827. // adjust outlines
  2828. $tmpoutlines = $this->outlines;
  2829. foreach ($tmpoutlines as $key => $outline) {
  2830. if ($outline['p'] > $this->numpages) {
  2831. $this->outlines[$key]['p'] = ($outline['p'] + 1);
  2832. }
  2833. }
  2834. // adjust dests
  2835. $tmpdests = $this->dests;
  2836. foreach ($tmpdests as $key => $dest) {
  2837. if ($dest['p'] > $this->numpages) {
  2838. $this->dests[$key]['p'] = ($dest['p'] + 1);
  2839. }
  2840. }
  2841. // adjust links
  2842. $tmplinks = $this->links;
  2843. foreach ($tmplinks as $key => $link) {
  2844. if ($link[0] > $this->numpages) {
  2845. $this->links[$key][0] = ($link[0] + 1);
  2846. }
  2847. }
  2848. }
  2849. if ($this->numpages > $this->page) {
  2850. // this page has been already added
  2851. $this->setPage($this->page + 1);
  2852. $this->SetY($this->tMargin);
  2853. return;
  2854. }
  2855. // start a new page
  2856. if ($this->state == 0) {
  2857. $this->Open();
  2858. }
  2859. ++$this->numpages;
  2860. $this->swapMargins($this->booklet);
  2861. // save current graphic settings
  2862. $gvars = $this->getGraphicVars();
  2863. // start new page
  2864. $this->_beginpage($orientation, $format);
  2865. // mark page as open
  2866. $this->pageopen[$this->page] = true;
  2867. // restore graphic settings
  2868. $this->setGraphicVars($gvars);
  2869. // mark this point
  2870. $this->setPageMark();
  2871. // print page header
  2872. $this->setHeader();
  2873. // restore graphic settings
  2874. $this->setGraphicVars($gvars);
  2875. // mark this point
  2876. $this->setPageMark();
  2877. // print table header (if any)
  2878. $this->setTableHeader();
  2879. // set mark for empty page check
  2880. $this->emptypagemrk[$this->page]= $this->pagelen[$this->page];
  2881. }
  2882. /**
  2883. * Set start-writing mark on current page stream used to put borders and fills.
  2884. * Borders and fills are always created after content and inserted on the position marked by this method.
  2885. * This function must be called after calling Image() function for a background image.
  2886. * Background images must be always inserted before calling Multicell() or WriteHTMLCell() or WriteHTML() functions.
  2887. * @public
  2888. * @since 4.0.016 (2008-07-30)
  2889. */
  2890. public function setPageMark() {
  2891. $this->intmrk[$this->page] = $this->pagelen[$this->page];
  2892. $this->bordermrk[$this->page] = $this->intmrk[$this->page];
  2893. $this->setContentMark();
  2894. }
  2895. /**
  2896. * Set start-writing mark on selected page.
  2897. * Borders and fills are always created after content and inserted on the position marked by this method.
  2898. * @param $page (int) page number (default is the current page)
  2899. * @protected
  2900. * @since 4.6.021 (2009-07-20)
  2901. */
  2902. protected function setContentMark($page=0) {
  2903. if ($page <= 0) {
  2904. $page = $this->page;
  2905. }
  2906. if (isset($this->footerlen[$page])) {
  2907. $this->cntmrk[$page] = $this->pagelen[$page] - $this->footerlen[$page];
  2908. } else {
  2909. $this->cntmrk[$page] = $this->pagelen[$page];
  2910. }
  2911. }
  2912. /**
  2913. * Set header data.
  2914. * @param $ln (string) header image logo
  2915. * @param $lw (string) header image logo width in mm
  2916. * @param $ht (string) string to print as title on document header
  2917. * @param $hs (string) string to print on document header
  2918. * @param $tc (array) RGB array color for text.
  2919. * @param $lc (array) RGB array color for line.
  2920. * @public
  2921. */
  2922. public function setHeaderData($ln='', $lw=0, $ht='', $hs='', $tc=array(0,0,0), $lc=array(0,0,0)) {
  2923. $this->header_logo = $ln;
  2924. $this->header_logo_width = $lw;
  2925. $this->header_title = $ht;
  2926. $this->header_string = $hs;
  2927. $this->header_text_color = $tc;
  2928. $this->header_line_color = $lc;
  2929. }
  2930. /**
  2931. * Set footer data.
  2932. * @param $tc (array) RGB array color for text.
  2933. * @param $lc (array) RGB array color for line.
  2934. * @public
  2935. */
  2936. public function setFooterData($tc=array(0,0,0), $lc=array(0,0,0)) {
  2937. $this->footer_text_color = $tc;
  2938. $this->footer_line_color = $lc;
  2939. }
  2940. /**
  2941. * Returns header data:
  2942. * <ul><li>$ret['logo'] = logo image</li><li>$ret['logo_width'] = width of the image logo in user units</li><li>$ret['title'] = header title</li><li>$ret['string'] = header description string</li></ul>
  2943. * @return array()
  2944. * @public
  2945. * @since 4.0.012 (2008-07-24)
  2946. */
  2947. public function getHeaderData() {
  2948. $ret = array();
  2949. $ret['logo'] = $this->header_logo;
  2950. $ret['logo_width'] = $this->header_logo_width;
  2951. $ret['title'] = $this->header_title;
  2952. $ret['string'] = $this->header_string;
  2953. $ret['text_color'] = $this->header_text_color;
  2954. $ret['line_color'] = $this->header_line_color;
  2955. return $ret;
  2956. }
  2957. /**
  2958. * Set header margin.
  2959. * (minimum distance between header and top page margin)
  2960. * @param $hm (int) distance in user units
  2961. * @public
  2962. */
  2963. public function setHeaderMargin($hm=10) {
  2964. $this->header_margin = $hm;
  2965. }
  2966. /**
  2967. * Returns header margin in user units.
  2968. * @return float
  2969. * @since 4.0.012 (2008-07-24)
  2970. * @public
  2971. */
  2972. public function getHeaderMargin() {
  2973. return $this->header_margin;
  2974. }
  2975. /**
  2976. * Set footer margin.
  2977. * (minimum distance between footer and bottom page margin)
  2978. * @param $fm (int) distance in user units
  2979. * @public
  2980. */
  2981. public function setFooterMargin($fm=10) {
  2982. $this->footer_margin = $fm;
  2983. }
  2984. /**
  2985. * Returns footer margin in user units.
  2986. * @return float
  2987. * @since 4.0.012 (2008-07-24)
  2988. * @public
  2989. */
  2990. public function getFooterMargin() {
  2991. return $this->footer_margin;
  2992. }
  2993. /**
  2994. * Set a flag to print page header.
  2995. * @param $val (boolean) set to true to print the page header (default), false otherwise.
  2996. * @public
  2997. */
  2998. public function setPrintHeader($val=true) {
  2999. $this->print_header = $val ? true : false;
  3000. }
  3001. /**
  3002. * Set a flag to print page footer.
  3003. * @param $val (boolean) set to true to print the page footer (default), false otherwise.
  3004. * @public
  3005. */
  3006. public function setPrintFooter($val=true) {
  3007. $this->print_footer = $val ? true : false;
  3008. }
  3009. /**
  3010. * Return the right-bottom (or left-bottom for RTL) corner X coordinate of last inserted image
  3011. * @return float
  3012. * @public
  3013. */
  3014. public function getImageRBX() {
  3015. return $this->img_rb_x;
  3016. }
  3017. /**
  3018. * Return the right-bottom (or left-bottom for RTL) corner Y coordinate of last inserted image
  3019. * @return float
  3020. * @public
  3021. */
  3022. public function getImageRBY() {
  3023. return $this->img_rb_y;
  3024. }
  3025. /**
  3026. * Reset the xobject template used by Header() method.
  3027. * @public
  3028. */
  3029. public function resetHeaderTemplate() {
  3030. $this->header_xobjid = -1;
  3031. }
  3032. /**
  3033. * Set a flag to automatically reset the xobject template used by Header() method at each page.
  3034. * @param $val (boolean) set to true to reset Header xobject template at each page, false otherwise.
  3035. * @public
  3036. */
  3037. public function setHeaderTemplateAutoreset($val=true) {
  3038. $this->header_xobj_autoreset = $val ? true : false;
  3039. }
  3040. /**
  3041. * This method is used to render the page header.
  3042. * It is automatically called by AddPage() and could be overwritten in your own inherited class.
  3043. * @public
  3044. */
  3045. public function Header() {
  3046. if ($this->header_xobjid < 0) {
  3047. // start a new XObject Template
  3048. $this->header_xobjid = $this->startTemplate($this->w, $this->tMargin);
  3049. $headerfont = $this->getHeaderFont();
  3050. $headerdata = $this->getHeaderData();
  3051. $this->y = $this->header_margin;
  3052. if ($this->rtl) {
  3053. $this->x = $this->w - $this->original_rMargin;
  3054. } else {
  3055. $this->x = $this->original_lMargin;
  3056. }
  3057. if (($headerdata['logo']) AND ($headerdata['logo'] != K_BLANK_IMAGE)) {
  3058. $imgtype = TCPDF_IMAGES::getImageFileType(K_PATH_IMAGES.$headerdata['logo']);
  3059. if (($imgtype == 'eps') OR ($imgtype == 'ai')) {
  3060. $this->ImageEps(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']);
  3061. } elseif ($imgtype == 'svg') {
  3062. $this->ImageSVG(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']);
  3063. } else {
  3064. $this->Image(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']);
  3065. }
  3066. $imgy = $this->getImageRBY();
  3067. } else {
  3068. $imgy = $this->y;
  3069. }
  3070. $cell_height = round(($this->cell_height_ratio * $headerfont[2]) / $this->k, 2);
  3071. // set starting margin for text data cell
  3072. if ($this->getRTL()) {
  3073. $header_x = $this->original_rMargin + ($headerdata['logo_width'] * 1.1);
  3074. } else {
  3075. $header_x = $this->original_lMargin + ($headerdata['logo_width'] * 1.1);
  3076. }
  3077. $cw = $this->w - $this->original_lMargin - $this->original_rMargin - ($headerdata['logo_width'] * 1.1);
  3078. $this->SetTextColorArray($this->header_text_color);
  3079. // header title
  3080. $this->SetFont($headerfont[0], 'B', $headerfont[2] + 1);
  3081. $this->SetX($header_x);
  3082. $this->Cell($cw, $cell_height, $headerdata['title'], 0, 1, '', 0, '', 0);
  3083. // header string
  3084. $this->SetFont($headerfont[0], $headerfont[1], $headerfont[2]);
  3085. $this->SetX($header_x);
  3086. $this->MultiCell($cw, $cell_height, $headerdata['string'], 0, '', 0, 1, '', '', true, 0, false, true, 0, 'T', false);
  3087. // print an ending header line
  3088. $this->SetLineStyle(array('width' => 0.85 / $this->k, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $headerdata['line_color']));
  3089. $this->SetY((2.835 / $this->k) + max($imgy, $this->y));
  3090. if ($this->rtl) {
  3091. $this->SetX($this->original_rMargin);
  3092. } else {
  3093. $this->SetX($this->original_lMargin);
  3094. }
  3095. $this->Cell(($this->w - $this->original_lMargin - $this->original_rMargin), 0, '', 'T', 0, 'C');
  3096. $this->endTemplate();
  3097. }
  3098. // print header template
  3099. $x = 0;
  3100. $dx = 0;
  3101. if (!$this->header_xobj_autoreset AND $this->booklet AND (($this->page % 2) == 0)) {
  3102. // adjust margins for booklet mode
  3103. $dx = ($this->original_lMargin - $this->original_rMargin);
  3104. }
  3105. if ($this->rtl) {
  3106. $x = $this->w + $dx;
  3107. } else {
  3108. $x = 0 + $dx;
  3109. }
  3110. $this->printTemplate($this->header_xobjid, $x, 0, 0, 0, '', '', false);
  3111. if ($this->header_xobj_autoreset) {
  3112. // reset header xobject template at each page
  3113. $this->header_xobjid = -1;
  3114. }
  3115. }
  3116. /**
  3117. * This method is used to render the page footer.
  3118. * It is automatically called by AddPage() and could be overwritten in your own inherited class.
  3119. * @public
  3120. */
  3121. public function Footer() {
  3122. $cur_y = $this->y;
  3123. $this->SetTextColorArray($this->footer_text_color);
  3124. //set style for cell border
  3125. $line_width = (0.85 / $this->k);
  3126. $this->SetLineStyle(array('width' => $line_width, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $this->footer_line_color));
  3127. //print document barcode
  3128. $barcode = $this->getBarcode();
  3129. if (!empty($barcode)) {
  3130. $this->Ln($line_width);
  3131. $barcode_width = round(($this->w - $this->original_lMargin - $this->original_rMargin) / 3);
  3132. $style = array(
  3133. 'position' => $this->rtl?'R':'L',
  3134. 'align' => $this->rtl?'R':'L',
  3135. 'stretch' => false,
  3136. 'fitwidth' => true,
  3137. 'cellfitalign' => '',
  3138. 'border' => false,
  3139. 'padding' => 0,
  3140. 'fgcolor' => array(0,0,0),
  3141. 'bgcolor' => false,
  3142. 'text' => false
  3143. );
  3144. $this->write1DBarcode($barcode, 'C128', '', $cur_y + $line_width, '', (($this->footer_margin / 3) - $line_width), 0.3, $style, '');
  3145. }
  3146. $w_page = isset($this->l['w_page']) ? $this->l['w_page'].' ' : '';
  3147. if (empty($this->pagegroups)) {
  3148. $pagenumtxt = $w_page.$this->getAliasNumPage().' / '.$this->getAliasNbPages();
  3149. } else {
  3150. $pagenumtxt = $w_page.$this->getPageNumGroupAlias().' / '.$this->getPageGroupAlias();
  3151. }
  3152. $this->SetY($cur_y);
  3153. //Print page number
  3154. if ($this->getRTL()) {
  3155. $this->SetX($this->original_rMargin);
  3156. $this->Cell(0, 0, $pagenumtxt, 'T', 0, 'L');
  3157. } else {
  3158. $this->SetX($this->original_lMargin);
  3159. $this->Cell(0, 0, $this->getAliasRightShift().$pagenumtxt, 'T', 0, 'R');
  3160. }
  3161. }
  3162. /**
  3163. * This method is used to render the page header.
  3164. * @protected
  3165. * @since 4.0.012 (2008-07-24)
  3166. */
  3167. protected function setHeader() {
  3168. if (!$this->print_header OR ($this->state != 2)) {
  3169. return;
  3170. }
  3171. $this->InHeader = true;
  3172. $this->setGraphicVars($this->default_graphic_vars);
  3173. $temp_thead = $this->thead;
  3174. $temp_theadMargins = $this->theadMargins;
  3175. $lasth = $this->lasth;
  3176. $this->_out('q');
  3177. $this->rMargin = $this->original_rMargin;
  3178. $this->lMargin = $this->original_lMargin;
  3179. $this->SetCellPadding(0);
  3180. //set current position
  3181. if ($this->rtl) {
  3182. $this->SetXY($this->original_rMargin, $this->header_margin);
  3183. } else {
  3184. $this->SetXY($this->original_lMargin, $this->header_margin);
  3185. }
  3186. $this->SetFont($this->header_font[0], $this->header_font[1], $this->header_font[2]);
  3187. $this->Header();
  3188. //restore position
  3189. if ($this->rtl) {
  3190. $this->SetXY($this->original_rMargin, $this->tMargin);
  3191. } else {
  3192. $this->SetXY($this->original_lMargin, $this->tMargin);
  3193. }
  3194. $this->_out('Q');
  3195. $this->lasth = $lasth;
  3196. $this->thead = $temp_thead;
  3197. $this->theadMargins = $temp_theadMargins;
  3198. $this->newline = false;
  3199. $this->InHeader = false;
  3200. }
  3201. /**
  3202. * This method is used to render the page footer.
  3203. * @protected
  3204. * @since 4.0.012 (2008-07-24)
  3205. */
  3206. protected function setFooter() {
  3207. if ($this->state != 2) {
  3208. return;
  3209. }
  3210. $this->InFooter = true;
  3211. // save current graphic settings
  3212. $gvars = $this->getGraphicVars();
  3213. // mark this point
  3214. $this->footerpos[$this->page] = $this->pagelen[$this->page];
  3215. $this->_out("\n");
  3216. if ($this->print_footer) {
  3217. $this->setGraphicVars($this->default_graphic_vars);
  3218. $this->current_column = 0;
  3219. $this->num_columns = 1;
  3220. $temp_thead = $this->thead;
  3221. $temp_theadMargins = $this->theadMargins;
  3222. $lasth = $this->lasth;
  3223. $this->_out('q');
  3224. $this->rMargin = $this->original_rMargin;
  3225. $this->lMargin = $this->original_lMargin;
  3226. $this->SetCellPadding(0);
  3227. //set current position
  3228. $footer_y = $this->h - $this->footer_margin;
  3229. if ($this->rtl) {
  3230. $this->SetXY($this->original_rMargin, $footer_y);
  3231. } else {
  3232. $this->SetXY($this->original_lMargin, $footer_y);
  3233. }
  3234. $this->SetFont($this->footer_font[0], $this->footer_font[1], $this->footer_font[2]);
  3235. $this->Footer();
  3236. //restore position
  3237. if ($this->rtl) {
  3238. $this->SetXY($this->original_rMargin, $this->tMargin);
  3239. } else {
  3240. $this->SetXY($this->original_lMargin, $this->tMargin);
  3241. }
  3242. $this->_out('Q');
  3243. $this->lasth = $lasth;
  3244. $this->thead = $temp_thead;
  3245. $this->theadMargins = $temp_theadMargins;
  3246. }
  3247. // restore graphic settings
  3248. $this->setGraphicVars($gvars);
  3249. $this->current_column = $gvars['current_column'];
  3250. $this->num_columns = $gvars['num_columns'];
  3251. // calculate footer length
  3252. $this->footerlen[$this->page] = $this->pagelen[$this->page] - $this->footerpos[$this->page] + 1;
  3253. $this->InFooter = false;
  3254. }
  3255. /**
  3256. * Check if we are on the page body (excluding page header and footer).
  3257. * @return true if we are not in page header nor in page footer, false otherwise.
  3258. * @protected
  3259. * @since 5.9.091 (2011-06-15)
  3260. */
  3261. protected function inPageBody() {
  3262. return (($this->InHeader === false) AND ($this->InFooter === false));
  3263. }
  3264. /**
  3265. * This method is used to render the table header on new page (if any).
  3266. * @protected
  3267. * @since 4.5.030 (2009-03-25)
  3268. */
  3269. protected function setTableHeader() {
  3270. if ($this->num_columns > 1) {
  3271. // multi column mode
  3272. return;
  3273. }
  3274. if (isset($this->theadMargins['top'])) {
  3275. // restore the original top-margin
  3276. $this->tMargin = $this->theadMargins['top'];
  3277. $this->pagedim[$this->page]['tm'] = $this->tMargin;
  3278. $this->y = $this->tMargin;
  3279. }
  3280. if (!TCPDF_STATIC::empty_string($this->thead) AND (!$this->inthead)) {
  3281. // set margins
  3282. $prev_lMargin = $this->lMargin;
  3283. $prev_rMargin = $this->rMargin;
  3284. $prev_cell_padding = $this->cell_padding;
  3285. $this->lMargin = $this->theadMargins['lmargin'] + ($this->pagedim[$this->page]['olm'] - $this->pagedim[$this->theadMargins['page']]['olm']);
  3286. $this->rMargin = $this->theadMargins['rmargin'] + ($this->pagedim[$this->page]['orm'] - $this->pagedim[$this->theadMargins['page']]['orm']);
  3287. $this->cell_padding = $this->theadMargins['cell_padding'];
  3288. if ($this->rtl) {
  3289. $this->x = $this->w - $this->rMargin;
  3290. } else {
  3291. $this->x = $this->lMargin;
  3292. }
  3293. // account for special "cell" mode
  3294. if ($this->theadMargins['cell']) {
  3295. if ($this->rtl) {
  3296. $this->x -= $this->cell_padding['R'];
  3297. } else {
  3298. $this->x += $this->cell_padding['L'];
  3299. }
  3300. }
  3301. // print table header
  3302. $this->writeHTML($this->thead, false, false, false, false, '');
  3303. // set new top margin to skip the table headers
  3304. if (!isset($this->theadMargins['top'])) {
  3305. $this->theadMargins['top'] = $this->tMargin;
  3306. }
  3307. // store end of header position
  3308. if (!isset($this->columns[0]['th'])) {
  3309. $this->columns[0]['th'] = array();
  3310. }
  3311. $this->columns[0]['th']['\''.$this->page.'\''] = $this->y;
  3312. $this->tMargin = $this->y;
  3313. $this->pagedim[$this->page]['tm'] = $this->tMargin;
  3314. $this->lasth = 0;
  3315. $this->lMargin = $prev_lMargin;
  3316. $this->rMargin = $prev_rMargin;
  3317. $this->cell_padding = $prev_cell_padding;
  3318. }
  3319. }
  3320. /**
  3321. * Returns the current page number.
  3322. * @return int page number
  3323. * @public
  3324. * @since 1.0
  3325. * @see getAliasNbPages()
  3326. */
  3327. public function PageNo() {
  3328. return $this->page;
  3329. }
  3330. /**
  3331. * Returns the array of spot colors.
  3332. * @return (array) Spot colors array.
  3333. * @public
  3334. * @since 6.0.038 (2013-09-30)
  3335. */
  3336. public function getAllSpotColors() {
  3337. return $this->spot_colors;
  3338. }
  3339. /**
  3340. * Defines a new spot color.
  3341. * It can be expressed in RGB components or gray scale.
  3342. * The method can be called before the first page is created and the value is retained from page to page.
  3343. * @param $name (string) Full name of the spot color.
  3344. * @param $c (float) Cyan color for CMYK. Value between 0 and 100.
  3345. * @param $m (float) Magenta color for CMYK. Value between 0 and 100.
  3346. * @param $y (float) Yellow color for CMYK. Value between 0 and 100.
  3347. * @param $k (float) Key (Black) color for CMYK. Value between 0 and 100.
  3348. * @public
  3349. * @since 4.0.024 (2008-09-12)
  3350. * @see SetDrawSpotColor(), SetFillSpotColor(), SetTextSpotColor()
  3351. */
  3352. public function AddSpotColor($name, $c, $m, $y, $k) {
  3353. if (!isset($this->spot_colors[$name])) {
  3354. $i = (1 + count($this->spot_colors));
  3355. $this->spot_colors[$name] = array('C' => $c, 'M' => $m, 'Y' => $y, 'K' => $k, 'name' => $name, 'i' => $i);
  3356. }
  3357. }
  3358. /**
  3359. * Set the spot color for the specified type ('draw', 'fill', 'text').
  3360. * @param $type (string) Type of object affected by this color: ('draw', 'fill', 'text').
  3361. * @param $name (string) Name of the spot color.
  3362. * @param $tint (float) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
  3363. * @return (string) PDF color command.
  3364. * @public
  3365. * @since 5.9.125 (2011-10-03)
  3366. */
  3367. public function setSpotColor($type, $name, $tint=100) {
  3368. $spotcolor = TCPDF_COLORS::getSpotColor($name, $this->spot_colors);
  3369. if ($spotcolor === false) {
  3370. $this->Error('Undefined spot color: '.$name.', you must add it using the AddSpotColor() method.');
  3371. }
  3372. $tint = (max(0, min(100, $tint)) / 100);
  3373. $pdfcolor = sprintf('/CS%d ', $this->spot_colors[$name]['i']);
  3374. switch ($type) {
  3375. case 'draw': {
  3376. $pdfcolor .= sprintf('CS %F SCN', $tint);
  3377. $this->DrawColor = $pdfcolor;
  3378. $this->strokecolor = $spotcolor;
  3379. break;
  3380. }
  3381. case 'fill': {
  3382. $pdfcolor .= sprintf('cs %F scn', $tint);
  3383. $this->FillColor = $pdfcolor;
  3384. $this->bgcolor = $spotcolor;
  3385. break;
  3386. }
  3387. case 'text': {
  3388. $pdfcolor .= sprintf('cs %F scn', $tint);
  3389. $this->TextColor = $pdfcolor;
  3390. $this->fgcolor = $spotcolor;
  3391. break;
  3392. }
  3393. }
  3394. $this->ColorFlag = ($this->FillColor != $this->TextColor);
  3395. if ($this->state == 2) {
  3396. $this->_out($pdfcolor);
  3397. }
  3398. if ($this->inxobj) {
  3399. // we are inside an XObject template
  3400. $this->xobjects[$this->xobjid]['spot_colors'][$name] = $this->spot_colors[$name];
  3401. }
  3402. return $pdfcolor;
  3403. }
  3404. /**
  3405. * Defines the spot color used for all drawing operations (lines, rectangles and cell borders).
  3406. * @param $name (string) Name of the spot color.
  3407. * @param $tint (float) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
  3408. * @public
  3409. * @since 4.0.024 (2008-09-12)
  3410. * @see AddSpotColor(), SetFillSpotColor(), SetTextSpotColor()
  3411. */
  3412. public function SetDrawSpotColor($name, $tint=100) {
  3413. $this->setSpotColor('draw', $name, $tint);
  3414. }
  3415. /**
  3416. * Defines the spot color used for all filling operations (filled rectangles and cell backgrounds).
  3417. * @param $name (string) Name of the spot color.
  3418. * @param $tint (float) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
  3419. * @public
  3420. * @since 4.0.024 (2008-09-12)
  3421. * @see AddSpotColor(), SetDrawSpotColor(), SetTextSpotColor()
  3422. */
  3423. public function SetFillSpotColor($name, $tint=100) {
  3424. $this->setSpotColor('fill', $name, $tint);
  3425. }
  3426. /**
  3427. * Defines the spot color used for text.
  3428. * @param $name (string) Name of the spot color.
  3429. * @param $tint (int) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
  3430. * @public
  3431. * @since 4.0.024 (2008-09-12)
  3432. * @see AddSpotColor(), SetDrawSpotColor(), SetFillSpotColor()
  3433. */
  3434. public function SetTextSpotColor($name, $tint=100) {
  3435. $this->setSpotColor('text', $name, $tint);
  3436. }
  3437. /**
  3438. * Set the color array for the specified type ('draw', 'fill', 'text').
  3439. * It can be expressed in RGB, CMYK or GRAY SCALE components.
  3440. * The method can be called before the first page is created and the value is retained from page to page.
  3441. * @param $type (string) Type of object affected by this color: ('draw', 'fill', 'text').
  3442. * @param $color (array) Array of colors (1=gray, 3=RGB, 4=CMYK or 5=spotcolor=CMYK+name values).
  3443. * @param $ret (boolean) If true do not send the PDF command.
  3444. * @return (string) The PDF command or empty string.
  3445. * @public
  3446. * @since 3.1.000 (2008-06-11)
  3447. */
  3448. public function setColorArray($type, $color, $ret=false) {
  3449. if (is_array($color)) {
  3450. $color = array_values($color);
  3451. // component: grey, RGB red or CMYK cyan
  3452. $c = isset($color[0]) ? $color[0] : -1;
  3453. // component: RGB green or CMYK magenta
  3454. $m = isset($color[1]) ? $color[1] : -1;
  3455. // component: RGB blue or CMYK yellow
  3456. $y = isset($color[2]) ? $color[2] : -1;
  3457. // component: CMYK black
  3458. $k = isset($color[3]) ? $color[3] : -1;
  3459. // color name
  3460. $name = isset($color[4]) ? $color[4] : '';
  3461. if ($c >= 0) {
  3462. return $this->setColor($type, $c, $m, $y, $k, $ret, $name);
  3463. }
  3464. }
  3465. return '';
  3466. }
  3467. /**
  3468. * Defines the color used for all drawing operations (lines, rectangles and cell borders).
  3469. * It can be expressed in RGB, CMYK or GRAY SCALE components.
  3470. * The method can be called before the first page is created and the value is retained from page to page.
  3471. * @param $color (array) Array of colors (1, 3 or 4 values).
  3472. * @param $ret (boolean) If true do not send the PDF command.
  3473. * @return string the PDF command
  3474. * @public
  3475. * @since 3.1.000 (2008-06-11)
  3476. * @see SetDrawColor()
  3477. */
  3478. public function SetDrawColorArray($color, $ret=false) {
  3479. return $this->setColorArray('draw', $color, $ret);
  3480. }
  3481. /**
  3482. * Defines the color used for all filling operations (filled rectangles and cell backgrounds).
  3483. * It can be expressed in RGB, CMYK or GRAY SCALE components.
  3484. * The method can be called before the first page is created and the value is retained from page to page.
  3485. * @param $color (array) Array of colors (1, 3 or 4 values).
  3486. * @param $ret (boolean) If true do not send the PDF command.
  3487. * @public
  3488. * @since 3.1.000 (2008-6-11)
  3489. * @see SetFillColor()
  3490. */
  3491. public function SetFillColorArray($color, $ret=false) {
  3492. return $this->setColorArray('fill', $color, $ret);
  3493. }
  3494. /**
  3495. * Defines the color used for text. It can be expressed in RGB components or gray scale.
  3496. * The method can be called before the first page is created and the value is retained from page to page.
  3497. * @param $color (array) Array of colors (1, 3 or 4 values).
  3498. * @param $ret (boolean) If true do not send the PDF command.
  3499. * @public
  3500. * @since 3.1.000 (2008-6-11)
  3501. * @see SetFillColor()
  3502. */
  3503. public function SetTextColorArray($color, $ret=false) {
  3504. return $this->setColorArray('text', $color, $ret);
  3505. }
  3506. /**
  3507. * Defines the color used by the specified type ('draw', 'fill', 'text').
  3508. * @param $type (string) Type of object affected by this color: ('draw', 'fill', 'text').
  3509. * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
  3510. * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
  3511. * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
  3512. * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
  3513. * @param $ret (boolean) If true do not send the command.
  3514. * @param $name (string) spot color name (if any)
  3515. * @return (string) The PDF command or empty string.
  3516. * @public
  3517. * @since 5.9.125 (2011-10-03)
  3518. */
  3519. public function setColor($type, $col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
  3520. // set default values
  3521. if (!is_numeric($col1)) {
  3522. $col1 = 0;
  3523. }
  3524. if (!is_numeric($col2)) {
  3525. $col2 = -1;
  3526. }
  3527. if (!is_numeric($col3)) {
  3528. $col3 = -1;
  3529. }
  3530. if (!is_numeric($col4)) {
  3531. $col4 = -1;
  3532. }
  3533. // set color by case
  3534. $suffix = '';
  3535. if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) {
  3536. // Grey scale
  3537. $col1 = max(0, min(255, $col1));
  3538. $intcolor = array('G' => $col1);
  3539. $pdfcolor = sprintf('%F ', ($col1 / 255));
  3540. $suffix = 'g';
  3541. } elseif ($col4 == -1) {
  3542. // RGB
  3543. $col1 = max(0, min(255, $col1));
  3544. $col2 = max(0, min(255, $col2));
  3545. $col3 = max(0, min(255, $col3));
  3546. $intcolor = array('R' => $col1, 'G' => $col2, 'B' => $col3);
  3547. $pdfcolor = sprintf('%F %F %F ', ($col1 / 255), ($col2 / 255), ($col3 / 255));
  3548. $suffix = 'rg';
  3549. } else {
  3550. $col1 = max(0, min(100, $col1));
  3551. $col2 = max(0, min(100, $col2));
  3552. $col3 = max(0, min(100, $col3));
  3553. $col4 = max(0, min(100, $col4));
  3554. if (empty($name)) {
  3555. // CMYK
  3556. $intcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4);
  3557. $pdfcolor = sprintf('%F %F %F %F ', ($col1 / 100), ($col2 / 100), ($col3 / 100), ($col4 / 100));
  3558. $suffix = 'k';
  3559. } else {
  3560. // SPOT COLOR
  3561. $intcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4, 'name' => $name);
  3562. $this->AddSpotColor($name, $col1, $col2, $col3, $col4);
  3563. $pdfcolor = $this->setSpotColor($type, $name, 100);
  3564. }
  3565. }
  3566. switch ($type) {
  3567. case 'draw': {
  3568. $pdfcolor .= strtoupper($suffix);
  3569. $this->DrawColor = $pdfcolor;
  3570. $this->strokecolor = $intcolor;
  3571. break;
  3572. }
  3573. case 'fill': {
  3574. $pdfcolor .= $suffix;
  3575. $this->FillColor = $pdfcolor;
  3576. $this->bgcolor = $intcolor;
  3577. break;
  3578. }
  3579. case 'text': {
  3580. $pdfcolor .= $suffix;
  3581. $this->TextColor = $pdfcolor;
  3582. $this->fgcolor = $intcolor;
  3583. break;
  3584. }
  3585. }
  3586. $this->ColorFlag = ($this->FillColor != $this->TextColor);
  3587. if (($type != 'text') AND ($this->state == 2)) {
  3588. if (!$ret) {
  3589. $this->_out($pdfcolor);
  3590. }
  3591. return $pdfcolor;
  3592. }
  3593. return '';
  3594. }
  3595. /**
  3596. * Defines the color used for all drawing operations (lines, rectangles and cell borders). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page.
  3597. * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
  3598. * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
  3599. * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
  3600. * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
  3601. * @param $ret (boolean) If true do not send the command.
  3602. * @param $name (string) spot color name (if any)
  3603. * @return string the PDF command
  3604. * @public
  3605. * @since 1.3
  3606. * @see SetDrawColorArray(), SetFillColor(), SetTextColor(), Line(), Rect(), Cell(), MultiCell()
  3607. */
  3608. public function SetDrawColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
  3609. return $this->setColor('draw', $col1, $col2, $col3, $col4, $ret, $name);
  3610. }
  3611. /**
  3612. * Defines the color used for all filling operations (filled rectangles and cell backgrounds). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page.
  3613. * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
  3614. * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
  3615. * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
  3616. * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
  3617. * @param $ret (boolean) If true do not send the command.
  3618. * @param $name (string) Spot color name (if any).
  3619. * @return (string) The PDF command.
  3620. * @public
  3621. * @since 1.3
  3622. * @see SetFillColorArray(), SetDrawColor(), SetTextColor(), Rect(), Cell(), MultiCell()
  3623. */
  3624. public function SetFillColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
  3625. return $this->setColor('fill', $col1, $col2, $col3, $col4, $ret, $name);
  3626. }
  3627. /**
  3628. * Defines the color used for text. It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page.
  3629. * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
  3630. * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
  3631. * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
  3632. * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
  3633. * @param $ret (boolean) If true do not send the command.
  3634. * @param $name (string) Spot color name (if any).
  3635. * @return (string) Empty string.
  3636. * @public
  3637. * @since 1.3
  3638. * @see SetTextColorArray(), SetDrawColor(), SetFillColor(), Text(), Cell(), MultiCell()
  3639. */
  3640. public function SetTextColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
  3641. return $this->setColor('text', $col1, $col2, $col3, $col4, $ret, $name);
  3642. }
  3643. /**
  3644. * Returns the length of a string in user unit. A font must be selected.<br>
  3645. * @param $s (string) The string whose length is to be computed
  3646. * @param $fontname (string) Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained.
  3647. * @param $fontstyle (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line-through</li><li>O: overline</li></ul> or any combination. The default value is regular.
  3648. * @param $fontsize (float) Font size in points. The default value is the current size.
  3649. * @param $getarray (boolean) if true returns an array of characters widths, if false returns the total length.
  3650. * @return mixed int total string length or array of characted widths
  3651. * @author Nicola Asuni
  3652. * @public
  3653. * @since 1.2
  3654. */
  3655. public function GetStringWidth($s, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) {
  3656. return $this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($s, $this->isunicode, $this->CurrentFont), $s, $this->tmprtl, $this->isunicode, $this->CurrentFont), $fontname, $fontstyle, $fontsize, $getarray);
  3657. }
  3658. /**
  3659. * Returns the string length of an array of chars in user unit or an array of characters widths. A font must be selected.<br>
  3660. * @param $sa (string) The array of chars whose total length is to be computed
  3661. * @param $fontname (string) Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained.
  3662. * @param $fontstyle (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line through</li><li>O: overline</li></ul> or any combination. The default value is regular.
  3663. * @param $fontsize (float) Font size in points. The default value is the current size.
  3664. * @param $getarray (boolean) if true returns an array of characters widths, if false returns the total length.
  3665. * @return mixed int total string length or array of characted widths
  3666. * @author Nicola Asuni
  3667. * @public
  3668. * @since 2.4.000 (2008-03-06)
  3669. */
  3670. public function GetArrStringWidth($sa, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) {
  3671. // store current values
  3672. if (!TCPDF_STATIC::empty_string($fontname)) {
  3673. $prev_FontFamily = $this->FontFamily;
  3674. $prev_FontStyle = $this->FontStyle;
  3675. $prev_FontSizePt = $this->FontSizePt;
  3676. $this->SetFont($fontname, $fontstyle, $fontsize, '', 'default', false);
  3677. }
  3678. // convert UTF-8 array to Latin1 if required
  3679. if ($this->isunicode AND (!$this->isUnicodeFont())) {
  3680. $sa = TCPDF_FONTS::UTF8ArrToLatin1Arr($sa);
  3681. }
  3682. $w = 0; // total width
  3683. $wa = array(); // array of characters widths
  3684. foreach ($sa as $ck => $char) {
  3685. // character width
  3686. $cw = $this->GetCharWidth($char, isset($sa[($ck + 1)]));
  3687. $wa[] = $cw;
  3688. $w += $cw;
  3689. }
  3690. // restore previous values
  3691. if (!TCPDF_STATIC::empty_string($fontname)) {
  3692. $this->SetFont($prev_FontFamily, $prev_FontStyle, $prev_FontSizePt, '', 'default', false);
  3693. }
  3694. if ($getarray) {
  3695. return $wa;
  3696. }
  3697. return $w;
  3698. }
  3699. /**
  3700. * Returns the length of the char in user unit for the current font considering current stretching and spacing (tracking).
  3701. * @param $char (int) The char code whose length is to be returned
  3702. * @param $notlast (boolean) If false ignore the font-spacing.
  3703. * @return float char width
  3704. * @author Nicola Asuni
  3705. * @public
  3706. * @since 2.4.000 (2008-03-06)
  3707. */
  3708. public function GetCharWidth($char, $notlast=true) {
  3709. // get raw width
  3710. $chw = $this->getRawCharWidth($char);
  3711. if (($this->font_spacing < 0) OR (($this->font_spacing > 0) AND $notlast)) {
  3712. // increase/decrease font spacing
  3713. $chw += $this->font_spacing;
  3714. }
  3715. if ($this->font_stretching != 100) {
  3716. // fixed stretching mode
  3717. $chw *= ($this->font_stretching / 100);
  3718. }
  3719. return $chw;
  3720. }
  3721. /**
  3722. * Returns the length of the char in user unit for the current font.
  3723. * @param $char (int) The char code whose length is to be returned
  3724. * @return float char width
  3725. * @author Nicola Asuni
  3726. * @public
  3727. * @since 5.9.000 (2010-09-28)
  3728. */
  3729. public function getRawCharWidth($char) {
  3730. if ($char == 173) {
  3731. // SHY character will not be printed
  3732. return (0);
  3733. }
  3734. if (isset($this->CurrentFont['cw'][$char])) {
  3735. $w = $this->CurrentFont['cw'][$char];
  3736. } elseif (isset($this->CurrentFont['dw'])) {
  3737. // default width
  3738. $w = $this->CurrentFont['dw'];
  3739. } elseif (isset($this->CurrentFont['cw'][32])) {
  3740. // default width
  3741. $w = $this->CurrentFont['cw'][32];
  3742. } else {
  3743. $w = 600;
  3744. }
  3745. return $this->getAbsFontMeasure($w);
  3746. }
  3747. /**
  3748. * Returns the numbero of characters in a string.
  3749. * @param $s (string) The input string.
  3750. * @return int number of characters
  3751. * @public
  3752. * @since 2.0.0001 (2008-01-07)
  3753. */
  3754. public function GetNumChars($s) {
  3755. if ($this->isUnicodeFont()) {
  3756. return count(TCPDF_FONTS::UTF8StringToArray($s, $this->isunicode, $this->CurrentFont));
  3757. }
  3758. return strlen($s);
  3759. }
  3760. /**
  3761. * Fill the list of available fonts ($this->fontlist).
  3762. * @protected
  3763. * @since 4.0.013 (2008-07-28)
  3764. */
  3765. protected function getFontsList() {
  3766. if (($fontsdir = opendir(TCPDF_FONTS::_getfontpath())) !== false) {
  3767. while (($file = readdir($fontsdir)) !== false) {
  3768. if (substr($file, -4) == '.php') {
  3769. array_push($this->fontlist, strtolower(basename($file, '.php')));
  3770. }
  3771. }
  3772. closedir($fontsdir);
  3773. }
  3774. }
  3775. /**
  3776. * Returns the unicode caracter specified by the value
  3777. * @param $c (int) UTF-8 value
  3778. * @return Returns the specified character.
  3779. * @since 2.3.000 (2008-03-05)
  3780. * @public
  3781. * @deprecated
  3782. */
  3783. public function unichr($c) {
  3784. return TCPDF_FONTS::unichr($c, $this->isunicode);
  3785. }
  3786. /**
  3787. * Convert and add the selected TrueType or Type1 font to the fonts folder (that must be writeable).
  3788. * @param $fontfile (string) Font file (full path).
  3789. * @param $fonttype (string) Font type. Leave empty for autodetect mode. Valid values are: TrueTypeUnicode, TrueType, Type1, CID0JP = CID-0 Japanese, CID0KR = CID-0 Korean, CID0CS = CID-0 Chinese Simplified, CID0CT = CID-0 Chinese Traditional.
  3790. * @param $enc (string) Name of the encoding table to use. Leave empty for default mode. Omit this parameter for TrueType Unicode and symbolic fonts like Symbol or ZapfDingBats.
  3791. * @param $flags (int) Unsigned 32-bit integer containing flags specifying various characteristics of the font (PDF32000:2008 - 9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for symbol or +32 for non-symbol; +64 for italic. Fixed and Italic mode are generally autodetected so you have to set it to 32 = non-symbolic font (default) or 4 = symbolic font.
  3792. * @param $outpath (string) Output path for generated font files (must be writeable by the web server). Leave empty for default font folder.
  3793. * @param $platid (int) Platform ID for CMAP table to extract (when building a Unicode font for Windows this value should be 3, for Macintosh should be 1).
  3794. * @param $encid (int) Encoding ID for CMAP table to extract (when building a Unicode font for Windows this value should be 1, for Macintosh should be 0). When Platform ID is 3, legal values for Encoding ID are: 0=Symbol, 1=Unicode, 2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab, 7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4.
  3795. * @param $addcbbox (boolean) If true includes the character bounding box information on the php font file.
  3796. * @return (string) TCPDF font name.
  3797. * @author Nicola Asuni
  3798. * @since 5.9.123 (2010-09-30)
  3799. * @public
  3800. * @deprecated
  3801. */
  3802. public function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $outpath='', $platid=3, $encid=1, $addcbbox=false) {
  3803. return TCPDF_FONTS::addTTFfont($fontfile, $fonttype, $enc, $flags, $outpath, $platid, $encid, $addcbbox);
  3804. }
  3805. /**
  3806. * Imports a TrueType, Type1, core, or CID0 font and makes it available.
  3807. * It is necessary to generate a font definition file first (read /fonts/utils/README.TXT).
  3808. * The definition file (and the font file itself when embedding) must be present either in the current directory or in the one indicated by K_PATH_FONTS if the constant is defined. If it could not be found, the error "Could not include font definition file" is generated.
  3809. * @param $family (string) Font family. The name can be chosen arbitrarily. If it is a standard family name, it will override the corresponding font.
  3810. * @param $style (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular (default)</li><li>B: bold</li><li>I: italic</li><li>BI or IB: bold italic</li></ul>
  3811. * @param $fontfile (string) The font definition file. By default, the name is built from the family and style, in lower case with no spaces.
  3812. * @return array containing the font data, or false in case of error.
  3813. * @param $subset (mixed) if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font.
  3814. * @public
  3815. * @since 1.5
  3816. * @see SetFont(), setFontSubsetting()
  3817. */
  3818. public function AddFont($family, $style='', $fontfile='', $subset='default') {
  3819. if ($subset === 'default') {
  3820. $subset = $this->font_subsetting;
  3821. }
  3822. if ($this->pdfa_mode) {
  3823. $subset = false;
  3824. }
  3825. if (TCPDF_STATIC::empty_string($family)) {
  3826. if (!TCPDF_STATIC::empty_string($this->FontFamily)) {
  3827. $family = $this->FontFamily;
  3828. } else {
  3829. $this->Error('Empty font family');
  3830. }
  3831. }
  3832. // move embedded styles on $style
  3833. if (substr($family, -1) == 'I') {
  3834. $style .= 'I';
  3835. $family = substr($family, 0, -1);
  3836. }
  3837. if (substr($family, -1) == 'B') {
  3838. $style .= 'B';
  3839. $family = substr($family, 0, -1);
  3840. }
  3841. // normalize family name
  3842. $family = strtolower($family);
  3843. if ((!$this->isunicode) AND ($family == 'arial')) {
  3844. $family = 'helvetica';
  3845. }
  3846. if (($family == 'symbol') OR ($family == 'zapfdingbats')) {
  3847. $style = '';
  3848. }
  3849. if ($this->pdfa_mode AND (isset($this->CoreFonts[$family]))) {
  3850. // all fonts must be embedded
  3851. $family = 'pdfa'.$family;
  3852. }
  3853. $tempstyle = strtoupper($style);
  3854. $style = '';
  3855. // underline
  3856. if (strpos($tempstyle, 'U') !== false) {
  3857. $this->underline = true;
  3858. } else {
  3859. $this->underline = false;
  3860. }
  3861. // line-through (deleted)
  3862. if (strpos($tempstyle, 'D') !== false) {
  3863. $this->linethrough = true;
  3864. } else {
  3865. $this->linethrough = false;
  3866. }
  3867. // overline
  3868. if (strpos($tempstyle, 'O') !== false) {
  3869. $this->overline = true;
  3870. } else {
  3871. $this->overline = false;
  3872. }
  3873. // bold
  3874. if (strpos($tempstyle, 'B') !== false) {
  3875. $style .= 'B';
  3876. }
  3877. // oblique
  3878. if (strpos($tempstyle, 'I') !== false) {
  3879. $style .= 'I';
  3880. }
  3881. $bistyle = $style;
  3882. $fontkey = $family.$style;
  3883. $font_style = $style.($this->underline ? 'U' : '').($this->linethrough ? 'D' : '').($this->overline ? 'O' : '');
  3884. $fontdata = array('fontkey' => $fontkey, 'family' => $family, 'style' => $font_style);
  3885. // check if the font has been already added
  3886. $fb = $this->getFontBuffer($fontkey);
  3887. if ($fb !== false) {
  3888. if ($this->inxobj) {
  3889. // we are inside an XObject template
  3890. $this->xobjects[$this->xobjid]['fonts'][$fontkey] = $fb['i'];
  3891. }
  3892. return $fontdata;
  3893. }
  3894. // get specified font directory (if any)
  3895. $fontdir = false;
  3896. if (!TCPDF_STATIC::empty_string($fontfile)) {
  3897. $fontdir = dirname($fontfile);
  3898. if (TCPDF_STATIC::empty_string($fontdir) OR ($fontdir == '.')) {
  3899. $fontdir = '';
  3900. } else {
  3901. $fontdir .= '/';
  3902. }
  3903. }
  3904. // true when the font style variation is missing
  3905. $missing_style = false;
  3906. // search and include font file
  3907. if (TCPDF_STATIC::empty_string($fontfile) OR (!@file_exists($fontfile))) {
  3908. // build a standard filenames for specified font
  3909. $tmp_fontfile = str_replace(' ', '', $family).strtolower($style).'.php';
  3910. $fontfile = TCPDF_FONTS::getFontFullPath($tmp_fontfile, $fontdir);
  3911. if (TCPDF_STATIC::empty_string($fontfile)) {
  3912. $missing_style = true;
  3913. // try to remove the style part
  3914. $tmp_fontfile = str_replace(' ', '', $family).'.php';
  3915. $fontfile = TCPDF_FONTS::getFontFullPath($tmp_fontfile, $fontdir);
  3916. }
  3917. }
  3918. // include font file
  3919. if (!TCPDF_STATIC::empty_string($fontfile) AND (@file_exists($fontfile))) {
  3920. include($fontfile);
  3921. } else {
  3922. $this->Error('Could not include font definition file: '.$family.'');
  3923. }
  3924. // check font parameters
  3925. if ((!isset($type)) OR (!isset($cw))) {
  3926. $this->Error('The font definition file has a bad format: '.$fontfile.'');
  3927. }
  3928. // SET default parameters
  3929. if (!isset($file) OR TCPDF_STATIC::empty_string($file)) {
  3930. $file = '';
  3931. }
  3932. if (!isset($enc) OR TCPDF_STATIC::empty_string($enc)) {
  3933. $enc = '';
  3934. }
  3935. if (!isset($cidinfo) OR TCPDF_STATIC::empty_string($cidinfo)) {
  3936. $cidinfo = array('Registry'=>'Adobe', 'Ordering'=>'Identity', 'Supplement'=>0);
  3937. $cidinfo['uni2cid'] = array();
  3938. }
  3939. if (!isset($ctg) OR TCPDF_STATIC::empty_string($ctg)) {
  3940. $ctg = '';
  3941. }
  3942. if (!isset($desc) OR TCPDF_STATIC::empty_string($desc)) {
  3943. $desc = array();
  3944. }
  3945. if (!isset($up) OR TCPDF_STATIC::empty_string($up)) {
  3946. $up = -100;
  3947. }
  3948. if (!isset($ut) OR TCPDF_STATIC::empty_string($ut)) {
  3949. $ut = 50;
  3950. }
  3951. if (!isset($cw) OR TCPDF_STATIC::empty_string($cw)) {
  3952. $cw = array();
  3953. }
  3954. if (!isset($dw) OR TCPDF_STATIC::empty_string($dw)) {
  3955. // set default width
  3956. if (isset($desc['MissingWidth']) AND ($desc['MissingWidth'] > 0)) {
  3957. $dw = $desc['MissingWidth'];
  3958. } elseif (isset($cw[32])) {
  3959. $dw = $cw[32];
  3960. } else {
  3961. $dw = 600;
  3962. }
  3963. }
  3964. ++$this->numfonts;
  3965. if ($type == 'core') {
  3966. $name = $this->CoreFonts[$fontkey];
  3967. $subset = false;
  3968. } elseif (($type == 'TrueType') OR ($type == 'Type1')) {
  3969. $subset = false;
  3970. } elseif ($type == 'TrueTypeUnicode') {
  3971. $enc = 'Identity-H';
  3972. } elseif ($type == 'cidfont0') {
  3973. if ($this->pdfa_mode) {
  3974. $this->Error('All fonts must be embedded in PDF/A mode!');
  3975. }
  3976. } else {
  3977. $this->Error('Unknow font type: '.$type.'');
  3978. }
  3979. // set name if unset
  3980. if (!isset($name) OR empty($name)) {
  3981. $name = $fontkey;
  3982. }
  3983. // create artificial font style variations if missing (only works with non-embedded fonts)
  3984. if (($type != 'core') AND $missing_style) {
  3985. // style variations
  3986. $styles = array('' => '', 'B' => ',Bold', 'I' => ',Italic', 'BI' => ',BoldItalic');
  3987. $name .= $styles[$bistyle];
  3988. // artificial bold
  3989. if (strpos($bistyle, 'B') !== false) {
  3990. if (isset($desc['StemV'])) {
  3991. // from normal to bold
  3992. $desc['StemV'] = round($desc['StemV'] * 1.75);
  3993. } else {
  3994. // bold
  3995. $desc['StemV'] = 123;
  3996. }
  3997. }
  3998. // artificial italic
  3999. if (strpos($bistyle, 'I') !== false) {
  4000. if (isset($desc['ItalicAngle'])) {
  4001. $desc['ItalicAngle'] -= 11;
  4002. } else {
  4003. $desc['ItalicAngle'] = -11;
  4004. }
  4005. if (isset($desc['Flags'])) {
  4006. $desc['Flags'] |= 64; //bit 7
  4007. } else {
  4008. $desc['Flags'] = 64;
  4009. }
  4010. }
  4011. }
  4012. // check if the array of characters bounding boxes is defined
  4013. if (!isset($cbbox)) {
  4014. $cbbox = array();
  4015. }
  4016. // initialize subsetchars
  4017. $subsetchars = array_fill(0, 255, true);
  4018. $this->setFontBuffer($fontkey, array('fontkey' => $fontkey, 'i' => $this->numfonts, 'type' => $type, 'name' => $name, 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw, 'cbbox' => $cbbox, 'dw' => $dw, 'enc' => $enc, 'cidinfo' => $cidinfo, 'file' => $file, 'ctg' => $ctg, 'subset' => $subset, 'subsetchars' => $subsetchars));
  4019. if ($this->inxobj) {
  4020. // we are inside an XObject template
  4021. $this->xobjects[$this->xobjid]['fonts'][$fontkey] = $this->numfonts;
  4022. }
  4023. if (isset($diff) AND (!empty($diff))) {
  4024. //Search existing encodings
  4025. $d = 0;
  4026. $nb = count($this->diffs);
  4027. for ($i=1; $i <= $nb; ++$i) {
  4028. if ($this->diffs[$i] == $diff) {
  4029. $d = $i;
  4030. break;
  4031. }
  4032. }
  4033. if ($d == 0) {
  4034. $d = $nb + 1;
  4035. $this->diffs[$d] = $diff;
  4036. }
  4037. $this->setFontSubBuffer($fontkey, 'diff', $d);
  4038. }
  4039. if (!TCPDF_STATIC::empty_string($file)) {
  4040. if (!isset($this->FontFiles[$file])) {
  4041. if ((strcasecmp($type,'TrueType') == 0) OR (strcasecmp($type, 'TrueTypeUnicode') == 0)) {
  4042. $this->FontFiles[$file] = array('length1' => $originalsize, 'fontdir' => $fontdir, 'subset' => $subset, 'fontkeys' => array($fontkey));
  4043. } elseif ($type != 'core') {
  4044. $this->FontFiles[$file] = array('length1' => $size1, 'length2' => $size2, 'fontdir' => $fontdir, 'subset' => $subset, 'fontkeys' => array($fontkey));
  4045. }
  4046. } else {
  4047. // update fontkeys that are sharing this font file
  4048. $this->FontFiles[$file]['subset'] = ($this->FontFiles[$file]['subset'] AND $subset);
  4049. if (!in_array($fontkey, $this->FontFiles[$file]['fontkeys'])) {
  4050. $this->FontFiles[$file]['fontkeys'][] = $fontkey;
  4051. }
  4052. }
  4053. }
  4054. return $fontdata;
  4055. }
  4056. /**
  4057. * Sets the font used to print character strings.
  4058. * The font can be either a standard one or a font added via the AddFont() method. Standard fonts use Windows encoding cp1252 (Western Europe).
  4059. * The method can be called before the first page is created and the font is retained from page to page.
  4060. * If you just wish to change the current font size, it is simpler to call SetFontSize().
  4061. * Note: for the standard fonts, the font metric files must be accessible. There are three possibilities for this:<ul><li>They are in the current directory (the one where the running script lies)</li><li>They are in one of the directories defined by the include_path parameter</li><li>They are in the directory defined by the K_PATH_FONTS constant</li></ul><br />
  4062. * @param $family (string) Family font. It can be either a name defined by AddFont() or one of the standard Type1 families (case insensitive):<ul><li>times (Times-Roman)</li><li>timesb (Times-Bold)</li><li>timesi (Times-Italic)</li><li>timesbi (Times-BoldItalic)</li><li>helvetica (Helvetica)</li><li>helveticab (Helvetica-Bold)</li><li>helveticai (Helvetica-Oblique)</li><li>helveticabi (Helvetica-BoldOblique)</li><li>courier (Courier)</li><li>courierb (Courier-Bold)</li><li>courieri (Courier-Oblique)</li><li>courierbi (Courier-BoldOblique)</li><li>symbol (Symbol)</li><li>zapfdingbats (ZapfDingbats)</li></ul> It is also possible to pass an empty string. In that case, the current family is retained.
  4063. * @param $style (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line through</li><li>O: overline</li></ul> or any combination. The default value is regular. Bold and italic styles do not apply to Symbol and ZapfDingbats basic fonts or other fonts when not defined.
  4064. * @param $size (float) Font size in points. The default value is the current size. If no size has been specified since the beginning of the document, the value taken is 12
  4065. * @param $fontfile (string) The font definition file. By default, the name is built from the family and style, in lower case with no spaces.
  4066. * @param $subset (mixed) if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font.
  4067. * @param $out (boolean) if true output the font size command, otherwise only set the font properties.
  4068. * @author Nicola Asuni
  4069. * @public
  4070. * @since 1.0
  4071. * @see AddFont(), SetFontSize()
  4072. */
  4073. public function SetFont($family, $style='', $size=null, $fontfile='', $subset='default', $out=true) {
  4074. //Select a font; size given in points
  4075. if ($size === null) {
  4076. $size = $this->FontSizePt;
  4077. }
  4078. if ($size < 0) {
  4079. $size = 0;
  4080. }
  4081. // try to add font (if not already added)
  4082. $fontdata = $this->AddFont($family, $style, $fontfile, $subset);
  4083. $this->FontFamily = $fontdata['family'];
  4084. $this->FontStyle = $fontdata['style'];
  4085. if (isset($this->CurrentFont['fontkey']) AND isset($this->CurrentFont['subsetchars'])) {
  4086. // save subset chars of the previous font
  4087. $this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']);
  4088. }
  4089. $this->CurrentFont = $this->getFontBuffer($fontdata['fontkey']);
  4090. $this->SetFontSize($size, $out);
  4091. }
  4092. /**
  4093. * Defines the size of the current font.
  4094. * @param $size (float) The font size in points.
  4095. * @param $out (boolean) if true output the font size command, otherwise only set the font properties.
  4096. * @public
  4097. * @since 1.0
  4098. * @see SetFont()
  4099. */
  4100. public function SetFontSize($size, $out=true) {
  4101. // font size in points
  4102. $this->FontSizePt = $size;
  4103. // font size in user units
  4104. $this->FontSize = $size / $this->k;
  4105. // calculate some font metrics
  4106. if (isset($this->CurrentFont['desc']['FontBBox'])) {
  4107. $bbox = explode(' ', substr($this->CurrentFont['desc']['FontBBox'], 1, -1));
  4108. $font_height = ((intval($bbox[3]) - intval($bbox[1])) * $size / 1000);
  4109. } else {
  4110. $font_height = $size * 1.219;
  4111. }
  4112. if (isset($this->CurrentFont['desc']['Ascent']) AND ($this->CurrentFont['desc']['Ascent'] > 0)) {
  4113. $font_ascent = ($this->CurrentFont['desc']['Ascent'] * $size / 1000);
  4114. }
  4115. if (isset($this->CurrentFont['desc']['Descent']) AND ($this->CurrentFont['desc']['Descent'] <= 0)) {
  4116. $font_descent = (- $this->CurrentFont['desc']['Descent'] * $size / 1000);
  4117. }
  4118. if (!isset($font_ascent) AND !isset($font_descent)) {
  4119. // core font
  4120. $font_ascent = 0.76 * $font_height;
  4121. $font_descent = $font_height - $font_ascent;
  4122. } elseif (!isset($font_descent)) {
  4123. $font_descent = $font_height - $font_ascent;
  4124. } elseif (!isset($font_ascent)) {
  4125. $font_ascent = $font_height - $font_descent;
  4126. }
  4127. $this->FontAscent = ($font_ascent / $this->k);
  4128. $this->FontDescent = ($font_descent / $this->k);
  4129. if ($out AND ($this->page > 0) AND (isset($this->CurrentFont['i'])) AND ($this->state == 2)) {
  4130. $this->_out(sprintf('BT /F%d %F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
  4131. }
  4132. }
  4133. /**
  4134. * Returns the bounding box of the current font in user units.
  4135. * @return array
  4136. * @public
  4137. * @since 5.9.152 (2012-03-23)
  4138. */
  4139. public function getFontBBox() {
  4140. $fbbox = array();
  4141. if (isset($this->CurrentFont['desc']['FontBBox'])) {
  4142. $tmpbbox = explode(' ', substr($this->CurrentFont['desc']['FontBBox'], 1, -1));
  4143. $fbbox = array_map(array($this,'getAbsFontMeasure'), $tmpbbox);
  4144. } else {
  4145. // Find max width
  4146. if (isset($this->CurrentFont['desc']['MaxWidth'])) {
  4147. $maxw = $this->getAbsFontMeasure(intval($this->CurrentFont['desc']['MaxWidth']));
  4148. } else {
  4149. $maxw = 0;
  4150. if (isset($this->CurrentFont['desc']['MissingWidth'])) {
  4151. $maxw = max($maxw, $this->CurrentFont['desc']['MissingWidth']);
  4152. }
  4153. if (isset($this->CurrentFont['desc']['AvgWidth'])) {
  4154. $maxw = max($maxw, $this->CurrentFont['desc']['AvgWidth']);
  4155. }
  4156. if (isset($this->CurrentFont['dw'])) {
  4157. $maxw = max($maxw, $this->CurrentFont['dw']);
  4158. }
  4159. foreach ($this->CurrentFont['cw'] as $char => $w) {
  4160. $maxw = max($maxw, $w);
  4161. }
  4162. if ($maxw == 0) {
  4163. $maxw = 600;
  4164. }
  4165. $maxw = $this->getAbsFontMeasure($maxw);
  4166. }
  4167. $fbbox = array(0, (0 - $this->FontDescent), $maxw, $this->FontAscent);
  4168. }
  4169. return $fbbox;
  4170. }
  4171. /**
  4172. * Convert a relative font measure into absolute value.
  4173. * @param $s (int) Font measure.
  4174. * @return float Absolute measure.
  4175. * @since 5.9.186 (2012-09-13)
  4176. */
  4177. public function getAbsFontMeasure($s) {
  4178. return ($s * $this->FontSize / 1000);
  4179. }
  4180. /**
  4181. * Returns the glyph bounding box of the specified character in the current font in user units.
  4182. * @param $char (int) Input character code.
  4183. * @return mixed array(xMin, yMin, xMax, yMax) or FALSE if not defined.
  4184. * @since 5.9.186 (2012-09-13)
  4185. */
  4186. public function getCharBBox($char) {
  4187. if (isset($this->CurrentFont['cbbox'][$char])) {
  4188. return array_map(array($this,'getAbsFontMeasure'), $this->CurrentFont['cbbox'][intval($char)]);
  4189. }
  4190. return false;
  4191. }
  4192. /**
  4193. * Return the font descent value
  4194. * @param $font (string) font name
  4195. * @param $style (string) font style
  4196. * @param $size (float) The size (in points)
  4197. * @return int font descent
  4198. * @public
  4199. * @author Nicola Asuni
  4200. * @since 4.9.003 (2010-03-30)
  4201. */
  4202. public function getFontDescent($font, $style='', $size=0) {
  4203. $fontdata = $this->AddFont($font, $style);
  4204. $fontinfo = $this->getFontBuffer($fontdata['fontkey']);
  4205. if (isset($fontinfo['desc']['Descent']) AND ($fontinfo['desc']['Descent'] <= 0)) {
  4206. $descent = (- $fontinfo['desc']['Descent'] * $size / 1000);
  4207. } else {
  4208. $descent = (1.219 * 0.24 * $size);
  4209. }
  4210. return ($descent / $this->k);
  4211. }
  4212. /**
  4213. * Return the font ascent value.
  4214. * @param $font (string) font name
  4215. * @param $style (string) font style
  4216. * @param $size (float) The size (in points)
  4217. * @return int font ascent
  4218. * @public
  4219. * @author Nicola Asuni
  4220. * @since 4.9.003 (2010-03-30)
  4221. */
  4222. public function getFontAscent($font, $style='', $size=0) {
  4223. $fontdata = $this->AddFont($font, $style);
  4224. $fontinfo = $this->getFontBuffer($fontdata['fontkey']);
  4225. if (isset($fontinfo['desc']['Ascent']) AND ($fontinfo['desc']['Ascent'] > 0)) {
  4226. $ascent = ($fontinfo['desc']['Ascent'] * $size / 1000);
  4227. } else {
  4228. $ascent = 1.219 * 0.76 * $size;
  4229. }
  4230. return ($ascent / $this->k);
  4231. }
  4232. /**
  4233. * Return true in the character is present in the specified font.
  4234. * @param $char (mixed) Character to check (integer value or string)
  4235. * @param $font (string) Font name (family name).
  4236. * @param $style (string) Font style.
  4237. * @return (boolean) true if the char is defined, false otherwise.
  4238. * @public
  4239. * @since 5.9.153 (2012-03-28)
  4240. */
  4241. public function isCharDefined($char, $font='', $style='') {
  4242. if (is_string($char)) {
  4243. // get character code
  4244. $char = TCPDF_FONTS::UTF8StringToArray($char, $this->isunicode, $this->CurrentFont);
  4245. $char = $char[0];
  4246. }
  4247. if (TCPDF_STATIC::empty_string($font)) {
  4248. if (TCPDF_STATIC::empty_string($style)) {
  4249. return (isset($this->CurrentFont['cw'][intval($char)]));
  4250. }
  4251. $font = $this->FontFamily;
  4252. }
  4253. $fontdata = $this->AddFont($font, $style);
  4254. $fontinfo = $this->getFontBuffer($fontdata['fontkey']);
  4255. return (isset($fontinfo['cw'][intval($char)]));
  4256. }