+
    :ݸi+                     p   R t ^ RIt^ RIt^ RIHtHt ^ RIHtHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ R	IHt ]! R
R.R7      tR],          t^],          t^8t^it^t^t]! ]4       U u. uF  p ]V R,           ,          NK  	  up t]! ]4       U u. uF  p ]V R,           ,          NK  	  up t ^
t!^t"^
t#^
t$^
t%^t&]]!,
          ]#,
          ]$,
          ]%,
          ]&,
          t' ! R R]4      t( ! R R]4      t)R R lt*R R lt+R t,RR R llt-]P]                  R4      R R l4       t/R# u up i u up i )u  
Router FastAPI — Génération PDF étiquettes béton
Format : A4 Paysage (297×210mm)
Grille  : 5 colonnes × 2 lignes
Étiquette : 56mm large × 105mm haute
Pas de rotation — texte lisible directement

Structure de haut en bas :
  Logo          : 10mm (pleine largeur)
  ┌─────────────────────────────────┐
  │ Bande (7mm) │ Stats   10mm      │
  │   couleur   │ Client  10mm      │
  │   vertical  │ Projet  10mm      │
  │             │ Pièce   33mm      │
  └─────────────────────────────────┘
  Zone béton    : 25mm (pleine largeur)
N)ListOptional)	APIRouterHTTPException)StreamingResponse)	BaseModel)canvasmm)HexColorblackwhite)ImageReaderz/api/etiquettes
etiquettes)prefixtagsi)        ?c                   <   a  ] tR t^?t o RtRtRtRtV 3R ltRt	V t
R# )EtiquettePiece #4facfeNc                   < V ^8  d   Qh/ S[ ;R&   S[S[ ,          ;R&   S[ ;R&   S[S[ ,          ;R&   S[S[ ,          ;R&   S[;R&   S[;R&   S[S[ ,          ;R&   # )	   	reference
client_nom
projet_nomprojet_couleurniveaulitrespoids_tlogo_b64)strr   intfloat)format__classdict__s   "gC:\Users\petid\OneDrive\Desktop\Maestro\MAESTRO CLAUDE\MAESTRO\maestro-backend\app\routes\etiquettes.py__annotate__EtiquettePiece.__annotate__?   su     N "  O  SM-	 
 SM  K  N  sm"      )__name__
__module____qualname____firstlineno__r   r   r   r    __annotate_func____static_attributes____classdictcell__r%   s   @r&   r   r   ?   s"      "J$-NF #H  r)   r   c                   0   a  ] tR t^Jt o RtV 3R ltRtV tR# )EtiquettesRequestFc                B   < V ^8  d   Qh/ S[ S[,          ;R&   S[;R&   # )r   pieces	draw_grid)r   r   bool)r$   r%   s   "r&   r'   EtiquettesRequest.__annotate__J   s          r)   r*   N)r+   r,   r-   r.   r7   r/   r0   r1   r2   s   @r&   r4   r4   J   s     I  r)   r4   c                0    V ^8  d   QhR\         R\         /# )r   x_mmreturn)r#   )r$   s   "r&   r'   r'   P   s      U u r)   c                     V \         ,          # Nr	   )r;   s   &r&   ptr?   P   s    "9r)   c                0    V ^8  d   QhR\         R\        /# )r   hr<   )r!   r   )r$   s   "r&   r'   r'   T   s     # # # #r)   c                     V P                  4       p V P                  R 4      '       g
   R V ,           p  \        V 4      #   \         d    \        R4      u # i ; i)#r   )strip
startswithr   	Exception)rA   s   &r&   	hex_colorrG   T   sN    		A<<!G#{ #	""#s   
= AAc                 b    \        V4      ^8  d   V P                  WV4      V8  d   VRR pK.  V# )   N)lenstringWidth)ctextfontsizemax_pts   &&&&&r&   truncaterR   ^   s/    
d)a-AMM$d;fDCRyKr)   c                \    V ^8  d   QhR\         P                  R\        R\        R\        /# )r   rM   cx_mmcy_mmpiece)r   Canvasr#   r   )r$   s   "r&   r'   r'   d   s3     L? L?&-- L? L?e L?$L?r)   c           
     f   \        VP                  ;'       g    R4      p\        V\        ^,          ,
          4      p\        \        V\
        ^,          ,           4      ,
          p\        \        4      p\        \
        4      p	V P                  \        4       V P                  WgW^ ^R7       Wy,           p
\        \        4      pW,          p
V P                  \        R4      4       V P                  R4       V P                  WjWh,           V
4       V'       dm   \        \        ^,
          4      p\        \        ^,
          4      pV P                  VWhV,
          ^,          ,           WV,
          ^,          ,           WRRR7       M[V P                  \        4       V P!                  R^4       V P#                  Wh^,          ,           W^,          ,           ^,
          R	4       \        \$        \&        ,           \(        ,           \*        ,           4      p\        \,        4      pV P                  V4       V P                  WjV,
          W^ ^R7       VP.                  '       d   V P1                  4        V P3                  Wo^,          ,           W^,          ,
          4       V P5                  ^Z4       V P                  \        4       V P!                  R^4       V P#                  ^ RVP.                  P7                  4       4       V P9                  4        Wo,           pW,
          p\        \$        4      pV
V,          p
V P                  \        R4      4       V P                  VWV,           V
4       \        ^4      pV^V,          ,
          ^,          pV P                  \        R
4      4       V P;                  VV,           V
V,           VV^V,          ,
          \        ^4      ^ ^R7       V P                  \        R4      4       V P!                  R^4       V P#                  VV,           V^,          ,           V
V,           \        ^4      ,
          R4       V P                  \        4       V P!                  R^4       V P#                  VV,           V^,          ,           V
\        R4      ,           VP<                  R R24       V^V,          ,           V,           pV P                  \        R
4      4       V P;                  VV
V,           VV^V,          ,
          \        ^4      ^ ^R7       V P                  \        R4      4       V P!                  R^4       V P#                  VV^,          ,           V
V,           \        ^4      ,
          R4       V P                  \        4       V P!                  R^4       V P#                  VV^,          ,           V
\        R4      ,           VP>                   R24       \        \&        4      pV
V,          p
V P                  \        R4      4       V P                  VWV,           V
4       VP@                  ;'       g    RP7                  4       p\C        V VRRV\        ^4      ,
          4      pV P                  \        R4      4       V P!                  RR4       V P#                  VV^,          ,           V
V^,          ,           ^,
          V4       \        \(        4      pV
V,          p
V P                  \        R4      4       V P                  VWV,           V
4       VPD                  ;'       g    RP7                  4       p\C        V VR^V\        ^4      ,
          4      pV P                  \        4       V P!                  R^4       V P#                  VV^,          ,           V
V^,          ,           ^,
          V4       \        \*        4      pV
V,          p
V P                  \        R4      4       V P                  VWV,           V
4       VPF                  p\I        V4      ^8:  d   ^M\I        V4      ^8:  d   ^M^pV P                  \        4       V P!                  RV4       V P#                  VV^,          ,           V
V^,          ,           VR,          ,
          V4       \        \J        4      p\        ^4      pV P                  \        R4      4       V PM                  ^^4       V P                  R4       V P                  VV,           VV,           V^V,          ,
          V^V,          ,
          ^^ R7       V PM                  4        V P                  \        R4      4       V P!                  RR4       V P#                  Wh^,          ,           VV^,          ,           ^,
          R4       R# )u   
Dessine une étiquette dont le centre est (cx_mm, cy_mm).
Pas de rotation — contenu lisible directement.
Origine ReportLab = bas-gauche de la page.
r   )strokefillz#eeeeee333333?Tauto)preserveAspectRatiomaskzHelvetica-Boldu   BÉTON SOLUTIONSz#f5f5f5z#999999POIDSg      ?z.3fz Tu   BÉTONz Lr   g      @z#555555gffffff?#ccccccr   z#bbbbbb	Helveticag      @u#   ↓  À PLANTER DANS LE BÉTON  ↓N)'rG   r   r?   ETIQ_WPAGE_HETIQ_HsetFillColorr   rectLOGO_HsetStrokeColorr   setLineWidthline	drawImager   setFontdrawCentredStringSTATS_HCLIENT_HPROJET_HPIECE_HBANDE_Wr   	saveState	translaterotateupperrestoreState	roundRectr   r   r   rR   r   r   rK   BETON_HsetDash)rM   rT   rU   rV   logo_readercolx0y0WHcur_ylhiwihzone_centrale_hbwxrwrshpadswsx2clhtxtprhtxt_projpihrefref_sizebthmargins   &&&&&                          r&   
draw_labelr   d   s    E((55I
6C 
EFQJ	B	"UVaZ'(	(B
6
A
6
A NN5FF21F* FE 
FB	KEXi()NN3FF2bfe$
^
^	Kb&A%"WM)(,6	 	 	; 	
u			"A&	B1HedlQ&68JK 8+h6@AO 
GBNN3FF2&AAFN |||		BAIuq'889		u			"A&	Ar5<<#5#5#78	 
B	
B 
GB	RKEXi()FF2u1fe$
Q%C
qu*	B NN8I&'KKS%#+r2#:r!uQQKONN8I&'II"S2a4be);WENN5II"S2a4CU]]3<Or:RS qu*r/CNN8I&'KKUS["b1S5j"Q%KJNN8I&'II"bd
EBJA$6ANN5II"bd
EBsGO~R5HI X,C	SLEXi()FF2u1fe$!!r
(
(
*C
1c+S"r!u*
=CNN8I&'II$RT	53q5=1#4c: X,C	SLEXi()FF2u1fe$  &&B--/H8%5q"r!u*EHNN5II"RT	53q5=1#4h? W+C	SLEXi()FF2u1fe$
//CX]rs3x1}"HNN5II)RT	53q5=8D=#@#F W+CUFXi()IIaONN3FF2;VQ6\36>!  IIKNN8I&'IIk3qS"s1u*q.=?r)   z/pdfc                $    V ^8  d   QhR\         /# )r   req)r4   )r$   s   "r&   r'   r'      s     0 0&7 0r)   c                   "   V P                   '       g   \        R RR7      h\        P                  ! 4       p\        P
                  ! V\        \        3R7      pRpV P                   ^ ,          P                  '       dR    \        P                  ! V P                   ^ ,          P                  4      p\        \        P                  ! V4      4      p\        \        ,          p\        V P                   4      p\!        ^ We4       EF  pV P                   WwV,            pV P"                  '       d   VP%                  \'        R4      4       VP)                  R4       \!        \        ^,           4       FC  p	VP+                  \-        V	\.        ,          4      ^ \-        V	\.        ,          4      \        4       KE  	  \!        \        ^,           4       FY  p	VP+                  ^ \        \-        V	\0        ,          4      ,
          \        \        \-        V	\0        ,          4      ,
          4       K[  	  \3        V4       FC  w  rV	\        ,          pV	\        ,          p\5        V\6        V,          \8        V,          W4       KE  	  Wu,           V8  g   EK  VP;                  4        EK  	  VP=                  4        VP?                  ^ 4       \A        VRRR	/R
7      #   \         d     ELi ; i5i)i  u   Aucune pièce fournie)status_codedetail)pagesizeNr`   r[   zapplication/pdfzContent-Dispositionzinline; filename=etiquettes.pdf)
media_typeheaders)!r6   r   ioBytesIOr   rW   PAGE_Wrd   r    base64	b64decoder   rF   COLSROWSrK   ranger7   ri   r   rj   rk   r?   rc   re   	enumerater   COL_CENTERS_MMROW_CENTERS_MMshowPagesaveseekr   )r   bufrM   r|   
logo_bytespieces_par_pagetotalpage_idxpage_piecesirV   col_idxrow_idxs   &            r&   generer_pdf_etiquettesr      s    :::4KLL
**,CcVV$45AK
zz!}	))#**Q-*@*@AJ%bjj&<=K TkO

OE!U4jj_*DE===Xi01NN34!8_r!f*~q"QZ.&A %4!8_q&2a&j>1v1v:68 % "+.HA$hG4iGq%g.%g.+ / %-JJL+ 5. FFHHHQK$&(IJ A  		s3   A;K!?AK F4K!	AK!KK!KK!r>   )0__doc__r   r   typingr   r   fastapir   r   fastapi.responsesr   pydanticr   reportlab.pdfgenr   reportlab.lib.unitsr
   reportlab.lib.colorsr   r   r   reportlab.lib.utilsr   routerr   rd   rc   re   r   r   r   r   r   rh   rs   ro   rp   rq   rz   rr   r   r4   r?   rG   rR   r   postr   )r   s   0r&   <module>r      sE  " 
  ! , /  # " 7 7 +	+<.	A 
r	r 
	 /4Dk:k&AG$$k: /4Dk:k&AG$$k: F?W$x/(:WD
#Y #	 #L?` V0 0S ; ;s   2D.D3