)Ej UdZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z mZddlmZddlmZmZmZmZ dd lmZn!#e$rejd dd lmZYnwxYwdd lmZdd lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1m2Z2ddl3m4Z4ddl5m6Z6m7Z7e rddlm8Z8ddlm9Z9ddl:m;Z;ddl3mZ?dddZ@ejAdZBejAdZCejAdejDZEejAdZFdeeGdeeGfdZHe/Gdd eIZJejAd!ZKhd"ZLd#d$d%dd&d'd(d)ZMejNd*z ejNd+z dejNd,ZOe/d|d.eGd/eGdeIfd0ZPe/d}d2eGd/eGdeIfd3ZQe/d4eGd5eGdeGfd6ZRe/d4eGd7eGdeSeGeGffd8ZTe/d9eGdeGfd:ZUeTd;dd?d@dAZVe/dBeGde*e)zfdCZWe/dDeGdeeIfdEZXe/dDeGdeIfdFZYe/dGeIdHeIde eGgeIffdIZZe/dJfdeGdKe eGge fde fdLZ[e/dMfdeeGdKe eGge fde fdNZ\dOdPdQdRdSdTdUdVdWdXdYdZ Z]eSeGe fe^d[<e/ d~d\e$e"zd]d^d_eeSeGe fddfd`Z_daeSeGe fdbd^de`fdcZaddeeeGdfe`deGfdgZbdheeGdieGdeGfdjZc d~dbd^d5eGdaeeSeGe fdeeGfdkZd d~dbd^daeeSeGe fdeeeeGeGeeIeGffdlZf ddbd^daeeSeGe fdmeeIdeeeIeIeIeIffdnZgdoeGdeheeeGeSeGe fffdpZie/GdqdrZje/dseGde,fdtZke/due$dveGddfdwZlGdxdyZmGdzd{e ZndS)aA Utilities to parse SVG graphics into fpdf.drawing objects. The contents of this module are internal to fpdf2, and not part of the public API. They may change at any time without prior warning or any deprecation period, in non-backward-compatible ways. Usage documentation at: N)deepcopy)PathLike) TYPE_CHECKINGAnyCallable NamedTupleOptional) parse_path)GradientSpreadMethod GradientUnits PathPaintRuleStrokeCapStyle) fromstringzYdefusedxml could not be imported - fpdf2 will not be able to sanitize SVG images provided)html) BoundingBox ClippingPath GradientPaintGraphicsContext GraphicsStyle PaintedPathPathPenTextTextRun) DeviceGray DeviceRGBPoint Transformcolor_from_hex_stringcolor_from_rgb_stringforce_nodocument) ImageCacheVectorImageInfo)stream_content_for_raster_image)shape_linear_gradientshape_radial_gradient)Element) Renderable)FPDF)ResourceCatalogzhttp://www.w3.org/2000/svgzhttp://www.w3.org/1999/xlink)svgxlinkz(?:\s+,\s+|\s+,|,\s+|\s+|,)zf(matrix|rotate|scale|scaleX|scaleY|skew|skewX|skewY|translate|translateX|translateY)\(([\d\.,\s+-]+)\)z /\*.*?\*/z(?s)([^{}]+)\{([^{}]*)\}valuereturncl|dSt|tr|}|sdS|S|SN) isinstancestrstrip)r-strippeds :C:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/svg.py_normalize_css_valuer6XsB }t%;;== 4 LceZdZdZdS)Percentz$class to represent percentage valuesN)__name__ __module__ __qualname____doc__r7r5r9r9cs....r7r9z2\s*(?P[-+]?[\d\.]+)\s*(?P%|[a-zA-Z]*)>chemexiclhvbvhvivwcapremrlhvmaxvmin%HgbX<@gjZ@ g?gjZ?)incmmmptpcpxQihi)deggradradturnrS length_str default_unitcVt|}|td|dd|\}}|s|} t |t |zS#t $r4|tvrt|d|dt|d|dwxYw)z7Convert a length unit to our canonical length unit, pt.NzUnable to parse 'z ' as a lengthz" uses unsupported relative length z contains unrecognized unit ) unit_splittermatch ValueErrorgroupsfloatabsolute_length_unitsKeyErrorrelative_length_units)r[r\r_r-units r5resolve_lengthrgs    + +E }FZFFFGGTQ,,..KE4 VU||3D999 VVV ( ( (GGGG JJJDJJKKQUU Vs A**>B(rW angle_strct|}||\}}n|}|s|} t|t|zS#t $rt d|d|dwxYw)z;Convert an angle value to our canonical angle unit, radiansNzangle z has unknown unit )r^r_rarb angle_unitsrdr`)rhr\mr-rfs r5 resolve_anglerls I&&A}hhjj tt QU||k$/// QQQE)EEtEEFFDPQs A!A:spacenamecX dt|d}n#t$rd}YnwxYw||S)zECreate an XML namespace string representation for the given tag name.{})_HANDY_NAMESPACESrd)rmrns r5xmlnsrtsV1&u-111  T  s  ##namescDi}|D]}||t||<|||<|S)z>Create a lookup for the given name in the given XML namespace.)rt)rmruresultrns r5 xmlns_lookuprxs<F%)uUD!!"t Mr7 qualified_tagcV|d}|dkr ||dzdS|S)z8Remove the xmlns namespace from a qualified XML tag namerqrr N)index)ryis r5 without_nsr}s9 C  AAvvQUWW%% r7r+rectcircleellipselinepolylinepolygoncolorstrc tj|}n#t$rYnwxYw|drt |S|drt |St d|)N#rgbz unsupported color specification )r COLOR_DICTrd startswithrr r`rs r5svgcolorrs ?8,      3/$X...5!!/$X... BBB C CCs  ""incomingcft|}|dkrtd|d|dkrdS|S)Nrz stroke width z cannot be negative)rgr`rvals r5convert_stroke_widthrsE  " "C QwwFFFFGGG axxt Jr7cVt|}|dkrtd|d|S)N?z miter limit z cannot be less than 1)rbr`rs r5convert_miterlimitrs5 //C SyyHHHHIII Jr7min_valmax_valc4dtdtffd }|S)Nr-r.cFt|}|krS|krS|Sr0rb)r-rrrs r5 converterzclamp_float..converters/Ell ==N ==N r7)r2rb)rrrs`` r5 clamp_floatrs= r7c|Sr0r>)r-s r5rsr7rc8|dvr tjS||S)N)inherit currentColor)rINHERITr-rs r5 inheritablers) +++$$ 9U  r7c|Sr0r>)noops r5rrsr7c|dSt|tr|sdS|dkrdSt||S)Nnone)r1r2r3rrs r5optionalrsR  }t%ekkmmt t ui ( ((r7cbd|r|dst|tndfS)N fill_colorurl(rrrrs r5rr.s> !)!4!4V!s> !)!4!4V!r).0items r5 z.....Ps#OOO$Od OOOr7) NUMBER_SPLITsplit)das r5rz..Ps#OO 0B0B20F0FOOOr7)r) dasharrays r5rrLs"  O O  +r7c0dt|tfS)Nstroke_dash_phase)rrb)dashoffs r5rrUsGU##*r7c$dt|fS)Nstroke_cap_styler)capstrs r5rrZs&8+f:M:M%Nr7c$dt|fS)Nstroke_join_styler)joinstrs r5rr\s(;[=Q=Q'Rr7c0dt|tfS)Nstroke_miter_limit)rr)limstrs r5rr^sF.//)r7cBdt|tddfS)Nstroke_opacityrrr)stropstrs r5rrcs#Hk#s3344(r7) fillz fill-rulez fill-opacitystrokez stroke-widthzstroke-dasharrayzstroke-dashoffsetzstroke-linecapzstroke-linejoinzstroke-miterlimitzstroke-opacity svg_attr_mapstylable svg_elementr'computed_stylec<||}n]i}tj|jddD]\}}t |}||||<d|j_tD]m\}}t ||} | 't |j|} | t|jg|| Rnt |d} | 't |jd} | 't| } | |j_ | |j_ |jd} | rt| |_dSdS)zKApply the known styles from `svg_element` to the pdf path/group `stylable`.NstylerrFopacity transform)rparse_css_styleattribgetitemsr6r auto_closersetattrrbrrconvert_transformsr) rrrrkeyr- norm_value attr_namer attr_value opacity_strrtfstrs r5 apply_stylesrjs!.   " "7B / /  %'' ( (JC.e44J%'c %HN , 2 2 4 4<< 9)%))I*>*>??  -k.@.D.DY.O.OPPJ  ! HN ;YYz%:%: ; ; ; ;'uyy';';<|dS|r|Stjdd|S)z Collapse sequences of whitespace characters (spaces, tabs, etc.) to a single space In some cases, like with `pre` tags, whitespace should be preserved. Nrrz\s+ )resub)rrs r5 _collapse_wsrs/  yr 6&#q ! !!r7 font_style font_weightc(d}d}|rQ|}|dvp&|ot|dk}|r*|}|dv}|r|rdS|rdS|rdSdS) NF)boldbolderiX)italicobliqueBIBIrr)r3lowerisdigitint)rrbr|fwfss r5_svg_font_style_to_emphasisr s A AJ    & & ( ( $ $ I)H#b''S.(      % % ' ' ' 'Qtss 2r7cJ|&t||}||S|Stj|jdd}t||}||St|j|S)zJReturn the value for a given attribute, honoring computed style overrides.Nrrr)r6rrrr)rrnrr-inlines r5_get_attr_or_stylers$Y]]4%8%899  L%cjnnWb&A&ABB$VZZ%5%566  L  t 4 4 5 55r7ct|d|}|rg}|dD]U}|dddd}|r||V|rd|nd}nd}t|d|pd}t|d|pd}t ||} t|d |} | t| nd} t|d |pd } | d vrd } || | t| nd| fS) zUReturns (font_family or None, font_style_emphasis, font_size_pt or None, text_anchor) font-family,"rr'N font-style font-weight font-size text-anchorstart)rmiddleend) rrr3replaceappendjoinr rgrrb) rr family_valuecleanedrr4familyrremphasisr size_pttas r5_parse_font_attrsr%sq&c=)DDL &&s++ ) )Dzz||++C44<r@rIzCIgnoring relative %s length on <%s %s> because font size is unknownrAzCIgnoring relative ex length on <%s %s> because font size is unknowng?z+Ignoring unsupported length '%s' on <%s %s>)rrrr3r^ fullmatchgrouprLOGGERwarningrrb TypeErrorr`) rnr(r)attrpartstokenr_ value_strrfr&rrs r5 first_numberz%_parse_xy_delta..first_numbersF   TY%6%6T?DD SZ  :d#D N""4::<<00 E!H Na''..  # G,,IKK''-24466Dzz||},,$NN]  #N# ++i77!:.###"NNN#zz||t##$NN] #N# ++i7#==!:.###"NNN# %)) )    NN=     NNN s6DD-,D-.FFFF55.G&%G&xydxdy)rgr2rbr)rrr&r4r5r6r7r8s``` r5_parse_xy_deltar9s+96666C5%<(6  66666666p  S#A S#A dC B dC B aR<r7css_textcNg}|s|Std|}t|D]\}}t j|}|si}|D]\}}t|} | | ||<|sQd|dD} | D]u} | ds| ddddd } | sQ| | t|fv|S)Nrrc6g|]}|Sr>)r3)rselectors r5rz-_extract_css_class_styles..Es"PPP(X^^%%PPPr7r.r :r) CSS_COMMENT_REr CSS_BLOCK_REfindallrrrr6rrr3rdict) r:stylesr selector_blockbody declarations normalizedrr-r selectorsr= class_names r5_extract_css_class_stylesrK4sb/1F    X..G , 4 4W = =::+D11    &,,.. - -JC-e44J%", 3  PPn6J6J36O6OPPP ! : :H&&s++ !!""++C33A6<<>>J  MM:tJ'7'78 9 9 9 9  : Mr7ceZdZdZeddddedefdZeddddedefdZ eddddedefd Z eddddedefd Z edddefd Z edddefd Z eddddedefd ZdS) ShapeBuilderzNA namespace within which methods for converting basic shapes can be looked up.Frr' clipping_pathr.cbt}|rt}t|||S)z.Create a new path with the appropriate styles.)rrr)rrNpaths r5new_pathzShapeBuilder.new_pathTs3}}  ">>DT3 r7c|t|jdd}t|jdd}|jdpd}|drt |dd}nt|}|jdpd}|drt |dd}nt|}|jd pd } |jd pd } | d krd} | d krd} | | cxkrd krnnd x} } nN| d krt | x} } n6| d krt | x} } nt | } t | } |d ks|d ks | d ks| d krt d||d ks|d krtS| |dz kr|dz } | |dz kr|dz } |||} | ||||| | | S)z&Convert an SVG into a PDF path.r50r6widthrMNheightrxautoryrrz bad rect ) rgrrendswithr9rbr`rrQ rectangle)clsrrNr5r6 width_strrT height_strrVrx_strry_strrWrYrPs r5r~zShapeBuilder.rect]sh 3:>>#s33 4 4 3:>>#s33 4 4JNN7++2s   c " " .%,Yss^%<%&>FF#J//F%%/%%/ V  F V  F V % % % %v % % % % %KB v  Fmm #B v  Fmm #BvBvB AII6A::266rAvv...// / QJJFaKK==   B !  !B||C// q!UFB333 r7c4t|jdd}t|jdd}t|jd}|||}|||||S)z(Convert an SVG into a PDF path.cxrcyr)rbrrrQr)r]rrNrcrdrerPs r5rzShapeBuilder.circles3:>>$** + + 3:>>$** + + #*S/ " "||C// BA r7cHt|jdd}t|jdd}|jdpd}|jdpd}|||}||cxkrdksn|dks|dkr|S|dkrt|x}} n6|dkrt|x}} nt|}t|} ||||| |S)z)Convert an SVG into a PDF path.rcrrdrWrXrYrS)rbrrrQr) r]rrNrcrdr`rarPrWrYs r5rzShapeBuilder.ellipses"3:>>$** + + 3:>>$** + +%%/%%/||C// f & & & & & & & &FcMMv}}K V  Fmm #B v  Fmm #BvBvB RR$$$ r7cXt|jd}t|jd}t|jd}t|jd}||}|||||||S)z&Convert an SVG into a PDF path.x1y1x2y2)rbrrQmove_toline_to)r]rrhrirjrkrPs r5rzShapeBuilder.lines3:d# $ $ 3:d# $ $ 3:d# $ $ 3:d# $ $||C   R R r7cp||}d|jdz}t|||S)z*Convert an SVG into a PDF path.MpointsrQrsvg_path_converter)r]rrPrps r5rzShapeBuilder.polylines;||C  sz(++4((( r7cx|||}d|jdzdz}t|||S)z)Convert an SVG into a PDF path.rorpZrq)r]rrNrPrps r5rzShapeBuilder.polygonsB||C//sz(++c14((( r7NF)r:r;r<r= staticmethodrrrQ classmethodr~rrrrrr>r7r5rMrMPsXXi\11y11+111[1f4K[)D[[0 y [   [ 9[)D[[r7rMrc  t|}tj}|D]\}}|}|dkrPt dt |D\}}}}} } t||||| | |z}p|dkrt |^} } t| } tj | } | rft| dkr=| t| dt| d} ntd|d |d | |z}%|d krt |}t|dkr+t|d}t|d}n=t|dkrt|dx}}ntd |tj|| |z}|dkr(tjt|d |z} |dkr(tjdt| |z}7|dkrt |}t|dkr+t|d}t|d}n=t|dkrt|d}d}ntd|tjt!j|t!j| |z}|dkr:tjt!jt|d |z}Q|dkr:tjdt!jt| |z}|dkrt |}t|dkr+t%|d}t%|d}n=t|dkrt%|d}d}ntd|tj|| |z}G|dkr(tjt%|d |z}u|dkr&tjdt%| |z}|S)z8Convert SVG/CSS transform functions into PDF transforms.matrixc34K|]}t|VdSr0r)rns r5 z%convert_transforms..s($P$P!U1XX$P$P$P$P$P$Pr7rotate)thetarZrr zrotation transform (z) is malformedscalezbad scale transform r5r6scaleXscaleYskewzbad skew transform skewXskewY translatezbad translation transform translateX translateY)TRANSFORM_GETTERrBridentityr3tuplerrrlrotationlenaboutrbr`scalingshearingmathtanrg translation)rparsedrtf_typeargsar cdefr~rrsxsyr5r6s r5rrs % %e , ,F"$$ISWSW zz|| h  $$P$P|7I7I$7O7O$P$P$PPP Aq!Q1!!Q1a33i?II  (..t44MEE!%((E )666H u::??'~~eE!HoouU1XOOHH$LgLLLLL!9,II   %%d++D4yyA~~47^^47^^TaQ..(RR !?!?!?@@@!)B"555 AII  !)E$KK1=== III  !)At=== III   %%d++D4yyA~~"47++"47++Ta"47++ !>u!>!>???!*TXb\\TXb\\JJJYVII   "TXmD.A.A%B%BaHHH9T I  "Q$(=3F3F*G*GHHH9T I # #%%d++D4yyA~~"47++"47++Ta"47++ !Ee!E!EFFF!-Q777)CII  $ $!-t0D0DJJJYVII  $ $!-^D5I5IJJJYVI r7pdf_pathsvg_pathcpt|}t|||jstddS)Nz"Path does not start with move item)rr first_is_mover`)rrpens r5rrrr7sC (  Cx  ?=>>>??r7ceZdZdZedddeeezdedededdf d Z dJd ee zd e e dd fd Z e de ededd fdZdKdZdddeeeffdZe edLdededefdZe edddeeeeezffdZe ede ede efdZe dMdZe dMd Ze dJd!ed"dd#e eeefdd fd$Ze dKd%Ze dKd&Z dNd(d)d*e!deeee"ffd+Z# dOd-ed.ee$zd/ee$zd*e!d0e!deeee"ff d1Z% dPd(d)d2e ed3e ed4e e!dd f d5Z&e dQd7Z'e d8dde"fd9Z(e dRd:dd;e e"dddefd?Z*e d@ddefdAZ+e d@ddBe edd fdCZ,e dJd!ed"dd#e eeefdd fdDZ-e dSdGZ.e dJdHddAANsvg_text image_cachecR||_i|_i|_i|_d|_d|_t |}|jtddvrtd|j| || || |dS)Nr+zroot tag must be svg, not ) rcross_referencescss_class_stylesgradient_definitionsrTrV parse_xml_strrrxr`_collect_css_stylesextract_shape_infoconvert_graphics)selfrrsvg_trees r5__init__zSVGObject.__init__[s'02;=  !15 15 +H55 <|E599 9 9H(,HHII I   *** ))) h'''''r7r referencedcZ|r(|dsd|zn|}||j|<dSdS)Nr)rr)rrrs r5 update_xrefzSVGObject.update_xrefpsE  4#&>>##6#6?#))CC)3D !# & & & 4 4r7root_tagr'c>|D]}|jtddvrnd|pg}t |D]5\}}|j|i}||6dS)Nr+rrr) iterrrxritertextrKr setdefaultupdate)rrnoder:rJrGexistings r5rzSVGObject._collect_css_stylesvsMMOO 2 2Dx<w7777774==??#8b990I(0S0S22,J #4?? BOOHOOL1111  2 2r7rcni}|jrd|jd}|rH|D]3}|j|}|r||4t j|jdd}|D]6\}}t|} | | ||<||vr| |d7d} | D]J} | |jvr?t|j| } | | | | K|S)Nclassrrr)rrrrrr) rrrrrrrrr6popr) rrr class_attrrJ class_stylesrrr-rinheritable_attrsr0s r5_style_map_forzSVGObject._style_map_for~sX$&   700J 7","2"2"4"477J#'#8#<#>#   -ss$$u, , <<     %e,,,,,   Gsss   s0A B()A:7B(:%B$B(#B$$B(gradient_elementc*g}|D]}t|j}|dkr|jd}|tdU|}|drt|dddz }nt|}tdtd |}d}d }|jd d }|r|tj |} | d }| d } | r< t| }n+#t$rtd| YnwxYw||jd d}d |jvr; t|jd pd}n#t$rYnwxYw t|} |d kr`t| t r!t!| j| j| j|} t| t(rt)| j|} ||| fS#tt,f$r'} td|| Yd} ~ d} ~ wwxYw|S)z,Parse children of a gradient element.stopoffsetNz%Found without offset, skippingrMrUrrrrrrz stop-colorz stop-opacityzInvalid stop-opacity value: %sblack1z#Could not parse stop color '%s': %s)r}rrrr-r.r3r[rbmaxminrrr`rr1rregr rrrd) rstops stop_elementtag_name offset_strr stop_color stop_opacityr style_dictstop_opacity_str color_objrs r5_parse_gradient_stopszSVGObject._parse_gradient_stopss =?,9 9 L!,"233H6!!%,00::J!FGGG#))++J""3'' +z#2#//%7z**c#v..//FJL '++GR88E !1%88 '^^L99 #->>.#A#A #',-='>'> %<>N !)044\7KK !444#()<)@)@)P)P)WTW#X#XLL!D $Z00 #%%!)Y77$-%Kik<%% ")Z88J$.y{L$I$I  fi01111)   DjRSTTT  s=-D==%E%$E%)F99 GG B IJ)J  J url_valuec|rt|tsdStjd|}|rd|dzSdS)z)Extract gradient ID from url(#id) format.Nzurl\(\s*["\']?\s*#([^)"\'\s]+)rr )r1r2rsearchr,)rr_s r5_extract_gradient_idzSVGObject._extract_gradient_idsV  9c : : 4 ;YGG  (Q' 'tr7 grad_elementc|jd}|stddS|dsd|z}|jdd}|jdd}|jdd }|jd d}||d }||d }||d } ||d } |jd d} | dkr t j} n t j} |jdd} tj | }n>#ttf$r*tj }td| YnwxYwd}|jd}|rP t|}n?#tttf$r%}td|Yd}~nd}~wwxYw||}|std|dSt#||| | ||}t%|| |pt'j|}||j|<td|t/|dS)zFParse a element and store it in gradient_definitions.idz5Found without id attribute, skippingNrrh0%rirjz100%rkrSr gradientUnitsobjectBoundingBoxuserSpaceOnUse spreadMethodpadz$Invalid spreadMethod '%s', using PADgradientTransform%Could not parse gradientTransform: %sz1Linear gradient '%s' has no valid stops, skipping)rhrirjrkr spread_methodgradientunitsgradient_transformrz)Parsed linear gradient '%s' with %d stops)rrr-r.rrr USER_SPACE_ON_USEOBJECT_BOUNDING_BOXr coercer`AttributeErrorPADrr/rr%rrrrdebugr)rrgrad_idrhrirjrkx1_valy1_valx2_valy2_val units_strr spread_strrr transform_strrrrgradient_paints r5_parse_linear_gradientz SVGObject._parse_linear_gradients".!4!8!8!>!>  NNR S S S F!!#&& $GmG  $ $T4 0 0  $ $T4 0 0  $ $T6 2 2  $ $T4 0 0222s;;222s;;222s;;222s;; '++O=PQQ ( ( (!3EE!5E!(,,^UCC  O07 CCMMN+ O O O04M NNA: N N N N N O $+//0CDD  K K.}==  : K K KFJJJJJJJJ K**<88  NNNPW X X X F('    '(@I,>,@,@'    .<!'* @'3u::VVVVVs*-F8F=<F=G//H+H&&H+c |jd}|stddS|dsd|z}|jdd}|jdd}|jdd}|jd |}|jd |}|jd d }||d } ||d } ||d } ||t | } ||t | } ||d}| dkrtd|| dS|jdd}|dkr tjn tj }|jdd} tj |}n##ttf$rtj}YnwxYwd}|jd}|rP t|}n?#ttt f$r%}td|Yd}~nd}~wwxYw||}|std|dSt%| | | || | ||}t'|||pt)j|}||j|<td|t1|dS)zFParse a element and store it in gradient_definitions.rz5Found without id attribute, skippingNrrcz50%rdrefxfyfrrz0.5rSrz4Radial gradient '%s' has invalid radius %s, skippingrrrrrrrz1Radial gradient '%s' has no valid stops, skipping)rcrdrerr r r rrz)Parsed radial gradient '%s' with %d stops)rrr-r.rrr2r rrr rr`rrrr/rr&rrrrrr)rrrrcrdrer r r cx_valcy_valr_valfx_valfy_valfr_valrrrrrrrrrrs r5_parse_radial_gradientz SVGObject._parse_radial_gradientHs%))$//  NNR S S S F!!#&& $GmG  $ $T5 1 1  $ $T5 1 1   # #C / /  $ $T2 . .  $ $T2 . .  $ $T4 0 0222u==222u==11!U;;222s6{{CC222s6{{CC222s;; A:: NNFQV    F '++O=PQQ ,,,  + +2  "(,,^UCC  507 CCMMN+ 5 5 504MMM 5 $+//0CDD  K K.}==  : K K KFJJJJJJJJ K**<88  NNNPW X X X F('    '(@I,>,@,@'    .<!'* @'3u::VVVVVs* H!!II#I33J/ J**J/rrrct|d|}|rR||}|r;||jvr2|j||j_t d|t|d|}|rT||}|r?||jvr8|j||j_t d|dSdSdSdS)zPApply gradient paint to fill or stroke if a url(#gradientId) reference is found.rzApplied gradient %s to fillrzApplied gradient %s to strokeN)rrrrrr-rr)rrrr fill_valuer stroke_values r5_apply_gradient_paintzSVGObject._apply_gradient_paints( VYGG  E// ;;G E7d&???,0,Eg,N) :GDDD)+xKK  G// ==G G7d&???.2.G.P+ r)rnums r5rz0SVGObject.extract_shape_info..sPPPSeCjjPPPr7rz)invalid negative width/height in viewbox ) r preserve_arrTr3r[r9rgrVviewboxrrr`) rrr^r_rrvxvyrGrEs r5rzSVGObject.extract_shape_infosLL)) \\(++ ,,y))ll#8$?? & #D  #D   OO   !!#&& 7$Yss^44 +I66   !      ""3'' 9%j"o66 ,Z88 ?DLLLmmooGPPL4F4Fw4O4OPPPNBBQBFF !VW!V!VWWWB+DLLLr7ct}d|j_d|j_tj|j_|||||_dS)zFConvert the graphics contained in the SVG into the PDF representation.NF) rrrrrBUTTr build_group base_group)rrr#s r5rzSVGObject.convert_graphicssT%&& (, %&+ #,:,? ) :...$r7Tpdfr) align_viewboxcP||j|j|j|S)a Size the converted SVG paths to the page viewport. The SVG document size can be specified relative to the rendering viewport (e.g. width=50%). If the converted SVG sizes are relative units, then this computes the appropriate scale transform to size the SVG to the correct dimensions for a page in the current PDF document. If the SVG document size is specified in absolute units, then it is not scaled. Args: pdf (fpdf.fpdf.FPDF): the pdf to use the page size of. align_viewbox (bool): if True, mimic some of the SVG alignment rules if the viewbox aspect ratio does not match that of the viewport. Returns: The same thing as `SVGObject.transform_to_rect_viewport`. )transform_to_rect_viewportkepweph)rr$r%s r5transform_to_page_viewportz$SVGObject.transform_to_page_viewports$,..sucgsw VVVr7FrrTrVignore_svg_top_attrsc|r5t|trt|}nRt|}nBt|jtr|st d|j|zdz }n |jp|}|r5t|trt|}nRt|}nBt|jtr|st d|j|zdz }n |jp|}|dkrt j}nt jd|z }|j r|j \} } } } | dks| dkrddtfS|| z } || z }|s|j r| |krt| |x} }|t j | | zt j| |z}|r1|t j |dz | dz | zz |dz | dz |zz z}||j_||z ||z |jfS)a Size the converted SVG paths to an arbitrarily sized viewport. The SVG document size can be specified relative to the rendering viewport (e.g. width=50%). If the converted SVG sizes are relative units, then this computes the appropriate scale transform to size the SVG to the correct dimensions for a page in the current PDF document. Args: scale (Number): the scale factor from document units to PDF points. width (Number): the width of the viewport to scale to in document units. height (Number): the height of the viewport to scale to in document units. align_viewbox (bool): if True, mimic some of the SVG alignment rules if the viewbox aspect ratio does not match that of the viewport. ignore_svg_top_attrs (bool): ignore top attributes like "width", "height" or "preserveAspectRatio" when figuring the image dimensions. Require width & height to be provided as parameters. Returns: A tuple of (width, height, `fpdf.drawing.GraphicsContext`), where width and height are the resolved width and height (they may be 0. If 0, the returned `fpdf.drawing.GraphicsContext` will be empty). The `fpdf.drawing.GraphicsContext` contains all of the paths that were converted from the SVG, scaled to the given viewport size. z?SVG "width" is a percentage, hence a viewport width is requiredd���zASVG "height" is a percentage, hence a viewport height is requiredr ���r���r��rZ��)r1���r9���rb���rT��r`���rV��r���r��r��r��r���r��r��r��r#��r���)r��r��rT��rV��r%��r,��vp_width vp_heightr���r��r��rG���rE���w_ratioh_ratios��� r5���r'��z$SVGObject.transform_to_rect_viewport��sr���H� � +%))� ( << <<  G , ,� +�  U���zE)C/HHz*UH � .&'**� *!&MM !&MM  W - -� .�  W��� f,s2II -vI A::!*,,II!)!e)44I <� !\NBBaR1WW!_....mG"nG'� :D,<� :'WBTBT$'$9$99'�'2#"5556#g999:�  �� % (=lb1f%77!mrAv&88)�)�)� �%.!%U!2DOCCr7���r5��r6�� debug_streamc��������������������|j���������|�_���������|���������������������|����������\��}}}|j��������|j��������}} �|C|A|��������������������dd�����������|j��������J�|j��������t ����������j��������||����������z��|_��������|��������������������||�����������|��������������������||�����������dS�#�|��������������������||�����������w�xY�w)a�� Directly draw the converted SVG to the given PDF's current page. The page viewport is used for sizing the SVG. Args: pdf (fpdf.fpdf.FPDF): the document to which the converted SVG is rendered. x (Number): abscissa of the converted SVG's top-left corner. y (Number): ordinate of the converted SVG's top-left corner. debug_stream (io.TextIO): *DEPRECATED* the stream to which rendering debug info will be written. Nr���) r��r+��r5��r6��set_xyr���r���r�� draw_path) r��r$��r5��r6��r3��_rP��old_xold_ys ��� r5��� draw_to_pagezSVGObject.draw_to_pageZ��s����&�?44S99 1duceu %} 1a   ~111!%)2G12M2M!M MM$ - - -� JJue $ $ $ $ $CJJue $ $ $ $s ���AB(�(C�defsc��������������������|D�]}|j���������t����������dd����������v�r|���������������������|�����������0|j���������t����������dd����������v�r0t������������������������������d�����������|���������������������|�����������w|j���������t����������dd����������v�r|���������������������|�����������|j���������t����������dd����������v�r|���������������������|�����������|j���������t����������v�r|���������������������|�����������|j���������t����������dd����������v�r|� ��������������������|�����������#|j���������t����������dd����������v�r|� ��������������������|�����������Q|j���������t����������dd ����������v�r> �|j ��������d ���������}n#�t����������$�r�d }Y�nw�xY�w|D�]}|� ��������������������||�����������|j���������t����������dd ����������v�rt������������������������������d t����������|j������������������������������d S�)z:Produce lookups for groups and paths inside the tagr+���r��r��SIgnoring unsupported SVG tag: (contributions are welcome to add support for it)rP��imagelinearGradientradialGradientclipPathr��Nr���TIgnoring unsupported SVG tag: <%s> (contributions are welcome to add support for it))r���rx���r"��r-��r.�� build_path build_image shape_tags build_shaper��r��r���rd���build_clipping_pathr}���)r��r;��childclip_idchild_s��� r5��� handle_defszSVGObject.handle_defs~��s2�����" �" EyL4444  ''''l5#6666�i���  ''''l5&9999&&&&l5'::::  ''''j((  ''''l52BCCCC++E2222l52BCCCC++E2222l5*====##l40GG�#�#�#"GGG##�>�>F,,VW====>l5'::::juy))���?" �" s���, E:: F F xrefc��������������������|����������������������|����������}t����������������������}t����������|||�����������t����������ddd����������D�]!} �|j��������|���������}�n##�t ����������$�r�Y�w�xY�wt ����������d|�d���������� �|��������������������|�j��������|��������������������n$#�t ����������$�r�t ����������d|�d|�����������dw�xY�wd|j��������v�s d |j��������v�rkt����������|j�������� ��������������������dd ��������������������t����������|j�������� ��������������������d d ��������������������}}t����������j ��������|| ����������|_ ��������|S�) z?Resolve a cross-reference to an already-seen SVG element by ID.r,���hrefr��zuse z% doesn't contain known xref attributez references nonexistent ref id Nr5��r6��r���r��)r��r���r���rx���r���rd���r`���add_itemr��rb���r���r���r��r���)r��rL��r��� pdf_group candidaterefr5��r6��s��� r5��� build_xrefzSVGObject.build_xref��s����''-- #%% Yi000%gvt<<� Q� QI k),� � �  �ODOOOPP P    t4S9 : : : :� � � AtAACAA�   � $+   !3!3�a00115a9P9P3Q3QqA"+"7!q"A"A"AI �s��� A A%$A%< B�!B>r,��rP��inherited_stylec����������������� ���|����������������������|����������}t����������|pi�����������}|��������������������|�����������|t����������������������}t ����������|||�����������d�|D�������������D�]}|���������������������|�����������|D�][}|j��������t����������dd����������v�r|���������������������|�����������0|j��������t����������dd����������v�rH|j��������t����������dd����������v�r,|��������������������|� ��������������������|d|����������d�����������|j��������t����������dd����������v�rFt���������� ��������������������d �����������|��������������������|� ��������������������|d|����������d�����������|j��������t����������dd ����������v�r+|��������������������|� ��������������������|����������d�����������*|j��������t����������v�r+|��������������������|���������������������|����������d�����������c|j��������t����������dd ����������v�r+|��������������������|���������������������|����������d�����������|j��������t����������dd ����������v�r+|��������������������|���������������������|����������d�����������|j��������t����������dd ����������v�r0|���������������������||����������}|r|��������������������|d�����������.t���������� ��������������������dt%����������|j�����������������������������]|���������������������|j����������������������������d����������|�����������|S�)z+Handle nested items within a group tag.Nc�����������������@����g�|�]}|j���������t����������d�d����������v�|S�)r+���r;��)r���rx���)r���rH��s��� r5���r���z)SVGObject.build_group..��s5����� � �  \%5P5P(P(PE(P(P(Pr7���r+���r;��r���r��Fr��r=��rP��user>��textrB��r��)r��rC��r��r���r���rK��r���rx���rO��r"��r-��r.��rC��rE��rF��rS��rD�� build_textr}���r��r���r���)r��r,��rP��rT�� local_style merged_stylerH�� text_paths��� r5���r"��zSVGObject.build_group��s'����))%00 O1r22 K(((  '))IY|444 � $ � � � $� $E�   U # # # #� � EyL7777  ''''l5'::::l5#6666""4#3#3E4#N#NPUVVVVl5#6666�i���""4#3#3E4#N#NPUVVVVl5&9999""4??5#9#95AAAAj((""4#3#3E#:#:EBBBBl5%8888""4??5#9#95AAAAl5'::::""4#3#3E#:#:EBBBBl5&9999 OOE<@@ �9&&y%888juy))��� � ))$//;;;r7���rP��c�����������������~���|����������������������|����������}t����������������������}t����������|||�����������|���������������������|||�����������|���������������������|||�����������|j����������������������������d����������}|t����������||�����������|���������������������|j����������������������������d����������|�����������|S�)z1Convert an SVG tag into a PDF path object.r��Nr��) r��r���r���r��apply_clipping_pathr���r���rr��r��)r��rP��r���r��r��s��� r5���rC��zSVGObject.build_path��s�����''-- ==XtY/// ""8T9===   4;;;;??3''   x 2 2 2 ..999r7���shapec��������������������|����������������������|����������}t����������t����������t����������|j���������������������������}�||����������}t ����������|t ��������������������sJ�t����������|||�����������|���������������������|||�����������|� ��������������������|||�����������|� ��������������������|j �������� ��������������������d����������|�����������|S�)zConvert an SVG shape tag into a PDF path object. Necessary to make xref (because ShapeBuilder doesn't have access to this object.)r��) r��getattrrM��rE��r���r1���r���r���r��r^��r��r���r���)r��r_��r��� shape_builder shape_paths��� r5���rF��zSVGObject.build_shape��s�����''..  j.CDD "]5)) *k22222Z 222 "":ui@@@   UI>>> ))$//<<<r7���rI��c�����������������n���|j���������t����������v�rX|���������������������|����������}t����������t����������t����������|j����������������������������}�||d����������}t ����������|||�����������n|j���������t ����������dd����������v�rr|���������������������|����������}t����������������������}t ����������|||�����������t����������j ��������|_ ��������|j �������� ��������������������d����������}|t����������||�����������n/t������������������������������dt!����������|j������������������������������d�S�|���������������������||�����������d�S�)NTr+���rP��r��zaIgnoring unsupported child tag: <%s> (contributions are welcome to add support for it))r���rE��r��ra��rM��r���rx���r���r��� DONT_PAINT paint_ruler���r���rr��r-��r.��r}���r��)r��r_��rI��r���rb��clipping_path_shaper��s��� r5���rG��zSVGObject.build_clipping_path��s*��� 9 " "++E22I#L*UY2GHHM"/-t"<"<  ,eY ? ? ? ? Y,uf55 5 5++E22I"---  ,eY ? ? ?-:-E  *|'',,H#"#6AAA NNs59%% � � � F "566666r7���c���������������������d�}|r d|v�r|d���������}||j�����������������������������d����������}|r3t����������j��������d|����������}|J�|�j��������|d������������������|_��������d�S�d�S�)Nz clip-pathzurl\((\#\w+)\)r ���)r���r���r���r��r��rN��)r��r���r���r��� clip_valueclipping_path_ids��� r5���r^��zSVGObject.apply_clipping_path3��s����� � 0 11";/J  $+// <��SVGImagec����������� ���������d�}t����������dd����������D�]}||j��������v�r|j��������|���������}�n|st����������d����������t����������|j����������������������������dd��������������������}t����������|j����������������������������dd��������������������}d|j��������v�rt ������������������������������d�����������d |j��������v�rt ������������������������������d �����������d |j��������v�rt ������������������������������d �����������t����������|t����������|j����������������������������d d��������������������t����������|j����������������������������dd��������������������|||�����������}|���������������������|j����������������������������d����������|�����������|S�)Nr,���rN��z# is missing a href attributerT��r���rV��r��zu"preserveAspectRatio" defined on is currently not supported (contributions are welcome to add support for it)r���zg"style" defined on is currently not supported (contributions are welcome to add support for it)r���zk"transform" defined on is currently not supported (contributions are welcome to add support for it)r5��rS��r6��rN��r5��r6��rT��rV��svg_objr��) rx���r���r`���rb���r���r-��r.��rk��r��)r��r>��rN��r���rT��rV�� svg_images��� r5���rD��zSVGObject.build_imageD��s���00� � Cel""|C(�#�� DBCC Cel&&w2233u|''!4455 EL 0 0 NN�H � � � el " " NNy � � � %, & & NN} � � �EL$$S#..//EL$$S#..//  � � � ))$//;;;r7���text_tagc�����������������d��"#$%&'(�|����������������������|����������}t����������|pi�����������}|��������������������|�����������t����������������������}t ����������|||�����������|���������������������|||�����������t ����������||����������}t����������||����������\��$#}}$d$||nt����������d����������%t����������||%����������\��} } } } | | z���} | | z���}g�(d&d'dt����������d���������dt����������t����������t����������t����������f������������������d t����������t�������������������fd " � � � � � �d!d t����������d t����������t�������������������d t����������t�������������������dt����������t�������������������dt����������dt����������dt����������dt����������t�������������������dt����������t�������������������dt����������d���������dt����������t����������t����������t����������f������������������d df"#$%&'(fd }�||j��������pd$#||dd�����������|D�]O}|j��������t%����������dd����������v�r4|����������������������|����������}t����������|����������}|��������������������|�����������t����������||����������\��}}}}||n%}t����������|||����������\��}}}}t ����������||����������}d��������������������|������������������������������������������}|j��������pd}|r.|��������������������|����������r|dt/����������|���������� ����������}n|}d} d}!d|j��������v�s|d|v�r|} d|j��������v�s|d|v�r|}!�||||||||| |!|| �� ����������||j��������pd$#||dd�����������OQ(r5|��������������������t5����������| |t7����������(����������|����������d�����������|���������������������|j����������������������������d ����������|�����������|S�)"a�� Convert (and simple ) into a PaintedPath with Text runs. - Uses Text baseline at (x,y) - Honors x/y and dx/dy on and direct child - Flattens nested tspans; advanced per-character positioning is not implemented N sans-serif16px)r&��r���r���r'���style_map_for_tagr.���c���������������������|�|d�S�t����������������������t����������|�|�����������t����������j��������j��������_��������t ����������fdt����������j��������D�����������������������}|sd�S�t����������j������������������S�)Nc��������������3���Z���K���|�]%}t����������j��������|����������t����������j��������uV��&d�S�r0���)ra��r���r���r���)r���propcontexts��� r5���r|��z?SVGObject.build_text.._style_for_run..��sK��������� t,,M4II�����r7���) r���r���r���r���r���r���anyMERGE_PROPERTIESr���)r���rt�� overridesrx��s��� @r5���_style_for_runz,SVGObject.build_text.._style_for_run��s�����{/7t%''G #'8 9 9 9'4'���|�pd} t����������| |����������} |r| } n| ��������������������������������}|rE|} | d�d�����������������������������������������rd| z���} | dd������������������������������������������r| dz���} n?| d�d�����������������������������������������s| dd������������������������������������������rrd} nd} | s |z ��|z ��d�S�||n}|ppd}||npd}|z���}|z���}dd�| | ����������}��������������������t ����������| |||||||| �� �������������������d�S�) Nrr���)r���r ���r���rU��rr��r���) rX��r!��r"��r~��r7��r8��r��r�� run_style)r���r3���isspacer��r���)r}��r!��r"��r~��r���r��r��r��r��r��rt��raw collapsedcontenttrimmedrun_size run_family run_emphasisrun_dxrun_dyr��r|�� base_emph base_familydefault_font_size pending_dx pending_dy text_runss��� r5���_add_runz&SVGObject.build_text.._add_run��s����.bC$S8<<;>,J(0(9 �9 9 SM9 �sm9 �5/ 9  � 9  � 9 �9 �E?9 �E?9 � *9 � (S#X79 �9 �9 �9 �9 �9 �9 �9 �9 �9 �9 �9 �9 x�  M R   $" � � � ��9 �9 EyL8888$($7$7$>$>!(,_(=(=%%,,->???+<0,�,(T4�)-(8>O .0M � �  1b"�"..CU!K!K!wwu~~'7'788 !J," �,!6!6y!A!A�,+,=s9~~o,=>HH+H%,&&%1c=N6N6NE%,&&%1c=N6N6NE+#&7 � � � �J$","&*����� �   ! !#I.. + �� �� "� � � � ,,T22D999 r7���r0���)r��r'���r.���N)rS��)r��r'���r.���N)T)TF)NNN)r;��r'���r.���NNN)r>��r'���r.���rk��)0r:���r;���r<���r=���rw��r2���r���r���r��bytesr ���r"���r��r!���r��r��rC��r��rv��rb���r��listr��r���r���r��r��r��r��r���r��r��r��r���r���r+��r9���r'��r:��rK��rS��r"��rC��rF��rG��r^��rD��rY��r>���r7���r5���r��r��?��s��������� � 8�8�8 %8�8� 8 � 8 �  8�8�8�[8.�JN(�(e (2::2F( (�(�(�(*�4x}�4#�4$�4�4�4�4 2�2�2�2)�S#X����>��C�#�����\�*�A#A eE9z112 3A�A�A�\�AF� �(3-����\��AW�AW�AW�AWF�KW�KW�KW�KWZ� �/3 G�GG�G�DcN+ G �  G�G�G�G*�%,�%,�%,�%,N� %� %� %� %�26W�WW*.W ue_, -W�W�W�W:�#%* `D�`D`D�w`D� `D � `D �# `D� ue_, -`D�`D�`D�`DJ�"!'+ %� %  %� E? %� E? % �tn % �  %� %� %� %H�$�$�$�$P�y�_����>��0448 7�77�O,7�"$sCx.1 7 �  7�7�7�7r� y� [� � � � � � {� � � � �7�7Xc]�7t�7�7�7�7,� �/3 P�PP�P�DcN+ P �  P�P�P�P � � � � D�OSA�A!A4 tags is currently not supported (contributions are welcome to add support for it)rr���T)infor5��r6��whkeep_aspect_ratio)rn��r��AssertionError image_parsingr��rN��r1���r#���r-��r.��size_in_document_unitsrT��rV��r$���r5��r6��) r��r��r���r��r��r��r��r7��r��r��r��stream_contents ��� r5���renderzSVGImage.render@��s�����l?t|'? �  Z��  � 100000"]; :: 1d dO , ,� 0 NN�N � � �y-/ /**4:t{CC18ff"  � � �y-77r7���c�����������������6����t����������|�j��������|�j������������������S�r0���)r���r5��r6��)r��s��� r5��� end_pointzSVGImage.end_pointc��s����TVTV$$$r7���r��c����������� ������2���|�j���������}|�j��������}|�j���������|�j��������z���}|�j��������|�j��������z���}t ����������j��������t ����������||����������t ����������||����������t ����������||����������t ����������||����������g����������}|t ����������|�j���������|�j������������������fS�r0���)r5��r6��rT��rV��r��� from_pointsr���)r��r��x0y0rh��ri��bboxs��� r5��� bounding_boxzSVGImage.bounding_boxh��s���� V V Vdj  Vdk !&b" b" b" b"   � �U4646****r7���N)r:���r;���r<���r2���__annotations__rb���r��rC��r��r���r��r!���r���r���r��r��propertyr��r���r��r>���r7���r5���rk��rk��,��s1�������� III HHH HHH LLL MMM   :�  d38n�  �  �  �  �  � 8, 8� 8� 8 � 8 � sL%' ( 8� 8� 8� 8D�%5�%�%�%�X%+%�+E+u2D,E�+�+�+�+�+�+r7���rk��)rS���)rW���r0���ru��r��)or=���loggingr��r���warningscopyr���osr���typingr���r���r���r���r ���fontTools.svgLib.pathr ���enumsr ���r ���r���r���defusedxml.ElementTreer���r�� ImportErrorwarnxml.etree.ElementTreerr���r���drawingr���r���r���r���r���r���r���r���r���drawing_primitivesr���r���r���r���r���r ���r!���image_datastructuresr"���r#���outputr$���patternr%���r&���r'���r(���fpdfr)���r*��� getLoggerr:���r-��rs���compiler���r��DOTALLr@��rA��r2���r6���rb���r9���r^���re���rc���taurj���rg���rl���rt���rC��rx���r}���rE��r���r���r���r���r���r���r���r��r���r���r���r���r ��r��r��r%��r9��r��rK��rM��r���rr��r��rk��r>���r7���r5���r�����s ������ � ��������������E�E�E�E�E�E�E�E�E�E�E�E�E�E������V�U�U�U�U�U�U�U�U�U�U�UBBBBBBBB�B�B�BHMc���BAAAAAAA B������ � � � � � � � � � � � � � � � � � � � � � ������������������>�=�=�=�=�=�=�=�3�3�3�3�3�3�A�A�A�A�A�A�A�A�(------######''''''�  8 $ $ � ( +�� �rz899 2:m���L")44rz566  �(3-�����/�/�/�/�/e�/�/�/� PQQ ���*�     � �� 8c> HsN H � �V�Vs�V#�V�V�V�V�V(�Q�QS�Q�Q�Q�Q�Q�Q"��C�C������S�T#s(^�����c�c�����\ 68Y I� � Ds� Dy:5� D� D� D� D�3�8E?����������� � � 8SE5L3I� � � � �2E2E� #SE3J/����*B 6 c] 6� 6� 6� 6"�;?Q�Q Q'S#X7Q 8C=#x 34Q�Q�Q�QH�+/!%D�D DS#X'D�D� 5% %& D�D�D�DN�U3S#X;N5O0P����8��������D�`c�`i�`�`�`�`F�?�?�?�?�?�?�?j�j�j�j�j�j�j�jZJ+�J+�J+�J+�J+z�J+�J+�J+�J+�J+s���A�A&%A&