
    '	4j~                        d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlm Z  erddl!m"Z" ddlm#Z#m$Z$ ddl%m&Z& ddlm'Z'  G d de
      Z( G d de      Z) G d de
      Z* G d d      Z+ G d d      Z, G d d      Z- G d de      Z. G d d e.      Z/ G d! d"e      Z0 G d# d$e/e0      Z1y)%zJ
Usage documentation at: <https://py-pdf.github.io/fpdf2/TextRegion.html>
    N)ABCabstractmethod)TracebackType)TYPE_CHECKINGAny
NamedTupleOptionalSequenceTypeUnioncast   )AlignWrapModeXPosYPos)FPDFException)RasterImageInfoVectorImageInfo)preload_image)	FORM_FEEDMultiLineBreak)get_scale_factor)FPDF)FragmentTextLine)	SVGObject)	ImageDatac                   "    e Zd ZU eed<   eed<   y)ExtentsleftrightN)__name__
__module____qualname__float__annotations__     =/DATA/.local/lib/python3.12/site-packages/fpdf/text_region.pyr    r    $   s    
KLr)   r    c                   d     e Zd ZdZdededdf fdZded   ddfd	Zded   defd
Z	ddZ
 xZS )TextRegionMixinz>Mix-in to be added to FPDF() in order to support text regions.argskwargsreturnNc                 R    d | _         | j                          t        |   |i | y N)%_TextRegionMixin__current_text_regionclear_text_regionsuper__init__)selfr-   r.   	__class__s      r*   r5   zTextRegionMixin.__init__,   s)    =A" $)&)r)   region
TextRegionParagraphCollectorMixinc                 &    t        d|      | _        y )Nr:   )r   r2   r6   r8   s     r*   register_text_regionz$TextRegionMixin.register_text_region1   s     &*,%?"r)   c                      | j                   |k(  S r1   r2   r=   s     r*   is_current_text_regionz&TextRegionMixin.is_current_text_region6   s     ))V33r)   c                     d | _         y r1   r@   r6   s    r*   r3   z!TextRegionMixin.clear_text_region;   s
    %)"r)   r/   N)r#   r$   r%   __doc__r   r5   r   r>   boolrA   r3   __classcell__r7   s   @r*   r,   r,   )   s^    H*c *S *T *
@CD@	@
4CD4	4
*r)   r,   c                   B    e Zd ZU dZded<   ded<   dZeed<   dZeed<   y	)
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.
    r   line	Paragraph	paragraphF
first_line	last_lineN)r#   r$   r%   rE   r'   rN   rF   rO   r(   r)   r*   rJ   rJ   ?   s)    
 JItr)   rJ   c                   <    e Zd Zded   ded   deddfdZdefd	Zy)
Bulletbullet_fragmentsr   	text_liner   bullet_r_marginr/   Nc                 <    || _         || _        || _        d| _        y )NF)	fragmentsrS   r_marginrendered_flag)r6   rR   rS   rT   s       r*   r5   zBullet.__init__L   s"     0@"'#(r)   c                 R    d}| j                   D ]  }||j                         z  } |S Nr   )rV   	get_width)r6   fragments_widthfrags      r*   get_fragments_widthzBullet.get_fragments_widthW   s,    !"NNDt~~//O #r)   )r#   r$   r%   r
   r	   r&   r5   r^   r(   r)   r*   rQ   rQ   K   sC    	)":.	) J'	) 		)
 
	)U r)   rQ   c                   >   e Zd Z	 	 	 	 	 	 	 	 	 	 d ded   deeez     dee   dededed	ee   d
ededee	   defdZ
defdZd!dZdeee      dee   dee   ddfdZd"dedeeez     ddfdZd
ed	edeeed   ed   f      fdZd"dee   ddfdZdedee   fdZy)#rL   Nr8   r9   
text_alignline_height
top_marginbottom_marginindentrT   bullet_stringskip_leading_spaceswrapmodefirst_line_indentc                    || _         |j                  | _        d | _        |rut        j                  |      }|t        j
                  t        j                  t        j                  t        j                  fvrt        d|j                   d      || _        ||j                  | _        n|| _        || _        || _        || _        |	| _        |
| j                   j                   | _        nt#        j                  |
      | _        g | _        |%dt'        d      z  | j                  j(                  z  }|rD| j+                  ||      }t-        |t.              sJ t1        |d   |d   |      | _        || _        y d | _        || _        y )NAText_align must be 'LEFT', 'CENTER', 'RIGHT', or 'JUSTIFY', not ''.   mmr   r   )_regionpdfr`   r   coerceLCRJ
ValueErrorvaluera   rb   rc   rd   rf   rg   r   _text_fragmentsr   kgenerate_bullet_frags_and_tl
isinstancetuplerQ   bulletrh   )r6   r8   r`   ra   rb   rc   rd   rT   re   rf   rg   rh   text_align_convbullet_frags_and_tls                 r*   r5   zParagraph.__init___   sm    !::+/%*\\*%=Ouww%''&JJ WXgXmXmWnnpq  .DO%11D*D$*#6  LL11DM$OOH5DM13"  "24"88488::EO"&"C"C# 15999,2#A&(;A(>-DK
 "3 DK!2r)   r/   c                     d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   dt        | j                         dS )	NzParagraph(text_align=z, line_height=z, top_margin=z, bottom_margin=z, skip_leading_spaces=z, wrapmode=z, #text_fragments=))r`   ra   rb   rc   rf   rg   lenrw   rC   s    r*   __str__zParagraph.__str__   s|    #DOO#4N4CSCSBTTabfbqbqar s"0011GH`H`Gaalmqmzmzl{ |  #D$8$8 9:!=	
r)   c                     | S r1   r(   rC   s    r*   	__enter__zParagraph.__enter__   s    r)   exc_type	exc_value	tracebackc                 8    | j                   j                          y r1   )rn   end_paragraphr6   r   r   r   s       r*   __exit__zParagraph.__exit__   s     	""$r)   textlinkc                 ,   | j                   j                  st        d      | j                   j                  |      j	                  dd      }| j                   j                  |d      }|r|D ]	  }||_         | j                  j                  |       y )N3No font set, you need to call set_font() beforehand Fmarkdown)	ro   font_familyr   normalize_textreplace_preload_font_stylesr   rw   extend)r6   r   r   normalized_stringrV   r]   s         r*   writezParagraph.write   s    xx## UVV HH33D9AA$K HH))!E *  	
 ! 	 "##I.r)   r   r   c           
         |sy | j                   j                  |      }| j                   j                  st        d      | j                   j	                  |d      }d}|D ]  }||j                         z  } t        || j                  j
                  | j                   j                  | j                  |z
  |z
  z   | j                   j                  f| j                  xs( | j                  j                  xs t        j                  | j                  | j                  | j                  xs | j                  j                        }|j!                         }||fS )Nr   Fr   r   )	max_widthmarginsalignrg   ra   rf   )ro   r   r   r   r   r[   r   rn   c_marginrd   r`   r   rq   rg   ra   rf   get_line)r6   re   rT   rR   r\   r]   bullet_line_breakbullet_text_lines           r*   ry   z&Paragraph.generate_bullet_frags_and_tl   s0    //>xx## UVVHH)) *  	
 "#$Dt~~//O %*ll,,!!T[[?%B_%TU!! //GT\\%<%<G]](( $ 8 8 !0||//
 -557!111r)   hc                 B   | j                   j                  st        d      |#| j                   j                  | j                  z  }| j                   j                  dd      d   }||j                  z  |j                  _        | j                  j                  |       y )Nr   
Fr   r   )ro   r   r   	font_sizera   r   rx   graphics_statefont_size_ptrw   append)r6   r   fragments      r*   lnzParagraph.ln   s    xx## UVV9""T%5%55A88005 1 
 

 018::~,##H-r)   print_shc                    g }t        | j                  | j                  j                  | j                  j
                  | j                  z   | j                  j
                  f| j                  | j                  xs( | j                  j                  xs t        j                  || j                  | j                  | j                  xs | j                  j                  	      }g | _        |j                         }d}|2|j                  t!        || |             d}|j                         }|2|r-|d   }t!        |j"                  | |j$                  d      }||d<   |S )N)r   r   rh   r   r   rg   ra   rf   T)rN   F)rN   rO   )r   rw   rn   r[   ro   r   rd   rh   r`   r   rq   rg   ra   rf   r   r   rJ   rK   rN   )r6   r   
text_linesmulti_line_breakrS   rN   lasts          r*   build_lineszParagraph.build_lines   s2   (*
)  ll,,XX&&4dhh6G6GH"44//GT\\%<%<G]](( $ 8 8 !0||//
  "$--/	
#k)TjQRJ(113I # b>D		4DOOtD "JrNr)   )
NNr   r   r   Nr   FNr   )r/   rL   r1   )r#   r$   r%   r   r	   strr   r&   rF   r   r5   r   r   r   BaseExceptionr   r   intr   r{   r
   ry   r   listrJ   r   r(   r)   r*   rL   rL   ^   s    -1'+ +/$)'+#$33=>33 S5[)33 e_	33
 33 33 33 "%33 33 "33 8$33 !33j
 
%4./% M*% M*	%
 
%/# /XcCi%8 /D /2 2382	%,hz.BBC	D2@.HUO .t .D T+-> r)   rL   c                       e Zd Z	 	 	 	 	 	 	 	 	 	 dded   dedeeez     dee   dee   ded	ed
ededeee	z     dee   dee   ddfdZ
ddZdedededeeez     fdZy)ImageParagraphNr8   r9   namer   widthheight
fill_widthkeep_aspect_ratiorb   rc   r   titlealt_textr/   c                    || _         || _        d | _        |rft        j                  |      }|t        j
                  t        j                  t        j                  fvrt        d|j                   d      || _        || _
        || _        || _        || _        || _        |	| _        |
| _        || _        || _        d | _        d | _        | | _        y )Nz1Align must be 'LEFT', 'CENTER', or 'RIGHT', not 'rk   )r8   r   r   r   rp   rq   rr   rs   ru   rv   r   r   r   r   rb   rc   r   r   r   imginforK   )r6   r8   r   r   r   r   r   r   rb   rc   r   r   r   
align_convs                 r*   r5   zImageParagraph.__init__  s     	&*
e,J%''577EGG!<< G
HXHXGYY[\  $DJ
$!2$*	
 (,AE	$(	r)   c                     t        | j                  j                  j                  | j                        \  | _        | _        | _        | S r1   )r   r8   ro   image_cacher   r   r   rC   s    r*   
build_linezImageParagraph.build_line'  s9     *7KKOO''*
&	48TY r)   col_left	col_width
max_heightc                    | j                   t        d      t        | j                   t              }t	        d      x}}| j
                  r| j
                  }n>t        t        | j                   d         | j                  j                  j                  z  }| j                  r| j                  }nTt        t        | j                   d         | j                  j                  j                  z  }||kD  s| j                  r|}n|}| j
                  s||z  z  }||kD  ry |}	| j                  rN| j                  t        j                  k(  r	|	||z
  z  }	n(| j                  t        j                  k(  r|	||z
  dz  z  }	|r| j                  j                  j!                  | j"                  t        d| j$                        t        t        | j                         |	d ||| j&                  | j(                  | j*                  | j,                        }
|
S t.        r(t        | j$                  t0              s| j$                  J | j                  j                  j3                  | j"                  | j$                  t        t4        | j                         |	d ||| j&                  | j(                  | j*                  d | j,                        }
|
S )	Nz;ImageParagraph.build_line() must be called before render().r   r   wrl   r   )r   svgr   xyr   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   dimsr   )r   RuntimeErrorrz   r   r&   r   r   r8   ro   rx   r   r   r   r   rs   rr   _vector_imager   r   r   r   r   r   r   r   _raster_imager   )r6   r   r   r   is_svgnative_hr   r   native_wr   return_infos              r*   renderzImageParagraph.render/  sE    99M  DII7Qx1;;AE499S>2T[[__5F5FFH::

A"5$))C.9DKKOO<M<MMH)#t{{ 
 z>::zzUWW$Y]"uww&i!mq((--[$((3otyy9**!]]&*&<&< .   !$((I6488;OOOKKOO))YYHH/4995YYjj"&"8"8 *  	  r)   
NNNFFr   r   NNN)r/   r   )r#   r$   r%   r   r   r	   r   r&   rF   r   r5   r   r   r   r   r(   r)   r*   r   r      s	   
 (,!%"& "' $(#"&$)=>$) $) e$	$)
 $) $) $)  $) $) $) sSy!$) }$) 3-$) 
$)LGG*/G=BG	/O3	4Gr)   r   c                   *    e Zd Zdddddddddddded	ee   d
eez  dedededee	   dee   dededdf fdZ
d1dZdeee      dee   dee   ddfdZd2dZ	 d3d	edeeez     ddfdZd3dee   ddfdZ	 	 	 	 	 	 	 	 	 	 d4d
ee   dee   dedee   dee   d ee   d!ee   d"ee   dee	   d#ee   defd$Zd2d%Z	 	 	 	 	 	 	 	 	 	 d5d&ed'eeez     d(ee   d)ee   d*ed+edededeeez     d,ee   d-ee   ddfd.Zed2d/       Zed)edefd0       Z xZS )6r;   NLEFTg      ?F)r   r`   ra   r   rf   rg   r   img_fill_widthro   r   r-   r   r`   ra   r   rf   rg   r   r   r.   r/   c                8   || _         t        j                  |      | _        | j                  t        j                  t        j
                  t        j                  t        j                  fvr#t        d| j                  j                   d      || _
        || _        |t        j                  |      nt        j                  | _        || _        g | _        d | _        t%        | L  |g|
i | |r| j)                  |       |r| j+                  ||	       y y )Nrj   rk   )r   )ro   r   rp   r`   rq   rr   rs   rt   ru   rv   ra   r   r   CHARrg   rf   _paragraphs_active_paragraphr4   r5   r   image)r6   ro   r   r`   ra   r   rf   rg   r   r   r-   r.   r7   s               r*   r5   z ParagraphCollectorMixin.__init__z  s     ,,z2??577EGGUWWegg"FFSTXTcTcTiTiSjjlm  ' )1)=HOOH%8== 	 $7 =?04.t.v.JJtJJs~J6 r)   c                 D   | j                   j                  |       r#t        d| j                  j                   d      | j                   j
                  | _        | j                   j                          d| j                   _        | j                   j                  |        | S )NzUnable to enter the same z context recursively.r   )	ro   rA   r   r7   r#   page_page_push_local_stackr>   rC   s    r*   r   z!ParagraphCollectorMixin.__enter__  s|    88**40+DNN,C,C+DDYZ  XX]]
""$%%d+r)   r   r   r   c                     | j                   j                          | j                  | j                   _        | j                   j	                          | j                          y r1   )ro   r3   r   r   _pop_local_stackr   r   s       r*   r   z ParagraphCollectorMixin.__exit__  s<     	""$

!!#r)   c                     | j                   dk(  rt        d      | j                   Et        | | j                  | j                        }| j
                  j                  |       d| _         y y )NEXPLICITzaConflicts with active paragraph. Either close the current paragraph or write your text inside it.)r8   r`   rf   AUTOr   r   rL   r`   rf   r   r   )r6   ps     r*   _check_paragraphz(ParagraphCollectorMixin._check_paragraph  sn    !!Z/s  !!)??$($<$<A
 ##A&%+D" *r)   r   c                     | j                          t        | j                  d   t              r| j                  d   j	                  |       y y Nr   )r   rz   r   rL   r   )r6   r   r   s      r*   r   zParagraphCollectorMixin.write  sC    
 	d&&r*I6R &&t, 7r)   r   c                     | j                          t        | j                  d   t              r| j                  d   j	                  |       y y r   )r   rz   r   rL   r   )r6   r   s     r*   r   zParagraphCollectorMixin.ln  sA    d&&r*I6R ##A& 7r)   rb   rc   rd   re   rT   rh   c                 
   | j                   dk(  rt        d      t        | |xs | j                  ||xs | j                  |	|xs d|xs d|xs d|
xs d|xs d|      }| j
                  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.
        r   Unable to nest paragraphs.r   r   )r8   r`   ra   rf   rg   rb   rc   rd   rh   re   rT   r   )r6   r`   ra   rf   rb   rc   rd   re   rT   rg   rh   r   s               r*   rM   z!ParagraphCollectorMixin.paragraph  s    : !!Z/ <==!4T__# 3 Ot7O7O!Q',1;Q/41'-2+
 	"!+r)   c                 @    | j                   st        d      d | _         y )NzNo active paragraph to end.)r   r   rC   s    r*   r   z%ParagraphCollectorMixin.end_paragraph  s    %% =>>!%r)   r   r   r   r   r   r   r   r   c                     | j                   dk(  rt        d      | j                   r| j                          t        | |||||||||	|
|      }| j                  j                  |       y )Nr   r   )
r   r   r   r   r   rb   rc   r   r   r   )r   r   r   r   r   r   )r6   r   r   r   r   r   r   rb   rc   r   r   r   r   s                r*   r   zParagraphCollectorMixin.image  sw     !!Z/ <==!! !/!'
 	"r)   c                      y r1   r(   rC   s    r*   r   zParagraphCollectorMixin.render&  s    !r)   c                      y r1   r(   )r6   r   s     r*   r[   z!ParagraphCollectorMixin.get_width)  s    14r)   )r/   r;   rD   r1   )
NNFr   r   r   r   NNr   r   )r#   r$   r%   r   r	   r   r   r&   rF   r   r5   r   r   r   r   r   r   r   r   r   rL   rM   r   r   r   r   r[   rG   rH   s   @r*   r;   r;   y  s   
 #"( $)'+!$ 7 7  7 sm	 7
 %K 7  7  7 " 7 8$ 7 c] 7  7  7 
 7D		4./	 M*	 M*		
 
	," %)-- sSy!- 
	-'HUO 't ' '+'+$)&')*"#')+/'+-..UO. e_. "	.
 UO.  . .  }. "%. 8$. $E?. 
.`& (,!%"& "' $(#"& # # e$ # 	 #
  #  #   #  #  # sSy! # } # 3- # 
 #D ! !44%4 4r)   r;   c                       e Zd ZdZdededeeef   fdZdedee	e
z     fdZdeeez     d	ed
edefdZdeeez     fdZddZdedefdZy)r:   z3Abstract base class for all text region subclasses.r   r   r/   c                     t               )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)r6   r   r   s      r*   current_x_extentszTextRegion.current_x_extents0  s     "##r)   rM   c                 j   |j                   rV| j                  j                  | j                  j                  kD  r)| j                  xj                  |j                   z  c_        | j	                  | j                  j                  d      \  }}| j                  j
                  | j                  j                  z
  }|| j                  j                  z
  }|j                  |||z
  |      }|rI|j                  }|r;| j                  j                  |z   |k  r| j                  xj                  |z  c_        |S rZ   )	rb   ro   r   t_marginr   r   b_marginr   rc   )r6   rM   r   	col_rightbottomr   renderedmargins           r*   _render_image_paragraphz"TextRegion._render_image_paragraph:  s     DHHJJ1B1B$BHHJJ)...J"44TXXZZC)dhh///dhhjj(
##Hi(.BJO,,F488::.&8

f$
r)   r   topr   c           	         |sy|| j                   _        d}d }d}|D ]  }t        |t              r| j	                  |      r|dz  }+ n|j
                  }d}	|j                  }
|
j                  }|j                  D ]  }|j                  sd}	 n |	rp|j                  rd|sb|
j                  rV| j                   j                  | j                   j                  kD  r)| j                   xj                  |
j                  z  c_        | j                   j                  |j                  z   |kD  r|} n|xs d}|j                  }| j                  | j                   j                  d      \  }}| j                   j                  |k  s| j                   j                  |k\  r|| j                   _        | j                   xj                  |
j                   z  c_        |r|j"                  s|j%                         |j&                  z   }| j                   xj                  |z  c_        |j(                  J | j                   j+                  |j(                  |j(                  j                  dt,        j.                  t0        j2                  d       d|_        | j                   xj                  |z  c_        | j                   xj                  |j                   z  c_        | j                   j+                  ||j                  dt,        j.                  t0        j4                  d       | j                   xj                  |j                   z  c_        | j                   xj                  |
j                   z  c_        |j6                  rU|
j8                  }|rG|	rE| j                   j                  |z   |k  r)| j                   xj                  |
j8                  z  c_        |dz  }|j:                  s n |r|d |= |xs dS )Nr   r   FT)r   bordernew_xnew_yfill)ro   r   rz   r   r  rK   rM   r|   rV   
charactersrN   rb   r   r   r   r   rd   rX   r^   rW   rS   _render_styled_text_liner   r   r   TOPNEXTrO   rc   trailing_form_feed)r6   r   r  r   prev_line_heightlast_line_heightrendered_lines
tl_wrapperrS   text_renderedcur_paragraph
cur_bulletr]   r   r   bullet_indent_shiftr  s                    r*   _render_column_lineszTextRegion._render_column_linesI  s(    
"#,0$J*n5//
;"a'N&OO	 % * 4 4*11
%//D(, 0
 ""--&%00

TXX%6%66HHJJ-":"::J88::	 0 0069'7$#3#8q #,#3#3 &*&<&<TXXZZ&K#)88::(DHHJJ),C!)DHHJ

m222
j&>&>"668:;N;NN ( HHJJ"55J%//;;;HH55",,$..55 "ii"hh" 6  04J,HHJJ"55J

i...
11&&)))) 2  

i...


m222
''*88F-TXXZZ&5HF4R

m&A&AA
!#//I %J ?N?+$1$r)   c                     g }| j                   D ]c  }t        |t              r"|j                         }|j	                  |       5|j                  | j                        }|sS|j                  |       e |S r1   )r   rz   r   r   r   r   r   r   )r6   r   rM   rK   	cur_liness        r*   collect_lineszTextRegion.collect_lines  sm    9;
))I)^4 ++-!!$'%11$--@	 !!), * r)   Nc                     t               r1   r   rC   s    r*   r   zTextRegion.render  s    !##r)   c                     | j                  | j                  j                  |      \  }}| j                  j                  |kD  r/| j                  j                  |k  r| j                  j                  }||z
  }|S r1   )r   ro   r   r   )r6   r   startendress        r*   r[   zTextRegion.get_width  sZ    ++DHHJJ?
s88::$((**s"2HHJJEEk
r)   rD   )r#   r$   r%   rE   r&   r{   r   r   r	   r   r   r  r   rJ   r  r  r   r[   r(   r)   r*   r:   r:   -  s    =$5 $% $E%,<O $'	/O3	4S%+56S% S% 	S%
 
S%jtN[$@A $ % r)   r:   c                   |     e Zd ZU dZded<   ddddddedee   dee   d	ed
df fdZdee   dee   d
dfdZ	 xZ
S )TextColumnarMixinz*Enable a TextRegion to perform page breaksr   ro   N)l_marginrW   r-   r!  rW   r.   r/   c                    t        |   |i | ||j                  n|| _        | j                  }||j                  n|| _        |j                  | j                  z
  }| j                  ||       y r1   )r4   r5   r!  rW   r   _set_left_right)	r6   ro   r!  rW   r-   r.   r!   r"   r7   s	           r*   r5   zTextColumnarMixin.__init__  sf     	$)&)(0(8h}}(0(8h%T5)r)   r!   r"   c                    || j                   j                  n|}|-| j                   j                  | j                   j                  z
  n|}||k  r(t	        | j
                  j                   d| d| d      t        ||      | _        y )Nz(): Right limit (z) lower than left limit (z).)	ro   r!  r   rW   r   r7   r#   r    extents)r6   r!   r"   s      r*   r#  z!TextColumnarMixin._set_left_right  s    $(Ltxx  d49Mdhh///uD=>>**+ ,  %w&?vRI  tU+r)   )r#   r$   r%   rE   r'   r   r	   r&   r5   r#  rG   rH   s   @r*   r   r     s}    4	K %)$(** * 5/	*
 5/* * 
*,HUO ,HUO ,PT ,r)   r   c                        e Zd Zdddddddeded	ed
ededdf fdZd fdZddZ	de
eez     dededdfdZddZdededeeef   fdZ xZS )TextColumnsr   
   F)ncolsgutterbalancero   r   r-   r)  r*  r+  r.   r/   Nc                   t        |   |g|i | d| _        || _        || _        | j
                  j                  | j
                  j                  z
  }||dz
  |z  z
  |z  }| j
                  j                  }	t        |	|	|z         g| _	        t        d|      D ]2  }
|	||z   z  }	| j                  j                  t        |	|	|z                4 t        | j                  j                  | j                  j                        | _        y )Nr   r   )r4   r5   _cur_column_ncolsr+  r%  r"   r!   r    _colsranger   maxro   r   r   _first_page_top)r6   ro   r)  r*  r+  r-   r.   total_wr   c_left_r7   s              r*   r5   zTextColumns.__init__  s     	.t.v.,,$$t||'8'88	V33u<	""ffy&89:
q%Ai&((FJJgffy.@AB !  #488#4#4dhhjjAr)   c                     t         |           t        | j                  j                  | j                  j
                        | _        | j                  r9d| _        | j                  | j                     j                  | j                  _        | S rZ   )r4   r   r1  ro   r   r   r2  r+  r-  r/  r!   r   )r6   r7   s    r*   r   zTextColumns.__enter__  sc    "488#4#4dhhjjA<< DD$4$45::DHHJr)   c                     | j                   r@t        | j                   d   t              r#| j                   d   j                  t               y| j                  t               y)z?End the current column and continue at the top of the next one.r   N)r   rz   rL   r   r   rC   s    r*   
new_columnzTextColumns.new_column  sD    
4+;+;B+? KR &&y1JJy!r)   r   r  r   c                    d}| j                   j                  }| j                  r|}|syt        d |D              }|| j                  z  }||z
  }	||	k  rjd}||z   }t        j                  t        |      | j                  z        dz   }
|d   j                  j                  xs d}||
z  }||kD  r||z   }||kD  r|}d}t        | j                  | j                        D ]  }|s y|| j                  k7  r|| _        | j                  dd      \  }}| j                   j                  |k  s| j                   j                  |k\  r|| j                   _        |r?|| j                  dz
  k(  r-| j                   j                  | j                   j                  z
  }| j!                  |||       | j                   j                  |kD  s| j                   j                  } || j                   _        y)z?Rendering a set of lines in one or several columns on one page.FNc              3   P   K   | ]  }|j                   j                  xs d    yw)r   N)rK   r   ).0ls     r*   	<genexpr>z1TextColumns._render_page_lines.<locals>.<genexpr>  s!     DAQVV]]/a/s   $&Tg      ?r   r   )ro   r   r+  sumr.  mathceilr   rK   r   r0  r-  r   r   r   r   r  )r6   r   r  r   	balancingnext_ypage_bottom
tot_height
col_heightavail_heightlines_per_columnfirst_line_heightmult_heightcr   r   s                   r*   _render_page_lineszTextColumns._render_page_lines  s    	<< !KDDDJ#dkk1J!C<LL( 	z)#'99S_t{{-J#Kc#Q $.qM$6$6$=$=$B!/2BB+ ;.FK'(F %It''5AD$$$#$ "&"8"8A">HixxzzH$

i(?%
Q4;;?3dhh&7&77%%j#v>xxzzF" 6 
r)   c                    | j                   sy | j                         }|sy | j                  j                  | j                  j                  z
  }t        | j                  j                  | j                  j                        }| j                  |||       |rd| j                  j                  | j                  j                        }|sy d| _
        | j                  || j                  j                  |       |rcy y rZ   )r   r  ro   r   r   r1  r   r   rK  _perform_page_break_if_need_ber-  )r6   r   rC  first_page_top
page_breaks        r*   r   zTextColumns.render1  s    '')
hhjj488#4#44TXX..

;
NKH@@

J  D##J

KH r)   r   r   c                 B    | j                   | j                     \  }}||fS r1   )r/  r-  )r6   r   r   r!   r"   s        r*   r   zTextColumns.current_x_extentsE  s$    jj!1!12eU{r)   )r/   r'  rD   )r#   r$   r%   r   r   r&   rF   r5   r   r8  r   r   rJ   rK  r   r{   r   rG   rH   s   @r*   r'  r'    s     BB B 	B
 B B B 
B."2+562 2 	2
 
2hI(5 % E%,<O r)   r'  )2rE   r?  abcr   r   typesr   typingr   r   r   r	   r
   r   r   r   enumsr   r   r   r   errorsr   image_datastructuresr   r   image_parsingr   
line_breakr   r   utilr   fpdfr   r   r   r   r   r   r    r,   rJ   rQ   rL   r   r;   r:   r   r'  r(   r)   r*   <module>r[     s     # 	 	 	 / . ! B ( 1 ".j 
*c *,	* 	 &_ _Dv vrq5c q5hF( FR, ,>r*/ rr)   