)Ej~dZddlZddlmZmZddlmZddlmZm Z m Z m Z m Z m Z mZmZddlmZmZmZmZddlmZdd lmZmZdd lmZdd lmZmZdd lm Z erdd l!m"Z"ddlm#Z#m$Z$ddl%m&Z&ddlm'Z'Gdde Z(GddeZ)Gdde Z*GddZ+GddZ,GddZ-GddeZ.Gdd e.Z/Gd!d"eZ0Gd#d$e/e0Z1dS)%zJ Usage documentation at: N)ABCabstractmethod) TracebackType) TYPE_CHECKINGAny NamedTupleOptionalSequenceTypeUnioncast)AlignWrapModeXPosYPos) FPDFException)RasterImageInfoVectorImageInfo) preload_image) FORM_FEEDMultiLineBreak)get_scale_factor)FPDF)FragmentTextLine) SVGObject) ImageDatac$eZdZUeed<eed<dS)ExtentsleftrightN)__name__ __module__ __qualname__float__annotations__BC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/text_region.pyr r $s" KKK LLLLLr)r cpeZdZdZdededdffd Zdedddfd Zdeddefd Z d d Z xZ S) TextRegionMixinz>Mix-in to be added to FPDF() in order to support text regions.argskwargsreturnNcpd|_|tj|i|dSN)%_TextRegionMixin__current_text_regionclear_text_regionsuper__init__)selfr-r. __class__s r*r5zTextRegionMixin.__init__,s?=A"    $)&)))))r)region TextRegionParagraphCollectorMixinc0td||_dS)Nr:)r r2r6r8s r*register_text_regionz$TextRegionMixin.register_text_region1s&*,%?%?"""r)c|j|kSr1r2r=s r*is_current_text_regionz&TextRegionMixin.is_current_text_region6s)V33r)cd|_dSr1r@r6s r*r3z!TextRegionMixin.clear_text_region;s%)"""r)r/N) r#r$r%__doc__rr5r r>boolrAr3 __classcell__r7s@r*r,r,)sHH*c*S*T****** @CD@ @@@@ 4CD4 4444 ********r)r,cDeZdZUdZded<ded<dZeed<dZeed<d S) LineWrapperzConnects each TextLine with the Paragraph it was written to. This allows to access paragraph specific attributes like top/bottom margins when rendering the line. rline Paragraph paragraphF first_line last_lineN)r#r$r%rEr'rNrFrOr(r)r*rJrJ?sV JItr)rJcJeZdZdeddeddeddfdZdefd ZdS) Bulletbullet_fragmentsr text_linerbullet_r_marginr/Nc>||_||_||_d|_dS)NF) fragmentsrSr_margin rendered_flag)r6rRrSrTs r*r5zBullet.__init__Ls( 0@"' #(r)cLd}|jD]}||z }|SNr)rV get_width)r6fragments_widthfrags r*get_fragments_widthzBullet.get_fragments_widthWs4!"N 0 0D t~~// /OOr))r#r$r%r r r&r5r^r(r)r*rQrQKss )":. )J' ) )  ) ) ) )Ur)rQceZdZ d#deddeeezdeed ed ed ed eed ededee defdZ defdZ d$dZ dee edeedeeddfdZd%dedeeezddfdZd ed edeeededffdZd%deeddfd Zd!edeefd"ZdS)&rLNrFr8r9 text_align line_height top_margin bottom_marginindentrT bullet_stringskip_leading_spaceswrapmodefirst_line_indentc ||_|j|_d|_|rctj|} | tjtjtjtjfvrtd| j d| |_| |j |_ n||_ ||_ ||_ ||_| |_| |jj|_nt#j| |_g|_|dt'dz|jjz }|rP|||} t-| t.sJt1| d| d||_nd|_| |_dS)NAText_align must be 'LEFT', 'CENTER', 'RIGHT', or 'JUSTIFY', not ''.mmrr)_regionpdfrarcoerceLCRJ ValueErrorvaluerbrcrdrergrhr_text_fragmentsrkgenerate_bullet_frags_and_tl isinstancetuplerQbulletri)r6r8rarbrcrdrerTrfrgrhritext_align_convbullet_frags_and_tls r*r5zParagraph.__init___s~ !:+/  .%*\*%=%=Ouw%'&JJJ qXgXmqqq.DO  %1D  *D $* #6   L1DMM$OH55DM13  " "24"8"8848:EO  "&"C"C## 1599 9 99,2#A&(;A(>--DKKDK!2r)r/cd|jd|jd|jd|jd|jd|jdt |jdS) NzParagraph(text_align=z, line_height=z , top_margin=z, bottom_margin=z, skip_leading_spaces=z , wrapmode=z, #text_fragments=))rarbrcrdrgrhlenrxrCs r*__str__zParagraph.__str__s =DO = =4CS = =bfbq = ="0 = =HLH` = =mqmz = = #D$8 9 9 = = = r)c|Sr1r(rCs r* __enter__zParagraph.__enter__s r)exc_type exc_value tracebackc8|jdSr1)ro end_paragraphr6rrrs r*__exit__zParagraph.__exit__s ""$$$$$r)textlinkc |jjstd|j|dd}|j|d}|r |D] }||_ |j|dS)N3No font set, you need to call set_font() beforehand r`Fmarkdown) rp font_familyrnormalize_textreplace_preload_font_stylesrrxextend)r6rrnormalized_stringrVr]s r*writezParagraph.writesx# W UVV V H33D99AA$KK H ) )!E *     !! ! !   ##I.....r)rrc |sdS|j|}|jjstd|j|d}d}|D]}||z }t ||jj|jj|j |z |z z|jjf|j p|jj p tj |j |j|jp |jj}|}||fS)NrFrr) max_widthmarginsalignrhrbrg)rprrrrr[rroc_marginrerarrrrhrbrgget_line)r6rfrTrRr\r]bullet_line_breakbullet_text_lines r*rzz&Paragraph.generate_bullet_frags_and_tls/ 4// >> x# W UVV V H ) ) *    "#$ 0 0D t~~// /OO* l,!T[?%B_%TU!/GT\%<G]( $ 8!0|/    -5577!111r)hc|jjstd||jj|jz}|jddd}||jz|j_|j |dS)Nr Frr) rprr font_sizerbrrygraphics_state font_size_ptrxappend)r6rfragments r*lnz Paragraph.lnsx# W UVV V 9"T%55A800 51     018:~, ##H-----r)print_shc g}t|j|jj|jj|jz|jjf|j|jp|jjp tj ||j |j |j p |jj  }g|_|}d}|=|t!|||d}|}|=|r*|d}t!|j||jd}||d<|S)N)rrrirrrhrbrgT)rNF)rNrO)rrxror[rprrerirarrrrhrbrgrrrJrKrN)r6r text_linesmulti_line_breakrSrNlasts r* build_lineszParagraph.build_liness,(* )  l,X&4dh6GH"4/GT\%<G]( $ 8!0|/     "$--//  #   k)TjQQQ R R RJ(1133I#  "b>D 4DOtD"JrNr)) NNrrrNr`FNr)r/rLr1)r#r$r%r r strrr&rFrr5rrr BaseExceptionrrintrr|r rzrlistrJrr(r)r*rLrL^s"-1'+ +/$)'+#$3333=>33S5[)33e_ 33  33  3333"%3333"338$33!33333333j     %4 ./%M*%M* %  %%%% / /# /XcCi%8 /D / / / /2 2382 %,hz.BBC D2222@ . .HUO .t . . . .DT+->r)rLceZdZ ddeddedeeezdeed eed ed ed ed edeee zdeedeeddfdZ ddZ dedededee e zfdZdS)ImageParagraphNFrr8r9namerwidthheight fill_widthkeep_aspect_ratiorcrdrtitlealt_textr/c ||_||_d|_|rXtj|} | tjtjtjfvrtd| j d| |_||_ ||_ ||_ ||_ ||_| |_| |_| |_| |_d|_d|_||_dS)Nz1Align must be 'LEFT', 'CENTER', or 'RIGHT', not 'rl)r8rrrrqrrrsrtrvrwrrrrrcrdrrrimginforK)r6r8rrrrrrrcrdrrr align_convs r*r5zImageParagraph.__init__s  &*  $e,,J%'57EG!<<< \ HX\\\$DJ  $!2$*    (,AE $( r)ctt|jjj|j\|_|_|_|Sr1)rr8rp image_cacherrrrCs r* build_linezImageParagraph.build_line's5*7 KO '* * & 48TY r)col_left col_width max_heightcf|jtdt|jt}t dx}}|jr|j}n2t t|jd|jjj z }|j r|j }nDt t|jd|jjj z }||ks|j r|}n|}|js||z|z }||krdS|} |j r>|j tjkr | ||z z } n |j tjkr | ||z dz z } |rp|jj|jt d|jt t|j| d|||j|j|j|j } | St.r#t|jt0s|jJ|jj|j|jt t4|j| d|||j|j|jd|j } | S) Nz;ImageParagraph.build_line() must be called before render().rrwrmr) rsvgrxyrrrrrr) rrrrrrrrrrdimsr)r RuntimeErrorr{rr&rr r8rpryrrrrrtrs _vector_imagerrrrrrrr _raster_imager) r6rrris_svgnative_hrrnative_wr return_infos r*renderzImageParagraph.render/sP 9 M DI77Qxx1 ; G AAE49S>22T[_5FFH :  AA"5$)C.99DKO>4  : )zUW$$Y]"uw&&i!mq((   --[$(33oty99*!]&*&<.      P!$(I66 O48;O;OO KO ) )YH/4955Yj"&"8 *    r) NNNFFrrNNN)r/r)r#r$r%r rr rr&rFrr5rrrrr(r)r*rrsR (,!%"& "' $(#"&$)$)=>$)$)e $ $)  $)  $)$) $)$)$)sSy!$)}$)3-$) $)$)$)$)LGG*/G=BG /O3 4GGGGGGr)rceZdZdddddddddddded eed eezd ed ed edee deedededdffdZ d3dZ dee e dee deeddfdZd4dZ d5d edeeezddfdZd5deeddfdZ d6d eed eed ed eed!eed"eed#eed$eedee d%eedefd&Zd4d'Z d7d(ed)eeezd*eed+eed,ed-ed ed!edeeezd.eed/eeddfd0Zed4d1Zed+edefd2ZxZS)8r;NLEFTg?F)rrarbrrgrhrimg_fill_widthrprr-rrarbrrgrhrrr.r/c||_tj||_|jtjtjtjtjfvrtd|jj d||_ ||_ |tj|n tj |_||_g|_d|_t%j|g| Ri| |r|||r||| dSdS)Nrkrl)r)rprrqrarrrsrtrurvrwrbrrCHARrhrg _paragraphs_active_paragraphr4r5rimage) r6rprrarbrrgrhrrr-r.r7s r*r5z ParagraphCollectorMixin.__init__zs,z22 ?57EGUWeg"F F FmTXTcTimmm '  )1)=HOH % % %8= $7 =?04.t...v...   JJt     7 JJs~J 6 6 6 6 6 7 7r)c|j|rtd|jjd|jj|_|jd|j_|j||S)NzUnable to enter the same z context recursively.r) rprArr7r#page_page_push_local_stackr>rCs r*rz!ParagraphCollectorMixin.__enter__s 8 * *4 0 0 ZDN,CZZZ X]  ""$$$  %%d+++ r)rrrc|j|j|j_|j|dSr1)rpr3rr_pop_local_stackrrs r*rz ParagraphCollectorMixin.__exit__sH ""$$$   !!### r)c|jdkrtd|j?t||j|j}|j|d|_dSdS)NEXPLICITzaConflicts with active paragraph. Either close the current paragraph or write your text inside it.)r8rargAUTOrrrLrargrr)r6ps r*_check_paragraphz(ParagraphCollectorMixin._check_paragraphs  !Z / /s   ! )?$($<A   # #A & & &%+D " " " * )r)rc|t|jdtr"|jd|dSdSNr)rr{rrLr)r6rrs r*rzParagraphCollectorMixin.writes\  d&r*I 6 6 -  R & &t , , , , , - -r)rc|t|jdtr"|jd|dSdSr)rr{rrLr)r6rs r*rzParagraphCollectorMixin.lnsZ  d&r*I 6 6 '  R # #A & & & & & ' 'r)rr`rcrdrerfrTric |jdkrtdt||p|j||p|j| |pd|pd|pd| pd|pd| } |j| d|_| S)a~ Args: text_align (Align, optional): the horizontal alignment of the paragraph. line_height (float, optional): factor by which the line spacing will be different from the font height. (Default: by region) top_margin (float, optional): how much spacing is added above the paragraph. No spacing will be added at the top of the paragraph if the current y position is at (or above) the top margin of the page. (Default: 0.0) bottom_margin (float, optional): those two values determine how much spacing is added below the paragraph. No spacing will be added at the bottom if it would result in overstepping the bottom margin of the page. (Default: 0.0) indent (float, optional): determines the indentation of the paragraph. (Default: 0.0) bullet_string (str, optional): determines the fragments and text lines of the bullet. (Default: "") bullet_r_margin (float, optional): determines the spacing between the bullet and the bulleted line skip_leading_spaces (float, optional): removes all space characters at the beginning of each line. (Default: False) wrapmode (WrapMode): determines the way text wrapping is handled. (Default: None) first_line_indent (float, optional): left spacing before first line of text in paragraph. rUnable to nest paragraphs.rr`) r8rarbrgrhrcrdrerirfrTr) r6rarbrgrcrdrerfrTrhrirs r*rMz!ParagraphCollectorMixin.paragraphs:  !Z / / <== = !4T_# 3 Ot7O!Q',1;Q/41'-2+  """!+r)c@|jstdd|_dS)NzNo active paragraph to end.)rrrCs r*rz%ParagraphCollectorMixin.end_paragraphs*% ? =>> >!%r)rrrrrrrrc |jdkrtd|jr|t|||||||||| | |  } |j| dS)Nrr) rrrrrrcrdrrr)rrrrrr) r6rrrrrrrcrdrrrrs r*rzParagraphCollectorMixin.images  !Z / / <== =  ! !      !/!'  """""r)cdSr1r(rCs r*rzParagraphCollectorMixin.render&s!cr)cdSr1r()r6rs r*r[z!ParagraphCollectorMixin.get_width)s14r))r/r;rDr1) NNFrrrr`NNrr)r#r$r%rr rrr&rFrr5rr rrrrrrrrLrMrrrrr[rGrHs@r*r;r;ys #"( $)'+!$ 7 7 7  7 7sm 7 %K 7  7 7" 78$ 7c] 7 7 7  7 7 7 7 7 7D     4 ./ M* M*       , , , ,"%)---sSy!-  ----''HUO't'''''+'+$)&')*"#')+/'+-...UO.e_." . UO .   .. }."%.8$.$E?. ....`&&&&(,!%"& "' $(#"& # # #e $ # #  #  #  # # #sSy! #} #3- #  # # # #D!!!^!44%444^44444r)r;ceZdZdZdededeeeffdZdedee e zfdZ de ee zd ed edefd Zde ee zfd ZddZdedefdZd S)r:z3Abstract base class for all text region subclasses.rrr/ct)aZ Return the horizontal extents of the current line. Columnar regions simply return the boundaries of the column. Regions with non-vertical boundaries need to check how the largest font-height in the current line actually fits in there. For that reason we include the current y and the line height. NotImplementedError)r6rrs r*current_x_extentszTextRegion.current_x_extents0s"###r)rMc|jr4|jj|jjkr|jxj|jz c_||jjd\}}|jj|jjz }||jjz }||||z |}|r1|j}|r(|jj|z|kr|jxj|z c_|SrZ) rcrprt_marginrrb_marginrrd)r6rMr col_rightbottomrrenderedmargins r*_render_image_paragraphz"TextRegion._render_image_paragraph:s   /DHJ1B$B$B HJJ). .JJ"44TXZCC)dh//dhj( ##Hi(.BJOO  %,F %48:.&88 f$ r)rtoprc |sdS||j_d}d}d}|D]}t|tr||r|dz }3n{|j}d} |j} | j} |jD] } | j rd} n| rD|j r=| s;| j r4|jj|jj kr|jxj| j z c_|jj|j z|kr|}n|pd}|j }||jjd\} }|jj| ks|jj|kr | |j_|jxj| jz c_| r| js| | jz}|jxj|zc_| jJ|j| j| jj dt,jt0jdd| _|jxj|z c_|jxj|jz c_|j||j dt,jt0jd|jxj|jzc_|jxj| jzc_|jr8| j}|r/| r-|jj|z|kr|jxj| jz c_|dz }|jrn|r|d|=|pdS)NrrFT)rbordernew_xnew_yfill)rprr{rrrKrMr}rV charactersrNrcrrrrrerXr^rWrS_render_styled_text_linerrrTOPNEXTrOrdtrailing_form_feed)r6rrrprev_line_heightlast_line_heightrendered_lines tl_wrapperrS text_rendered cur_paragraph cur_bulletr]rrbullet_indent_shiftrs r*_render_column_lineszTextRegion._render_column_linesIsT  1 "#,0$D D J*n55C // ;;"a'NNE&O % * 4 *1 %/D(, ";"-;';&0 ;  TX%666HJJ-"::JJ8: 00699'7$E#3#8q #,#3 &*&<&6"6688:;NN(HJJ"55JJ%/;;;H55",$.5 "i"h" 604J,HJJ"55JJ i.. 11&)) 2 i..  m22 'B*8FB-BTXZ&5HF4R4R m&AA !#/E  ,?N?+$1$r)cg}|jD]s}t|tr*|}||A||j}|s^||t|Sr1)rr{rrrrrr)r6rrMrK cur_liness r* collect_lineszTextRegion.collect_liness9; ) - -I)^44 - ++--!!$''''%11$-@@  !!),,,,r)Nctr1rrCs r*rzTextRegion.renders!###r)c||jj|\}}|jj|kr|jj|kr |jj}||z }|Sr1)rrprr)r6rstartendress r*r[zTextRegion.get_widthsS++DHJ?? s 8:  $(*s"2"2HJEEk r)rD)r#r$r%rEr&r|rrr rrrrrJrrrr[r(r)r*r:r:-s"==$5$%$E%,*II %II@DIII tU++ r)) r#r$r%rEr'rr r&r5r#rGrHs@r*r r s44 KKK %)$( * * *  * *5/ * 5/ *  *  * * * * * *,HUO,HUO,PT,,,,,,,,r)r ceZdZdddddddeded ed ed ed d ffdZdfd ZddZ de e e zdeded d fdZ ddZdeded eeeffdZxZS) TextColumnsr F)ncolsgutterbalancerprr-r)r*r+r.r/Nctj|g|Ri|d|_||_||_|jj|jjz }||dz |zz |z }|jj} t| | |zg|_ td|D]5} | ||zz } |j t| | |z6t|j j|j j|_dS)Nrr)r4r5 _cur_column_ncolsr+r%r"r!r _colsrangermaxrprr_first_page_top) r6rpr)r*r+r-r.total_wrc_left_r7s r*r5zTextColumns.__init__s .t...v...  ,$t|'88 V33u< "ffy&899: q% C CA i&( (F J  gffy.@AA B B B B"48#4dhjAAr)ctt|jj|jj|_|jr(d|_|j |jj |j_ |SrZ) r4rr1rprrr2r+r-r/r!r)r6r7s r*rzTextColumns.__enter__sa "48#4dhjAA < ; D D$45:DHJ r)c|jrGt|jdtr'|jdtdS|tdS)z?End the current column and continue at the top of the next one.rN)rr{rLrrrCs r* new_columnzTextColumns.new_columns`   " 4+;B+? K K "  R & &y 1 1 1 1 1 JJy ! ! ! ! !r)rrrcd}|jj}|jr|}|sdStd|D}||jz }||z } || krad}||z}t jt||jz dz} |djj pd} | | z} | |kr|| z}||kr|}d}t|j |jD]} |sdS| |j kr| |_ | dd\}}|jj |ks|jj |kr ||j_ |r'| |jdz kr|jj|jjz }|||||jj|kr |jj}||j_dS)z?Rendering a set of lines in one or several columns on one page.FNc32K|]}|jjpdVdS)rN)rKr).0ls r* z1TextColumns._render_page_lines..s+DDAQV]/aDDDDDDr)Tg?rr)rprr+sumr.mathceilrrKrr0r-rrrrr)r6rrr balancingnext_y page_bottom tot_height col_height avail_heightlines_per_columnfirst_line_height mult_heightcrrs r*_render_page_lineszTextColumns._render_page_liness  < &!K DDDDDDDJ#dk1J!C"> HixzH$$ i(?(?%  8Q4;?33dh&77  % %j#v > > >xzF"" r)c|jsdS|}|sdS|jj|jjz }t |jj|jj}|||||rT|j |jj}|sdSd|_ |||jj||RdSdSrZ) rrrprrr1rrrK_perform_page_break_if_need_ber-)r6rrCfirst_page_top page_breaks r*rzTextColumns.render1s  F''))   Fhj48#44 TX. ;;  NKHHH I@@ J  D   # #J K H H H I I I I Ir)rrc4|j|j\}}||fSr1)r/r-)r6rrr!r"s r*rzTextColumns.current_x_extentsEsj!12 eU{r))r/r'rD)r#r$r%rrr&rFr5rr8rrrJrKrr|rrGrHs@r*r'r'sf  BBB BB B  B  BB BBBBBB.""""2+5622 2  2222hIIII(5%E%,r[sd ########                    /...........!!!!!!BBBBBBBB((((((11111111"""""" ........ j *****c***,     *   &________Dvvvvvvvvrq5q5q5q5q5cq5q5q5hFFFFF(FFFR,,,,,,,,>rrrrr*/rrrrrr)