feat: extraction OGC et génération de PDFs propres

Pipeline complet pour extraire les données structurées des fiches OGC
scannées (recueil praticien conseil + concertation) et générer des PDFs
propres et lisibles à partir des JSON extraits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-26 10:12:21 +01:00
commit 0c0f62fbf1
41 changed files with 6184 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260318161809+01'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260318161809+01'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
9 0 obj
<<
/Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4640
>>
stream
Gb!SpD0+Gi')nJ0JPT@VP;'o_6*g5VPn[F]P3b_[kAKR6:h1nQ7[>#kb-h9K(*N-6Oe>8qFuhQr)F4me>qR2b!XfPVq="X4s0!ITqIP67^;C3i[.oG2o,(Yid;\X@b:B+7Us,Tm1QK>>HNBlUIL!)1iVfZUciVdX68K/!+@38K%u]#ua<Qfh0n:)7ki1EsIl0WX4,WQ9eF/BPBJ;i\@K1L1)Pb,#\s`4,U]+pd7K)Q:>^Ug@ESMo)j*LAgJf^8*1qT=6rV.U@Hq'$dd$nM9T_a$1;l+s(>O!$3NkI^ANMF:!b`B&q,,+ngG8,%JIRNIPdDaq\*G%Dqm$HK!+ZUP9$!JCt_]93UIBm$pdJXXd7ME0,]%e@RC:@Ipqnr!/hJI>AV;Bj7!=:L+bq`(T)mi2`5$@:@Q_+ntIX#,#%\e[%&q,Foa1Z9k-0YGFD:<%oBe*_/9AkVPE>7@Z/J/WAV_JjNYUbf+<=!&>U"IhW/&(@S;ITugmOoM\;BjDF8PjY@8moJDq-gU)e)V['BDkssN=[=M?D.:B1`a9E"d])5S+V.,X6Za2i6i8O`k@bE\@isP7ap=D?C"?c&%j&LGKQ^YjDhD;H^TNJ+[Pjs#<s1S9b.%^ar,/kU^!]7II`^!33(?c?h!f2hFk2u=2<De^=int.!e,ZNP$AXTdXd)>QVY<]jLQg2ta6j<Qu*;B=8S[/ngVA,Vt@/FWlOtTD"a$*Y#^n:Q3\ek+CKB%R0BCjhkS^_4CNFA"b%T/,NO14L`9!qEqRAL^qbMhC&!PhNtW(qAH-h=.a]WI>X>?$(l1/UhI0kK3Jo.I[qP2?]O-Xh89>>b>eA,$gX]5DnH";J?pGUU?$hAHJ!(Y_P'#_Q[pfODR6[+Y:oe77uQCC9I@]T+I!d!=kB]dZA-3]B0@_P?-k85BP%5FlTu)R1>2G)pdBKF\pZ-G]#+(8fYK17f?#'s/@SuHb:4V"4*r'UcjM:rh7QrA,,+.+`@0bbI4!_f(BN$@;BSV^)^gCYc5p?.]&<'eVXJN_"Z.XH<u-$;)bM:*'u%?O@[-frh(Ma'0a`<j"e<UEdmJraki5I8>!P>J4NcX?2t/c,e:pH#o=.oIj1&bF'JlC:MEDsoljKF<Ah8Sj<mEp?2leQh4Nr(W62/$[Tl:Ntc3Xi=ZKECd$\LM-E&M&::MB&15`kN2:e`e8W)#T'>':K01Yi:OL/DUB%%bZU5#;/7U5N,V2!&'+F.2aCWE:3N,?Baa-.^DWgFh*WBB`n*TWCfMHd%6Ngd)b975,Z9\fCI-*iJk!Bi4e:H!1HJJWYJ)d0\U9c\tV_h7`%gLub#KM%%:f[\-UXP8^:5=hnJimUdjeR\h`Up:INM)^X.sSEc\uV*i'k6&e2bX(MJ%`1e/#_0Cu>a6iSU[F'a2PA1LoII=A%FCGjd"'PI/@*,b+#(#<VPfDEF@SPA%7^-_#=;5me;@#<\UXSjf,rCY"r+g't-&4Xe;'lDn&!N!u/dI"L,$Q9K\/AH9VKILuf"#+;j%a^46LTM63Mr-82RQ'X$r39Q+3$he(J3^<?)YVKbSlu5qIoiOo]%:sbHaN(<D4=RD_M+[b<MJBB-r4QJ@gR_B\r=,TGSSlF,S8Pc6OC(G>kd-,VharRqR5]d^C4SY3-59Qo)n]j>4D-+"u7T`=&h]F`3.n1D70_(jeHU/8Z"E7DKpnEPBGl%#F'bJG;hJT]=k=('pC55R4V3Zal)sk=U]%9%<Cp>`!o>M(74YnOe0..Sr4i8l0fT8l0f6.M/+A2d_/bE"Yj@.VF$adPt>JG'f;eG9AR+5CtrjnabPs`LY&-qi2J:*A?e?.N#!&7g5dg7MVfU7MVf57KISl>X8"88PqaPOE4:VTB9C#4f_&_)35PRIL<K'IMgf>PVPKM6U[^7ZPFFr!"Hh*OJjdF(fT>@)*hI]0PB&UQEVhU30(9F-Xg$%0VKa2*\pTq$3oWT,I<&'6,V4H1[<(E\gePaZA^1E<WrSXn!..?YUX=RJYSHOOf;&T0JLc#<"`48"+tBQUlhl2jKLF#`h?k[3Hc`=!JB7h\2lVs[d%t+mYrX&c@".P@TNQJ*fgB*<h4roQ^p<i;lo3>4_U_2ag*E2@9+m%BCooHK614u2^t3Q(d/4K/(-PaO:%b[H5)?)Qj;q\?S-Q*V_97^rOG[$@ID!hQ9)UIUQJ^H(=BET(%qW7d7H%eK7K?'cdQ'ODD0S?=DSX(!h\#FgYr%^4SX#D3!/9lj5]1>Z[$1`W`[2;0>p!:V>r/p3Aq4l-j_P+BTTV<j4;A^MdiHo]r>,)\6!nr7B1QT9I""e-:`XZgo=cOl9.mp_Z5q&P28(rCnVDRA>`(&'b&B4R.Z=.T;nQ'k8l(MZ/m(^pq8$?*b*B#o)1Z.3@aLH,Q--+8W"sNBFs4tCFr4CMJ6%]0bo6XLXoKM+eI!g]:"`VAlokR)Lp=ABF'_]e3_Di('1ldCFp*0G1KSqbD@G&52X^jj9:4V(-?o'_K.k5e\\[J4("MJhgq7s98FqBn9IRs]H$bh#70sZ-!Qc#4_1rS_(_Z2gLQCC"l4?E%+9*;#h!Zl">XBH)4[U"/oVXJ4GKhoF+TDs?(jAHa7fENGF4ubWIK_i8H$f&p(;q.L5"hNDte[Da]t2Ri6-kZ38-h'24<cCro-+-Rie.<o&=T1F"<,(V<TnX5-/Ln+R6*iX;o.)Cp'+fE(.F]d>>^[$oa].iVFFZL1([a=[gVR;uo3@\a`%F>Mj0m<tR<o=QDtOmkEVNa\3'kpU8;MnFkNf+qB"k5WR-o=Nb$a=BIS4i&DrWC\KiX^)Qb^*]/^c_d;4fnAX$IKA5?)p!CtMH?&&[7\e)M)#h(9%GuH0hjY)9%t<oji<Rh\c[@]F0u'hs+r*OoSP\`/*16]'!nN%FeUI6A*ohPfA)"OMP';4AB#Oc;i^Nb]r?Ha#.VRHh'QF"I#[kX@;F?$1JY(C#B(f'*&GK#"b'PY]<b33bD&Qt)s'NAS%-3GC@;&/.gcgVdMM$Vj/:\UHLac7m:BnMC[GbL\DAn<WCmWs(n:%W%BPh4!@XCQPF*kp0Z@RVA[EW`u1PZ^&:g%m*4XMMP>t&6i7A<ogFE9LqN5%[g\,6+6L(AZ6IW4"DF::AA,>C,OmR='`Kuj3"T;$`GD]b<SrM\cI06'gEb805P?Yc>_)agFk<hgjECP`l!7ITC(5N?MsdU,A/^R`PLD^IW7&G4#Vq0WI3JjF<9(U%#t/nRrF?hJ<LVo/O-g0>5n[EOiR4))9NkD7)7Ht0SNDt<6WB[+$;6I4duCP`idoAT)pH?)19c+bjb\ldasp+,uJ>d1_FZX]]]ell[0[Y_6WA/hXq2<MH@?*gZ@d'MEV>2mN<S&"#q1`O<k#,lW,(Fp?\gUN"cf>I-'#[[TUkJO4noaP^W[cLS+RGIZb1/L_peK5"o[a2,PeQV1ir+[f<j4@;V0>X[30s$Q$\$Ob,g)DtYe[^tdE#c>u<GS#Y=]K__9rCTemoFO[G*=F:o9`m3<jgg.l.nTM*'mOD%W9>I*mj41ReK8\&h[g$Pko7MFREIA$T;!2%F3&,Fa`i+H+3CEe=&tXi<4tdqfUQ;k#dPran6')e%>^LcEl_n#OT(olr8#%PJY\l"$rn`3_@r(:+,/-h?r8t7\QV]$OSog^uX8gZN2I'J/2I1UuhhNkFRta@9/r[dLTBLj>&Cs1M16;6KSF\=6I@-*-9g#'$WZ(TQ;2)^s)CAaIW3)/.QcUMLDGubR@ZDijC[q(3h!Z9`hH+3[Al$aTgQM[.sN0coR'`"pqYsP.t<%m,b@Pr*W%:k@Dn2YG>t)Pn;3"18=WJgmU!5#uT#R!ar+Ads:A@"fG*Q)\+Kk.UJC5mR=WaV_XuJZqd/aLgC`q]Y76-.rrsAgli0@N5-=?T@g?($fNIN\6fp$n(4)"%ZbE[dVT`:XpM7bfP2UD+b8-u8ZeRo0.<t4P8\U\'u`%=&jLB-RRPTL5u]%d$'QOa'qY/oM9@Dh:b[.R66Ce,R'UG8ET6P(hEZJ00l[OJ@Gm7bG7m)*b=?P-fMBa4:?<EJU59sipQQYQ0VtJ6Cd2h^T8-:/o^?e37R!,RYLjDi8&SPkA?SMa"V!8H1P<dmUC'e&cll.O#GRr6bQO'2ct^c]],])@P4+`mokL%6`D&U3ZJI],0Zp(WSM"h4I:DUq)iUfb!;[aLL['^nJ%F?R^<#qo&9p<XT5A'`<d;54(Tm-qRQYrB>Dl.RoRY<=C@kQ-h>[CQdVn>nP^f&"iaO%/OtJ8cT2bdVhnRd5n*T2if%\NkoW\>)QFCM7\A1X<L,V,-643;h_OIf6f5hoFjX8):X*naE8P]6fRu*e$X,6eLTtJ86qQ];Q6+dQtGj<Qs(8[)]&Roc).MMs5p\-Pjj#NMtGmVY'B'@jojg6tL9)JT.Cng/`@osd?jjW9/%mu&CN:/0!`eN.PV_Z"k(urLcqRG:_Uu)hegC7b5_(Nh1/O^Q]89@D2a&Lpp#s>f`^IIJPI@9goLg*3bO8G+^+AdCe57nB8PC1X4f#o\l',B-RebVJ_Y/Hf/Z;E?/'3Atl@aPjI7cc-rU(oDb['/(Sp<1<qS0#8qm8Gk-O&!@=nnYPRT-sI+OR0GJRQX+i[EXf`AsoNh,7%!:]</U-F*3.U['B%<b5$Tpr=?&d.b=~>endstream
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1450
>>
stream
Gb!#[9lo&I&A@C2m*0RkVX_Ju+#;m1Br[16-]ZW=/dMd*n;s;0OG\O:(Ec.<(8\t;FJbh<"`bE;[r:.*&-[Y-lMd[b_!b43pk&WZ0V&==4WgQ1n:!Fp5,+SqpH@r"IL&d`H@aC&c9jC-k%ZWf#db,"@1!Fa+E?qMNCGr&!_,/<V\tGsmlt-nJ!aP:-he^6?8.a$(;X"YBF:_STdg@O"3$3(1m=oeOI!J\Aj#^,fi4k'I=g^%E5!8+&V%gH&F,X.4<i:L*d3?an*k`JS&FGs;i5B`la1)J,AIOO%Zb2J=i\>Q"lU8V0YU#&"Bt#9E>TaJ('M=g:Dn?V*8'ckR?tYg,Tn.&_W3!S(3^6s'_MsJ5b*(T.lQ.G:4Sr]d"ARA::II"'9@g*1K;X1(fQU5-/8ipMmR@O;6*T!FaWuU$S4^Mq2(A./\^>h(hlnQI3MCF7UpQs0<7FVN;E``79-BFQah,ah'7e,@'tu%A'tMBG.ai>XFLm$5Z)-.Y1=)(Tk_YD)@a:-kERksRGnTg^]l!@*(Li+/MjZ9MkYZ#lG?3#XoWNVAO7>o5\p0H@58])KH+NGSBBh1eo;([^cVl"fkpj:p>Asm!P9m5Pd"k`8*i5^(:l=n&M,H/;md<"bf2T6Au@O5[g5mgpE.tCqbbF?63D@DF-LQ&C7:kcM<q2WE7#7Cct>7cpj+k\F`;7_%@'aHc\!e'KJpn+3O)i3]]He)8C-kf%+7YN<&Kj7pR/FH"o:I+h;ZdS`%r?"rZZGbWg-:pXqj`c"KrJ,k[;QQ5`<#0$@.msMDZ3SbaXo@XJA>&$Y;@n5*a4&XhDLklDRl8j$`=l?K]0B/9oku?fCWL]<S3W-=;R6A83>C7".;04/W5)k#?J1/VI0%%8`9-;fYfRG_8>'`K9a2/r#V:[F>tFJUT2?^=F=.D<C_PX^l"S#/(\]Oh!ihW6/_/hiD>G/o1i:>="$L)K/hW,`1Qs<FIfZ4:cKu72/Y]G3cWe9!HaZ"Ph_SG&c&ug=@;[]l&&UUsnJn?J4S.#OgNc<<K;AJ[=s=>c_Ph!KA&%l^O/A!aG*t=/cqgcKo<OVPP2B<FXL_TA!=4$#aqn3Rf2kRK&b(#'TaUnF*@2F!!T)]E!D>1l`dj"U$s]Jf%9gI*1E+1Q_"uAEPi'phb<CL\Z>]C^EJsiFs,M4QOA0oa\1:<lDq7,!R-[<j;8)ihdsMOu?BBadW[VcMYS8A&olJ%Z#W0E+H%oGfAVY!e9U&_]F.32c+>LrL6:k;KhQ.Vm5-FlV2/PPs',+1JVL][gLnp5)eJG<ur%V%0QWIbIbWBE8<h(gMe.t$%&Oe`/IL,e.]OQE)6+<)Jto>LYg7-W27J%qhNIE\>,uA"U>2K,Y@Ioh[4D9^%NrG+D\S4])CNXeSF:'9^_m-"Zf1oO:X)=fcJ*OLR@cFYPur-XtRgPh#<,&aU=PFoFDUSMYm~>endstream
endobj
xref
0 12
0000000000 65535 f
0000000061 00000 n
0000000112 00000 n
0000000219 00000 n
0000000331 00000 n
0000000446 00000 n
0000000650 00000 n
0000000854 00000 n
0000000922 00000 n
0000001202 00000 n
0000001267 00000 n
0000005999 00000 n
trailer
<<
/ID
[<3c290bc81da600d7dd51c800080efdb5><3c290bc81da600d7dd51c800080efdb5>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Root 7 0 R
/Size 12
>>
startxref
7541
%%EOF