)EjydZdZdZdZddlZddlZddlZddlZddlZddl m Z m Z m Z ddl mZdd lmZdd lmZdd lmZd ed eeeeffdZd ed efdZGddZGddeZdS)zj PDF template helpers for fpdf2. Usage documentation at: z%Mariano Reingart z#Copyright (C) 2010 Mariano ReingartzLGPL 3.0N)AnyOptionalSequence)get_stack_level)WrapMode) FPDFException)FPDFcolreturnc$|dz|dzdz|dzfS)Ni)r s ?C:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/template.py_rgbrs 5LC3J,c ::ct|\}}}|dkr |dkr|dks|dkr |dz ddS|dz dd|dz dd|dz ddS)Nrz.3fz g z rg)r)r rgbs r _rgb_as_strrs~3iiGAq! Q166a1ffbc'!!!!!#g : : :AG : : :!c' : : : ::rc'&eZdZdZ dQdedeeeee fddfdZ deeee fddfdZ e dede fd Ze dedeefd ZdRd ejed eddfdZ dSd ejededed eeddf dZdede ddfdZeZdedefdZdede fdZdededeefdZdddddddd d!d!d!ddddd"d#d$e d%ed&ed'ed(eded)ed*ed+ed,ed-ed.ed/ed0e d1ee d2eed3ed4e ddf&d5Zdddddd ddd6d$e d%ed&ed'ed(ed*ed+ed0e d7eeeeefd4e ddfd8Zdddddd dddd9 d$e d%ed&ed'ed(ed*ed+ed0e d1ee d7eeeeefd4e ddfd:Zdddddd dddd9 d$e d%ed&ed'ed(ed*ed+ed0e d1ee d7eeeeefd4e ddfd;Z dddddd<d$e d%ed&ed'ed(eded4e ddfd=Z!dddddd>d?d dd@ d$e d%ed&ed'ed(eded)ed*ed+ed0e d4e ddfdAZ"dddddBd ddddddC d$e d%ed&ed(eded*ed+ed0e dDeedEeedFeedGeed4e ddfdHZ#dddddddd d!d!d!dddI d$e d%ed&ed'ed(eded)ed*ed+ed,ed-ed.edJee ezd0e d4e ddf dKZ$ dTdMedNedOed+eddf dPZ%dS)U FlexTemplatez A flexible templating class. Allows to apply one or several template definitions to any page of a document in any combination. Usage documentation at: Npdfelementsr c t|tstd||_d|_|r|||j|j|j|j |j |j |j |j d|_i|_dS)aC Args: pdf (fpdf.fpdf.FPDF): All content will be added to this `FPDF` instance. elements (list[dict]): A template definition in a list of dicts. If you omit this, then you need to call either load_elements() or parse_csv() before doing anything else. z('pdf' must be an instance of fpdf.FPDF()N)TLIBEBCC39W) isinstancer TypeErrorr splitting_pdf load_elements_text_line_image_rect_ellipse_barcode_code39_writehandlerstexts)selfrrs r__init__zFlexTemplate.__init__-s#t$$ HFGG G-1  )   x ( ( (-<    &( rc idttdfdttdfdttfdttfdttfdttfdttdfd ttfd td td td tdtdttdfdttdfdtdt tdfttfttdft tdfd}||_g|_|D]}d|vrd|d<dD]p}||vrj|ddkrK|dkrd|vr |d|d<(|dkrd|vr |d|d<>|dkrd|vr|d|dz|d<]td|dqd|vr|ddvrd|d<ntdd |vr|ddkrd|vr |d|d <d|vr|dD]}|d vrtd!|d"d#|dvr d|dd#<d$|dvr|dd#|dd$<d%|dvr d|dd%<| D]\}}||vrt|||slt|tr|j nd& d'|D}td(|d)|d*t||j d+|j|ddS),z Load a template definition. Args: elements (list of dicts): A template definition in a list of dicts nameNtypex1y1x2y2fontsizebolditalic underline foreground backgroundaligntextpriority multiline)rotatewrapmode dash_patternr)r9r:r;r<r>r&xyhzMandatory key 'z' missing in input datar%r&z(Mandatory key 'x2' missing in input datawrL)dashgapphasez Invalid key 'z' in dash_patternrRrSrTz or c$g|] }d|jdS)')__name__).0rMs r z.FlexTemplate.load_elements..s&)G)G)G*;aj*;*;*;)G)G)GrzValue of element item 'z ' must be z, not ''.)strr:intfloatobjectbooldictrkeysKeyErroritemsr(rWjoinr)appendlower)r6r key_configektttypes rr+zFlexTemplate.load_elementsIsS S$t**%  S$t**%  3,  3,  3,   3,  S$t**%  S%L  F  f    #  #  c4::& S$t**%! " # $ $T +% &Eld4jj)!4::.+   03; ! 2 02 0A?? !* 7 Q QA::yE))99&'fAdG$99&'fAdG$99&'g#&6AdG$"#OQ#O#O#OPPP 1}}V9 --AdGG"#MNNNQ;;1V9#5#5!88 !#AfI"">*//11MMA 888&'Kq'K'K'KLLL9>!22201An%f-. 111/0/@/HAn%e,!N"33312An%g."((**  166*QqT1"5"56&a..I #[[)G)GQ)G)G)GHH $d!dduddTRSTURVZZM`ddd I  QvY__.. / / / /e2 02 0rsc|dddvrt|dS|ddkrt|dSt|S)z#Allow hex and oct values for colorsN)0x0Xr0r\)rls r_parse_colorcodezFlexTemplate._parse_colorcodesK RaR5L q"::  Q43;;q!99 1vv rcDt|}|dkrdS|dkrdSdS)NrTFrt)rlis r_parse_multilinezFlexTemplate._parse_multilines. FF q554 q555trutf-8infileencodingct||5}tj|}|D]}|d}|rgt |t rR|drt|ddd|d<ntd|d}|rgt |t rR|drt|ddd|d<td | |ddddS#1swxYwYdS) a Load the template definition from a JSON file. The data must be structured as an array of objects, with names and values exactly equivalent to what would get supplied to load_elements(), Args: infile (str, path-like object): The filepath of the JSON file. encoding (str): The character encoding of the file. Default is UTF-8. r{rD#rNrqz;If foreground is a string, it must have the form '#rrggbb'.rEz;If background is a string, it must have the form '#rrggbb'.) openjsonloadgetr(r[rf startswithr\ ValueErrorr+)r6rzr{fdatadfgvalbgvals r parse_jsonzFlexTemplate.parse_jsons&8 , , , %9Q<._varsep_floats0!'')).w77 SIIJJ Jrr9Tr:r;r<r=r>r?Fr@rArBrCrDrErFrGrHrIrJrKNr})rrnrrrPzMandatory value 'z' missing in csv datacBg|]}|dS)r9rf)rXvals rrYz*FlexTemplate.parse_csv..s(BBBSS[&&((BBBr)rr)r[r]r\rurxrlocalegetpreferredencodingrcsvreaderextendlenziprr rera) r6rzrrr{rrgrrowkargsrcfgvss ` r parse_csvzFlexTemplate.parse_csvs( K KS K3 K K K K K K KS$  S$  =$ ' =$ ' =$ ' =$ ' S% ]E * S% sE " #u % 40% 8 40% 8 c5 ! S% e $ $/ 7 }e , e $) ,  244H &8 , , , ,z!y999 , , B43z??SXX#=>???(* #C 4 433HCB3q6 2"1v~~#a&M2I2I $&3$UA$U$U$U'"'"!"!Vz1101E*-)/Ar c!f  $$U+++++ , , , , , , , , , , , , , , , ,.CBDMBBB sCz+FlexTemplate.__getitem__..8s? J J161B1Bc1I1IQvY1I1I1I1I J Jr) r(r[r:rWrarbrfr5nextr)r6r9rs @r __getitem__zFlexTemplate.__getitem__,s #   G G FtDzz/B F F F G G  ty 4.. jjll $*  :c? " J J J J J J JD   rrG element_namec tfd|jD}|js,t|_|j|jJd}|dr|dz }|dr|dz }|dr|d z }|j|d ||d |j|d |d z |d|dz t||dddd|ddS)a Split a string between words, for the parts to fit into a given element width. Additional splits will be made replacing any '\n' characters. Args: text (str): The input text string. element_name (str): The name of the template element to fit the text inside. Returns: A list of substrings, each of which will fit into the element width when rendered in the element font style and size. c3|K|]6}|dk2|V7dS)r9Nr)rXelementrs rrz/FlexTemplate.split_multicell..HsV  v$$&&,*<*<*>*>>> >>>>  rNrrAr#rBr"rCUr?r@r=r;r>r<rFTLINESrKWORD)rQrOrGrFdry_runoutputrK) rrr*r add_pagerset_font multi_cellr[)r6rGrrstyles ` rsplit_multicellzFlexTemplate.split_multicell;si    =      ! *!%D    ' ' ) ) )!--- ;;v    SLE ;;x   SLE ;;{ # #  SLE ##GFOUGFOLLL!,,dmgdm+dmgdm+T++gr**[[V44-   rrr helvetica ?Fr)r;r<r=r>rGr?r@scalerArBrCrFrDrErIrK_r;r<r=r>r?r@rrArBrCrFrDrErIrK__c |sdS|j}|jt| kr|jt | |d}n1d}|jt|kr|jt ||}d}dD]C}| d|dr(| d|dr|dd }||z }D| r|d z }| r|d z }| r|d z }| ||||z| ||||z ||z }}|| |||d | |dS|r0||||d | |tj|dS||||| tj|ddd }| |||d | |dS)NFTrr#r"r<>rGr?r@rrArBrCrFrDrErIrKrrrrrtagwidthheights rr,zFlexTemplate._textcsQ*  Fh >[44 4 4 C Z 0 0 1 1  DDD~Z!8!888""D$4$455zz||!!##   Cz3zzz** t}}[#[[[/I/I AbDz    SLE   SLE   SLE T5$,/// 2rRbv   HHuT!5tH T T T T T  U NN!22      >>!22"D HHuT!5tH T T T T Tr)r;r<r=r>r@rrDrLrLc|jjJ|jjt |kr|jjt ||j||z||jj} t|trY|j | dd| dd| ddn.|j |d|d|d|j ||||||jj di| dSdS)NrRrrSrTrrnr)r draw_color serializerfrset_draw_colorrset_line_widthrLr(r`set_dash_patternrline) r6r;r<r=r>r@rrDrLrrrestore_dash_patterns rr-zFlexTemplate._linesx"... 8  ( ( * * 0 0 2 2k*6M6M M M #DH #T*%5%5 6 6 u ---  ##'8#8 ,-- )) $$!$$q!$$    )) O\!_l1o  b"b"%%%  # %DH %  &      $ #r) r;r<r=r>r@rrDrErLc |j} | jJ| jt |kr| jt ||d} n1d} | jt |kr| jt || ||z| |jj }t| trT| | dd| dd| ddn)| | d| d| d| ||||z ||z | | |jj d i|dSdS NDFDrRrrSrTrrn)rr)rrrrfrrrrrrrLr(r`rrrectr6r;r<r=r>r@rrDrErLrrrrrs rr/zFlexTemplate._rectsh~))) > # # % % + + - -Z1H1H H H C Z 0 0 1 1  EEE~Z!8!888""D$4$455 4%<(((  ##'8#8 ,-- X$$ $$!$$q!$$    $$\!_l1o|TUWWW Rb"r'777  # %DH %  &      $ #rc |j} | jJ| jt |kr| jt ||d} n1d} | jt |kr| jt || ||z| |jj }t| trT| | dd| dd| ddn)| | d| d| d| ||||z ||z | | |jj d i|dSdSr)rrrrfrrrrrrrLr(r`rrellipsers rr0zFlexTemplate._ellipsesh~))) > # # % % + + - -Z1H1H H H C Z 0 0 1 1  EEE~Z!8!888""D$4$455 4%<(((  ##'8#8 ,-- X$$ $$!$$q!$$    $$\!_l1o|TUWWW BBGR"WE :::  # %DH %  &      $ #r)r;r<r=r>rGcZ|r(|j|||||z ||z ddSdS)Nr)rQrOlink)rimage)r6r;r<r=r>rGrrs rr.zFlexTemplate._image5sG  H HNN4R27b2gBN G G G G G H Hrinterleaved 2of5 ntr) r;r<r=r>rGr?r@rrDc h|j} | jJ| jt | kr| jt | |}|dkr"| |||||z||z dSdS)Nr)rQrO) rrrrfrrrrinterleaved2of5) r6r;r<r=r>rGr?r@rrDrrrs rr1zFlexTemplate._barcodeBsh~))) > # # % % + + - -Z1H1H H H C Z 0 0 1 1zz||!!## ( ( (   b"u R  H H H H H ) (rg?) r;r<r>rGr@rrDrMrNrQrOrMrNrQrOc ~|| | | (tjdtt|j}|jJ|jt|kr|j t|||z } | dkrd} | |||||z| dS)NzVcode39 arguments x/y/w/h are deprecated since v2.4.4, please use x1/y1/y2/size instead stacklevelr) warningswarnDeprecationWarningrrrrrfrrrcode39)r6r;r<r>rGr@rrDrMrNrQrOrrrs rr2zFlexTemplate._code39Ys =AMQ]am M8#*,,     h~))) > # # % % + + - -Z1H1H H H C Z 0 0 1 1 G 66A 4Rq11111r) r;r<r=r>rGr?r@rrArBrCrrDrc |sdS|j}|jt| kr|jt | |}d}dD]C}|d|dr(|d|dr|dd}||z }D| r|dz }| r|d z }| r|d z }| ||||z| ||| d || dS) Nrrrrrrrr#r"rr) rrrrrrrfrrrrwrite)r6r;r<r=r>rGr?r@rrArBrCrrDrrrrrs rr3zFlexTemplate._write}s=&  Fh >[44 4 4 C Z 0 0 1 1zz||!!##   Cz3zzz** t}}[#[[[/I/I AbDz    SLE   SLE   SLE T5$,/// 2r !T4     roffsetxoffsetyrJc @t|jd}|j5|D]I}|}|j|d|dd|d<|dkr\|d|z|d<|d|z|d<|d|d |dz |zz|d <|d|d |dz |zz|d <|r|d|z|d<|d |z|d <|r|d|z|d<|d |z|d <||d <|d }|r|j |||5d |vrb|d rZ|j |d |d|d5|j |di|dddn #1swxYwYn|j |di|dddn #1swxYwYd |vrc|d r[|j |d |d|d5|j |di|dddn #1swxYwY6|j |di|K dddn #1swxYwYi|_dS)aX Add the contents of the template to the PDF document. Args: offsetx, offsety (float): Place the template to move its origin to the given coordinates. rotate (float): Rotate the inserted template around its (offset) origin. scale (float): Scale the inserted template by this factor. c|dS)NrHr)rMs rz%FlexTemplate.render..s a mr)rr9rGrrr;r<r=r>rr:rJNr) sortedrr local_contextcopyr5rrfupperrotationr4) r6rrrJrsorted_elementsrele handler_names rrenderzFlexTemplate.renders!4K4KLLL X # # % % ; ;* ; ;llnn"jnnS[->->-@-@#''&RTBUBUVVF C<< #D E 1CI #D E 1CI #D c$i'$-.G5-P QCI #D c$i'$-.G5-P QCI4 #D G 3CI #D G 3CI4 #D G 3CI #D G 3CI$G "6{0022  ;**67GDD??#s??s8}?!%!2!23x=#d)SQUY!W!WCC ; l ; B Bc B B BCCCCCCCCCCCCCCC8DM,7>>#>>> ??????????????? 33x=!X..s8}c$iTSS??7DM,7>>#>>>???????????????4 l3::c::::9 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;< s~D?J 0;G6+G ? G6 G G6G G6* J 6G: :J =G: >?J =I J I! !J $I! %J  JJ)N)ry)rrN)rrrr)&rW __module__ __qualname____doc__r rrr`r[rr7r+ staticmethodr\rur_rxosPathLikerrrsetrrlistrr]r,tupler-r/r0r.r1r2r3rrrrrr#sE IM(((#+HT#s(^,D#E( ((((8S0htCH~&>S04S0S0S0S0jCC\CHTN\%%S!1%S%t%%%%D"& ICIC C ICIC IC 3- IC  ICICICICV))C)D)))) C))))))         & C& s& tCy& & & & V$($(%FUFUFU FU FU  FU  FU  FUFUFUFUFUFUFUFUFUFU SM!FU"D>#FU$%FU&'FU( )FUFUFUFUV=A((( ( (  (  (  ((((uUE5%89:(( ((((Z$(=A... . .  .  .  ....SM.uUE5%89:.. ....f$(=A... . .  .  .  ....SM.uUE5%89:.. ....f H H H  H  H  H  H  H H H  H H H H )III I I  I  I  IIIIIII IIII4!!!! 2 2 2  2  2  2  2  2 2 2 2 E? 2 E? 2 E? 2 E? 2 2  2 2 2 2N$&&!&!&! &! &!  &!  &!  &!&!&!&!&!&!&!&!sSy!&!&! !&!" #&!&!&!&!T .... .  .  ......rrceZdZdZ ddeejedeee ee fd ed ed ed ed ededededdffd Z ddZ ddeedeeddffd Z xZS)Templatez A simple templating class. Allows to apply a single template definition to all pages of a document. Usage documentation at: NA4portraitmmrrzrformat orientationunittitleauthorsubjectcreatorkeywordsr c |r(tjdttdD]<} t t | t std| d=t|||} | || || | | || | t| |dS) a Args: infile (str): [**DEPRECATED since 2.2.0**] unused, will be removed in a later version elements (list[dict]): A template definition in a list of dicts. If you omit this, then you need to call either load_elements() or parse_csv() before doing anything else. format (str): The page format of the document (eg. "A4" or "letter"). orientation (str): The orientation of the document. Possible values are "portrait"/"P" or "landscape"/"L" unit (str): The units used in the template definition. One of "mm", "cm", "in", "pt", or a number for points per unit. title (str): The title of the document. author (str): The author of the document. subject (str): The subject matter of the document. creator (str): The creator of the document. zD"infile" is deprecated since v2.2.0, unused and will soon be removedr)rrrrrrrrz Argument "z" must be of type str.)rrr)rrN)rrrrr(localsr[r)r set_title set_author set_creator set_subject set_keywordssuperr7)r6rzrrrrrrrrrargr __class__s rr7zTemplate.__init__s:   MV"*,,      J JCfhhsmS11 J HS H H HIII J&kEEE e v         """ S844444rcx|jjr||jdS)z5Finish the current page, and proceed to the next one.N)rpagerr)r6s rrzTemplate.add_pages5 8=  KKMMM routfiledestcJ|r(tjdtt|jddd|jdd t|r|j |d Sd S) aZ Finish the document and process all pending data. Args: outfile (str): If given, the PDF file will be written to this file name. Alternatively, the `.pdf.output()` method can be manually called. dest (str): [**DEPRECATED since 2.2.0**] unused, will be removed in a later version. zB"dest" is deprecated since v2.2.0, unused and will soon be removedrrr#rq)rr@Fr)marginN) rrrrrrset_auto_page_breakr%rr)r6r*r+r's rrzTemplate.render s   MT"*,,     +Sr::: $$U1$555   % HOOG $ $ $ $ $ % %r) NNrrrrrrrr)r N)NN)rWrr r rr r r[rr`rr7rr __classcell__)r's@rrrsL.27;%6565S)*658DcN3465 65  65  656565656565 656565656565p%%hsm%(3-%SW%%%%%%%%%%rr)r  __author__ __copyright__ __license__rrrr rtypingrrr deprecationrenumsrerrorsr fpdfr r\rr]rr[rrrrrrr8sr 5 5  **********((((((!!!!!!;c;eE5%/0;;;;;S;S;;;;p p p p p p p p f]%]%]%]%]%|]%]%]%]%]%r