From 9a9800e17e2cdda64e98c432924d1268129ccb87 Mon Sep 17 00:00:00 2001 From: Thomas Reitz Date: Mon, 9 Mar 2026 20:11:40 +0100 Subject: [PATCH] feat: use PNG contact icons in PDF export instead of vector drawing - Add Phone.png, Mobile.png, Mail.png, Address.png icon assets - Replace hand-drawn vector icons with professional PNG icons - Icons stored in packages/core-service/assets/icons/ (included in Docker build) - Also stored in templates/cv/default/ and Icons/ for reference Co-Authored-By: Claude Opus 4.6 --- Icons/Address.png | Bin 0 -> 2514 bytes Icons/Mail.png | Bin 0 -> 1338 bytes Icons/Mobile.png | Bin 0 -> 750 bytes Icons/Phone.png | Bin 0 -> 2337 bytes .../core-service/assets/icons/Address.png | Bin 0 -> 2514 bytes packages/core-service/assets/icons/Mail.png | Bin 0 -> 1338 bytes packages/core-service/assets/icons/Mobile.png | Bin 0 -> 750 bytes packages/core-service/assets/icons/Phone.png | Bin 0 -> 2337 bytes .../expert-profile/profile-export.service.ts | 105 +++++------------- templates/cv/default/Address.png | Bin 0 -> 2514 bytes templates/cv/default/Mail.png | Bin 0 -> 1338 bytes templates/cv/default/Mobile.png | Bin 0 -> 750 bytes templates/cv/default/Phone.png | Bin 0 -> 2337 bytes 13 files changed, 30 insertions(+), 75 deletions(-) create mode 100644 Icons/Address.png create mode 100644 Icons/Mail.png create mode 100644 Icons/Mobile.png create mode 100644 Icons/Phone.png create mode 100644 packages/core-service/assets/icons/Address.png create mode 100644 packages/core-service/assets/icons/Mail.png create mode 100644 packages/core-service/assets/icons/Mobile.png create mode 100644 packages/core-service/assets/icons/Phone.png create mode 100644 templates/cv/default/Address.png create mode 100644 templates/cv/default/Mail.png create mode 100644 templates/cv/default/Mobile.png create mode 100644 templates/cv/default/Phone.png diff --git a/Icons/Address.png b/Icons/Address.png new file mode 100644 index 0000000000000000000000000000000000000000..70bf4e9b324a5c9931bf364e1a284c17ccd55ae0 GIT binary patch literal 2514 zcmV;@2`%=CP)(t|ratgw(I z+k?Q_Ak;tY7hsGlqx~zGJ?~SU9+%tTN{3t{dY5^)U}n7dP_hwl%PWHS(W z7D#-3jHh}72wVkJp0-$^+liQyXuHek;=BG%ZcD)%|ce3?zF)S3;_jLE_sj7Ge!Z zbulE#j?V8(G>Nvv|FpRGI*{te&{ZNz;#DmtBgR>fB->QZ$E*e0f>aj{FF+A5S7=^q zjU?F$1m4&}WGn)aezpTV?G92cZXv>M&^*_8G43qTblw4hr+1n?5cm_#i^<;|^;?uo zlQMS(S=BLq8GJ!BxIaj>s>M#Jk@zY+Gw>fB5mDn2VM0AouqX?lKH5~lVpO3)xdPcU zMT;WS84xr`r{`J>i76jdOxB%c9^Z?WB; zKrrzP?m{PbNazqan>}Q2gb`0M8DG;D-&EB|lI=jKS94>F@FMUYW~A?8_xDIA>%fx0 z`$6K$%;ll4l_1s9>~HC0=l7LrfIVz0!21|Dk7qbD0GoYTl7o7>Wjw<)Kv(J{2UlvU z4uIkN`7u_o@XjFdN;V-&+|X5%Mh#?*by47{KiSg>FGAhIXwL_4L75%-!~EFtG}X6t zh}Cv6Myje&jE~`Ip7_1dS{NwGwf-lGmIzO zW-&hI?ZN_j)13L~1TF;cAk<@Q&{OOPHTw!w+r`fPQDiTbIotBI{tDhf;EQY$zhFlv zoopQ7E>zZmWG~~O7wJJI)bNoz-&>=O}6(T%^Ey#UVbY@<)wXuu61J`7dWD6@gLOqk;X%166$xg{X*-u;1 zp*-R|oekg}cute8Q7F`q6FNm8TKS0_vZS*;+aYg*ci=``G`O1;9m(>2UB(=UmWzqZ z5+Ft{?5p4%xT+fCSFGqr{1;OWzT}L@XmCHaAS<0{f?m4e1wO#EqwiVKk!mTUbFwoY zr8?Egp&sKgPUuvMtjKZ%lZ|tnsJ#Mj^iJ(1uR;EyxgNZOR52UuZ>{LW_;n@@NS*$o z1O6r%!KG;MtCqB`V`H5S-XX^0-8k@?eZ!$xw}CE+H#3?~Idl^p4c>uV6Zt25optC` zq|@1e$<1+rHE)!RVA4CziWb>dye!Vk6enGBz-$O>A5^n%xWJRU-)Gr*dJXscgC$EA zM)LJKcnco5iSR^gTK&nMI+$cU+3F^}8^^U{xtJQZ8EhS&1YI$lJ3sD+fa*YgUy5GT zIHF}JmNX{vO_6Ou7C2q>IrCR79wqc^85U^e#zzI-BE}!EiTihHno;9hEh}axa%G-` zBTMlzW69<^V=+&=+yYk$T@TKlOc&(`{UpBBvJwmOAoM4nFU^NkhZ~9uIU2nNcb}ID zy>d|4bwWK*@F}g1yMke~s@uSO2#nao+~xir=|S4cCYOcIPE(5`lTnT_ER2o}@{fm_d1 z_7(~vJkfAYQi*iXFq0oVj6b)4=|2mH_wg6<;QAme+^BJs=`pTD6K0abrcw1f@EwBu zWI3LfLTx}PL3vH(gHlnusxigPtR#3!etNPpNJyCc`TmlfnlycK-F z44uHRqVi~`cPJ`(_91ga;Mr{VZq#|k^@q;geZ-X09c(O_Wy`E)JY5G}1Fgxh09J&j zb&MaWE@NVp-0gcnSHWm=q}D+HWjnN;4^k@3EXNeO4wSfNG{46y+s+3y+s~`wFYC@i zT?vXUm}>CX+ID}D{;0r#I32nc)ErZ)XW0|_P+Q(akX7Wq#1`b9%J1tvs5sPAgJ-tk zzP~XXo|HY`gO=mBvdI~$G-i^OIc#JP!KIbmFF25skvCr!RBBv-ZIb!a@(J7IJ)n0| z^)P1h{TT@m=Tl2_L$y@Lu-hu5)UjQAWIeiE(bxuW?4db{NnvfXTnF zL#RKy3zDhF+3t9yBgSY@5a}-~d0z)v-&|CQ#`m4@TyHcf)BLW2H}mXUvQCkgMqlfc z?OH>mpEI>C^_W!(Cy698>t$6KubS`)f?o7!XkGIx=qxni9JR_IX(vSCWKJ#7ZM$ax zmhZEU&#^^Wt^3T6uT}Yf*;({RkR=h`6_E-fUa@r4CYzZx&N}w!cSucYEAO>MjI#>P zlesPbpNu{J|I~7$2d8oP+f6&7Aa+sss@IY|S9)ksT4of_;9EKSgc@)1C?q)&yEXz? zHKdwi_@byLp56_mYXQ~sY%$)oZsXU(I3XIpC^%2rgl4-JQ(j#;vo>tRlxJQmy(8VkI|k3MubLF^_r7Ygbo)-Fwfu=X{SpzQ4XdzVEu1hYJj{3jzQDjOgm*v+3bK zsJv}cqla(#ZW=h+l|%&ql^s8*0Nml~0KgUr(aF*GB6pe-nT~YUZ1^5|klKPSDh?B; z8*PK?Wbb%G=Yy6Vot)xcgcy#Ay35Lj)7GO6{WY95T9d&_sH@o+O|21KFV9x)67=ES z%0)?Y%f0|C27~GJ`?8+o_1N%KS=nTO)X(;JlN-hVhOYw4H;0}h(snpniZ>Y?eF@y@ zkl}N~yx}QDctt|$76!zWqt4Q^9O?H<%zHK;evT`Q1>t>kl2qFVchPegp z6Bgq@Bt zWDgEjg=}lMunq=C>4yqZvajeL?U~~D7N|U;^f1qY5EhtE-|W>}qxQ~VRSMXnzUtp4 z?7F1nlEUN?)y8(q`3zp-?PQkjxsCF}a9yie)nVFatOFx-8pV#e*SU*~l3J(TR8xn| ze31aO;#uNr zVy~aC`x(<>>+tkF{h8!B^JD+|fr+3qE8xItt3NY^Q`c7D%kgm9NU2`;H`G9lGD&*D zOfeXHMilb=?V&|h95woobLPDH*2W0zm5?F4^^q9B6?fj>dfZGM!mwzX zKKL`b!lHH2=$;MiVDP(N+L{;7tc-JQW>;%G%KPaR_*KGtwG1m zoWz~%Smmq{_iR{Alnx$QF$#n?8yu1Q|9Ux^qj7o^D;60iY_DLB3r!laGqKJFQ(uo= zki;%1p)X-~i({#Cc)Q-M8Oy^C3#m}VY<%AvKM&Uhu7h02qggnLBN16_PioCmCporw zO{#p|2i*8L?zj%At)2KH7+L#{yr&mj zZMHU=FphXtkjgX_GH*&KxN06Pi>?)spunovu)D9#(tuHJU*_4eLg>Uwye^;4l+pUf z*5m?f{GIR9xlCQ6XV+Ua~ph%nd@p1RN%fnH$eNs z{mPZhrXusUYpt9;^U{{g%UN#&F6~?*?YVwZ%$us*ZN{GLO!@AYmM+=OWPW%49=6x5 zOJ+9kKQ3>Sev=;;zNNh=^1-sIC#E&Q2I+49XYHE$#re{@SGnPrCN9~1ZqLLm`UlS0 zS4b3Jz3+6XHa(tm!)?8+A77Tf*|9mEd&6_RRgbb?#m_GPwotY1??a1c({K5E`o~*z zT%R=UZT|o5`_F6>-6HdmJ2Ub?eA;cUDyfeS|3p4azqzgHnzG!9WXAfLp%tlfMLsC= ze|;*xU-R-pKAxf-^5Rbl?DbAOtc#g&`0oyd_TPn$eBU28$-FzxYI&!hdsG2(IQ);F z{qJDy#=9kf?x$`RrtcR^NRPcTcS-B3e8rawH_zwV!0eeHd!zRE7vA+PS+mWf{~MT1 z`o?neD0_SIt*t^C#-8D|cDarTyZYVZTL-;=K|o7=df{o;Jh)!(|GEbP0l+XkK_DyU< literal 0 HcmV?d00001 diff --git a/Icons/Phone.png b/Icons/Phone.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5ad075c2bcf63184d3fb97bc33af4a981236db GIT binary patch literal 2337 zcmV++3EuXJP)TX%3lBsE6XPGe#VGNgM)Amc1W=HO zCny5WPSq^syy}HTVhoaKNPt9)2Z$Q*LN3987vlB9hzcl*0xFj%umWpd_3pA=RlU32 z)4elOQ(scQW~Qp9U)8(cYeF0x92^`R92^`<9h@IWn4pBgmxMtBVWN>Rv4&8XKsZ09 z*xRct}}hL9P}m>*6I%&b`uJ9go$1x!_Ov6EKok*DL->a5ViTs2!qWAIk8@T)*2`` z7;I6#x5BZmq(Hp^gu%ZCRy3c~jPGXr4HH9k;&~$z+f&7YiD87nUIQ_vO5xrXsCXwx z5b+PG;pcYR-mL?kaw_&I@&GlfCp+}}FxFK)`{2~~ZXL2P$Uuw+LSaaxdGPz{?aINU zsqNcJFwswHPO2uAgX?3>XJTDBI4|*iTL~u4(zGcm_7Ljb5PMGQoldCOs<5tQPU~t9 z_<)edYcj*DCWXSpx|n#l;CZcv`Jv^Kn_pvHe@jEsAp}f(q-jK?u`0p&&mdH6R|vi! z(KW0BgB^+?cX8rtP#A8wg~JkG#|o&L)riT5C%;Hz6`}CHBB!y;%a%v6MWG^;$SijBc5 z7SOu>Ae?tkZOyU+1*V+XDe1>o#4hC!Je%s8Wd$a#RrvbqPFV8^<(6zpea*4~=Z8sS zEqF_Mrn+Xf?j(gE`UvC!)0~bDntLM{ z2dT|plFC|{`eQZEat=nNvQ}Ax!eZsrPD^Q>i3+>gE{Wuz01Y%XpoA%-$y@8YQ}Zla zr)@F#O?g;j5?zCdS;{S3Pewg`WTIu(9hDuP6r9D6>L5lsB7u)^08 z-Lv(ekWmQIK(cjxl5t+bZc@X~Nqo;%1EYpm5f#*k7Dx6sp<7)G5yNw-?b~Wl?>3F^ zQ@A%WVX>krILA+}>@6-Z(>=)h|B4*q&E~Ju)Lja%rnYCRVTyxO@p|NWC`{6BTh95f z;(>|B4RP?Hk>(ga^-#j#V_i|mUz6Ittp%15F!)q?m^&hCN|-;4EKg^FeNx-IwWt|? zzRtR2xmw%BJEm|kCULXCJZoi9sY66Cale6e)hCimOvUGf^P^MQx7DCxuEM(ZlN{Vs za7={Bx!#tt#vx*I0u{d~r+aJU@@I}E5aLb4jhp34-=YFD8&x@gJx`*>HAYYBLa6w} zK$I7p7dVlWP?!_hwUUwX^;HIV0%B~$%JQO-4wsHx<2Go z&u*zT!QNbW%ENEKMnWMgwK3?fC zsRJ`@j2&71$R;*tv*xDgML~@+aV~E7*7p<#yF=)=0^5i5i!?80)iALngecp5*QM%94QZF<2UM`>??2zVg2<8QCvhw^J}aUx-G7w+y3@NkiH)`A75?Q!Qgb zyYi{z!KGWoWYMoJ*_N_0-#Jva>>xD%KzZMmn(^Jth8t{_MqNpwv5GM9pjP{G;6N=- ztr1+OIV7pUOYGYWcac(NyA&3N+?LfwTc^BS_b|g~KQIBM%LZf|Xt<$z8HY#88;w=Q z$fHk~+43fpw%=}%a>KtTR)C4Yh87&Y23E>%?U7kH%Iz-Mn;j>cg&O={(gW)aAf*W3 zUJ1%TtB^sVDZUAjEA_F$!f8VFLSyc-br?IbtJbvUfO@&2WNP01{IuqmY*s)WC6$`Y z9|hm)Ki0+os-2d#(c--Qr*?>-AF0|S?p*E^FkbbSX4T+ z^E4Z&rt4Jz_-XVdZ95*2wB$rDVH>Z8XSa3XGR`RuL>3 zf}Ed7DjL--A=jOuYzz|^lIo0y$idCpdmeq8sdSCjBDuxqhp;gJfgxcEZR|t1S8 zdA+NVY(9NYXZ{Y|&T9GE3{;!3^c!s&jLBnpo;igTWys)S|HX2SN{%z8 zAjKKzG|a;7#r|8CG>aAkWr$UK=Wj;`Y)tjFP!)>|Ka)`JG5=K^p$4WpmfDerRSq{N zoA2M$LG?vH(-EtIF-Rum&xd{&Zd-y)4h{|u4h{|u#8UhZsT7MmR0;cB00000NkvXX Hu0mjfY`SH5 literal 0 HcmV?d00001 diff --git a/packages/core-service/assets/icons/Address.png b/packages/core-service/assets/icons/Address.png new file mode 100644 index 0000000000000000000000000000000000000000..70bf4e9b324a5c9931bf364e1a284c17ccd55ae0 GIT binary patch literal 2514 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 literal 0 HcmV?d00001 diff --git a/packages/core-service/assets/icons/Phone.png b/packages/core-service/assets/icons/Phone.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5ad075c2bcf63184d3fb97bc33af4a981236db GIT binary patch literal 2337 zcmV++3EuXJP)TX%3lBsE6XPGe#VGNgM)Amc1W=HO zCny5WPSq^syy}HTVhoaKNPt9)2Z$Q*LN3987vlB9hzcl*0xFj%umWpd_3pA=RlU32 z)4elOQ(scQW~Qp9U)8(cYeF0x92^`R92^`<9h@IWn4pBgmxMtBVWN>Rv4&8XKsZ09 z*xRct}}hL9P}m>*6I%&b`uJ9go$1x!_Ov6EKok*DL->a5ViTs2!qWAIk8@T)*2`` z7;I6#x5BZmq(Hp^gu%ZCRy3c~jPGXr4HH9k;&~$z+f&7YiD87nUIQ_vO5xrXsCXwx z5b+PG;pcYR-mL?kaw_&I@&GlfCp+}}FxFK)`{2~~ZXL2P$Uuw+LSaaxdGPz{?aINU zsqNcJFwswHPO2uAgX?3>XJTDBI4|*iTL~u4(zGcm_7Ljb5PMGQoldCOs<5tQPU~t9 z_<)edYcj*DCWXSpx|n#l;CZcv`Jv^Kn_pvHe@jEsAp}f(q-jK?u`0p&&mdH6R|vi! z(KW0BgB^+?cX8rtP#A8wg~JkG#|o&L)riT5C%;Hz6`}CHBB!y;%a%v6MWG^;$SijBc5 z7SOu>Ae?tkZOyU+1*V+XDe1>o#4hC!Je%s8Wd$a#RrvbqPFV8^<(6zpea*4~=Z8sS zEqF_Mrn+Xf?j(gE`UvC!)0~bDntLM{ z2dT|plFC|{`eQZEat=nNvQ}Ax!eZsrPD^Q>i3+>gE{Wuz01Y%XpoA%-$y@8YQ}Zla zr)@F#O?g;j5?zCdS;{S3Pewg`WTIu(9hDuP6r9D6>L5lsB7u)^08 z-Lv(ekWmQIK(cjxl5t+bZc@X~Nqo;%1EYpm5f#*k7Dx6sp<7)G5yNw-?b~Wl?>3F^ zQ@A%WVX>krILA+}>@6-Z(>=)h|B4*q&E~Ju)Lja%rnYCRVTyxO@p|NWC`{6BTh95f z;(>|B4RP?Hk>(ga^-#j#V_i|mUz6Ittp%15F!)q?m^&hCN|-;4EKg^FeNx-IwWt|? zzRtR2xmw%BJEm|kCULXCJZoi9sY66Cale6e)hCimOvUGf^P^MQx7DCxuEM(ZlN{Vs za7={Bx!#tt#vx*I0u{d~r+aJU@@I}E5aLb4jhp34-=YFD8&x@gJx`*>HAYYBLa6w} zK$I7p7dVlWP?!_hwUUwX^;HIV0%B~$%JQO-4wsHx<2Go z&u*zT!QNbW%ENEKMnWMgwK3?fC zsRJ`@j2&71$R;*tv*xDgML~@+aV~E7*7p<#yF=)=0^5i5i!?80)iALngecp5*QM%94QZF<2UM`>??2zVg2<8QCvhw^J}aUx-G7w+y3@NkiH)`A75?Q!Qgb zyYi{z!KGWoWYMoJ*_N_0-#Jva>>xD%KzZMmn(^Jth8t{_MqNpwv5GM9pjP{G;6N=- ztr1+OIV7pUOYGYWcac(NyA&3N+?LfwTc^BS_b|g~KQIBM%LZf|Xt<$z8HY#88;w=Q z$fHk~+43fpw%=}%a>KtTR)C4Yh87&Y23E>%?U7kH%Iz-Mn;j>cg&O={(gW)aAf*W3 zUJ1%TtB^sVDZUAjEA_F$!f8VFLSyc-br?IbtJbvUfO@&2WNP01{IuqmY*s)WC6$`Y z9|hm)Ki0+os-2d#(c--Qr*?>-AF0|S?p*E^FkbbSX4T+ z^E4Z&rt4Jz_-XVdZ95*2wB$rDVH>Z8XSa3XGR`RuL>3 zf}Ed7DjL--A=jOuYzz|^lIo0y$idCpdmeq8sdSCjBDuxqhp;gJfgxcEZR|t1S8 zdA+NVY(9NYXZ{Y|&T9GE3{;!3^c!s&jLBnpo;igTWys)S|HX2SN{%z8 zAjKKzG|a;7#r|8CG>aAkWr$UK=Wj;`Y)tjFP!)>|Ka)`JG5=K^p$4WpmfDerRSq{N zoA2M$LG?vH(-EtIF-Rum&xd{&Zd-y)4h{|u4h{|u#8UhZsT7MmR0;cB00000NkvXX Hu0mjfY`SH5 literal 0 HcmV?d00001 diff --git a/packages/core-service/src/core/expert-profile/profile-export.service.ts b/packages/core-service/src/core/expert-profile/profile-export.service.ts index 7aa8652..a245302 100644 --- a/packages/core-service/src/core/expert-profile/profile-export.service.ts +++ b/packages/core-service/src/core/expert-profile/profile-export.service.ts @@ -1,6 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; import { ExpertProfileService } from './expert-profile.service'; import PDFDocument from 'pdfkit'; +import * as fs from 'fs'; +import * as path from 'path'; import { Document, Packer, @@ -95,8 +97,24 @@ function lightenColor(hex: string, factor: number): string { export class ProfileExportService { private readonly logger = new Logger(ProfileExportService.name); + // Pfad zu den Icon-Assets (relativ zum Working Directory /app im Container) + private readonly iconsDir = path.resolve(process.cwd(), 'assets', 'icons'); + constructor(private readonly expertProfileService: ExpertProfileService) {} + private loadIcon(name: string): Buffer | null { + try { + const iconPath = path.join(this.iconsDir, name); + if (fs.existsSync(iconPath)) { + return fs.readFileSync(iconPath); + } + this.logger.warn(`Icon nicht gefunden: ${iconPath}`); + } catch (err) { + this.logger.warn(`Icon konnte nicht geladen werden: ${name}`, err); + } + return null; + } + // ============================================================ // PDF Export // ============================================================ @@ -173,21 +191,28 @@ export class ProfileExportService { // --- KONTAKT --- yLeft = this.pdfSectionTitle(doc, 'KONTAKT', leftColX, yLeft, leftColWidth, accentColor); - const iconTextOffset = 18; // Abstand Icon → Text + // Icons laden + const phoneIcon = this.loadIcon('Phone.png'); + const mobileIcon = this.loadIcon('Mobile.png'); + const mailIcon = this.loadIcon('Mail.png'); + const addressIcon = this.loadIcon('Address.png'); + const iconSize = 12; + const iconTextOffset = 20; // Abstand Icon → Text + if (data.phone) { - this.drawHandsetIcon(doc, leftColX + 1, yLeft, accentColor); + if (phoneIcon) doc.image(phoneIcon, leftColX, yLeft - 1, { width: iconSize, height: iconSize }); yLeft = this.pdfContactText(doc, data.phone, leftColX + iconTextOffset, yLeft, leftColWidth - iconTextOffset); } if (data.mobile) { - this.drawMobileIcon(doc, leftColX + 1, yLeft, accentColor); + if (mobileIcon) doc.image(mobileIcon, leftColX + 1, yLeft - 1, { width: iconSize, height: iconSize }); yLeft = this.pdfContactText(doc, data.mobile, leftColX + iconTextOffset, yLeft, leftColWidth - iconTextOffset); } if (data.email) { - this.drawEmailIcon(doc, leftColX, yLeft + 1, accentColor); + if (mailIcon) doc.image(mailIcon, leftColX, yLeft - 1, { width: iconSize, height: iconSize }); yLeft = this.pdfContactText(doc, data.email, leftColX + iconTextOffset, yLeft, leftColWidth - iconTextOffset); } if (data.street || data.city) { - this.drawLocationIcon(doc, leftColX, yLeft, accentColor); + if (addressIcon) doc.image(addressIcon, leftColX + 1, yLeft - 2, { width: iconSize, height: iconSize + 2 }); const line1 = data.street || ''; const line2 = [data.postalCode, data.city].filter(Boolean).join(' '); const addressText = [line1, line2].filter(Boolean).join('\n'); @@ -729,76 +754,6 @@ export class ProfileExportService { return y + Math.max(textHeight, 10) + 3; } - // --- Vektor-Icons für Kontakt --- - - private drawHandsetIcon(doc: PDFKit.PDFDocument, x: number, y: number, color: string): void { - doc.save(); - // Klassischer Telefonhörer als zusammenhängende Silhouette - // Ohrmuschel + Sprechmuschel als Blöcke, Griff als gefüllter Bogen - - // Ohrmuschel (oben) - doc.roundedRect(x, y, 10, 3.5, 1.5).fill(color); - - // Sprechmuschel (unten) - doc.roundedRect(x, y + 7.5, 10, 3.5, 1.5).fill(color); - - // Griff: gefüllte Bogenform (Crescent) — verbindet nahtlos - // Äußerer Bogen (weit nach links) - doc.moveTo(x + 4, y + 3) - .bezierCurveTo(x - 2, y + 4, x - 2, y + 7, x + 4, y + 8) - // Innerer Bogen (zurück, näher zur Mitte) - .bezierCurveTo(x + 1.5, y + 6.5, x + 1.5, y + 4.5, x + 4, y + 3) - .fill(color); - - doc.restore(); - } - - private drawMobileIcon(doc: PDFKit.PDFDocument, x: number, y: number, color: string): void { - doc.save(); - // Smartphone-Icon: abgerundetes Rechteck mit Display und Home-Button - const w = 7; - const h = 10; - doc.roundedRect(x, y - 1, w, h, 1.5).strokeColor(color).lineWidth(1).stroke(); - // Display-Bereich (inneres Rechteck) - doc.rect(x + 1.2, y + 1, w - 2.4, h - 4.5).fill(color); - // Home-Button (kleiner Kreis unten) - doc.circle(x + w / 2, y + h - 2, 0.8).fill(color); - doc.restore(); - } - - private drawEmailIcon(doc: PDFKit.PDFDocument, x: number, y: number, color: string): void { - doc.save(); - const w = 11; - const h = 8; - // Briefumschlag-Körper - doc.rect(x, y, w, h).strokeColor(color).lineWidth(0.8).stroke(); - // Klappen-Linien (V-Form von oben + Ecken unten) - doc.moveTo(x, y).lineTo(x + w / 2, y + h * 0.55).lineTo(x + w, y) - .strokeColor(color).lineWidth(0.8).stroke(); - doc.restore(); - } - - private drawLocationIcon(doc: PDFKit.PDFDocument, x: number, y: number, color: string): void { - doc.save(); - // Map-Pin als Tropfenform mit Bezier-Kurven - const cx = x + 5; // Mittelpunkt X - const top = y - 1; // Oberkante - const r = 4; // Radius des Kopfes - const tip = y + 11; // Spitze des Pins - - // Tropfenform: Start oben, links herum, Spitze unten, rechts hoch - doc.moveTo(cx, top) - .bezierCurveTo(cx - r * 1.1, top, cx - r, top + r * 0.6, cx - r, top + r) - .bezierCurveTo(cx - r, top + r * 1.8, cx - r * 0.3, tip - 2, cx, tip) - .bezierCurveTo(cx + r * 0.3, tip - 2, cx + r, top + r * 1.8, cx + r, top + r) - .bezierCurveTo(cx + r, top + r * 0.6, cx + r * 1.1, top, cx, top) - .fill(color); - - // Innerer Kreis (weiß) für Pin-Look - doc.circle(cx, top + r, 1.5).fill('#ffffff'); - doc.restore(); - } - // ============================================================ // DOCX-Hilfsfunktionen // ============================================================ diff --git a/templates/cv/default/Address.png b/templates/cv/default/Address.png new file mode 100644 index 0000000000000000000000000000000000000000..70bf4e9b324a5c9931bf364e1a284c17ccd55ae0 GIT binary patch literal 2514 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 literal 0 HcmV?d00001 diff --git a/templates/cv/default/Phone.png b/templates/cv/default/Phone.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5ad075c2bcf63184d3fb97bc33af4a981236db GIT binary patch literal 2337 zcmV++3EuXJP)TX%3lBsE6XPGe#VGNgM)Amc1W=HO zCny5WPSq^syy}HTVhoaKNPt9)2Z$Q*LN3987vlB9hzcl*0xFj%umWpd_3pA=RlU32 z)4elOQ(scQW~Qp9U)8(cYeF0x92^`R92^`<9h@IWn4pBgmxMtBVWN>Rv4&8XKsZ09 z*xRct}}hL9P}m>*6I%&b`uJ9go$1x!_Ov6EKok*DL->a5ViTs2!qWAIk8@T)*2`` z7;I6#x5BZmq(Hp^gu%ZCRy3c~jPGXr4HH9k;&~$z+f&7YiD87nUIQ_vO5xrXsCXwx z5b+PG;pcYR-mL?kaw_&I@&GlfCp+}}FxFK)`{2~~ZXL2P$Uuw+LSaaxdGPz{?aINU zsqNcJFwswHPO2uAgX?3>XJTDBI4|*iTL~u4(zGcm_7Ljb5PMGQoldCOs<5tQPU~t9 z_<)edYcj*DCWXSpx|n#l;CZcv`Jv^Kn_pvHe@jEsAp}f(q-jK?u`0p&&mdH6R|vi! z(KW0BgB^+?cX8rtP#A8wg~JkG#|o&L)riT5C%;Hz6`}CHBB!y;%a%v6MWG^;$SijBc5 z7SOu>Ae?tkZOyU+1*V+XDe1>o#4hC!Je%s8Wd$a#RrvbqPFV8^<(6zpea*4~=Z8sS zEqF_Mrn+Xf?j(gE`UvC!)0~bDntLM{ z2dT|plFC|{`eQZEat=nNvQ}Ax!eZsrPD^Q>i3+>gE{Wuz01Y%XpoA%-$y@8YQ}Zla zr)@F#O?g;j5?zCdS;{S3Pewg`WTIu(9hDuP6r9D6>L5lsB7u)^08 z-Lv(ekWmQIK(cjxl5t+bZc@X~Nqo;%1EYpm5f#*k7Dx6sp<7)G5yNw-?b~Wl?>3F^ zQ@A%WVX>krILA+}>@6-Z(>=)h|B4*q&E~Ju)Lja%rnYCRVTyxO@p|NWC`{6BTh95f z;(>|B4RP?Hk>(ga^-#j#V_i|mUz6Ittp%15F!)q?m^&hCN|-;4EKg^FeNx-IwWt|? zzRtR2xmw%BJEm|kCULXCJZoi9sY66Cale6e)hCimOvUGf^P^MQx7DCxuEM(ZlN{Vs za7={Bx!#tt#vx*I0u{d~r+aJU@@I}E5aLb4jhp34-=YFD8&x@gJx`*>HAYYBLa6w} zK$I7p7dVlWP?!_hwUUwX^;HIV0%B~$%JQO-4wsHx<2Go z&u*zT!QNbW%ENEKMnWMgwK3?fC zsRJ`@j2&71$R;*tv*xDgML~@+aV~E7*7p<#yF=)=0^5i5i!?80)iALngecp5*QM%94QZF<2UM`>??2zVg2<8QCvhw^J}aUx-G7w+y3@NkiH)`A75?Q!Qgb zyYi{z!KGWoWYMoJ*_N_0-#Jva>>xD%KzZMmn(^Jth8t{_MqNpwv5GM9pjP{G;6N=- ztr1+OIV7pUOYGYWcac(NyA&3N+?LfwTc^BS_b|g~KQIBM%LZf|Xt<$z8HY#88;w=Q z$fHk~+43fpw%=}%a>KtTR)C4Yh87&Y23E>%?U7kH%Iz-Mn;j>cg&O={(gW)aAf*W3 zUJ1%TtB^sVDZUAjEA_F$!f8VFLSyc-br?IbtJbvUfO@&2WNP01{IuqmY*s)WC6$`Y z9|hm)Ki0+os-2d#(c--Qr*?>-AF0|S?p*E^FkbbSX4T+ z^E4Z&rt4Jz_-XVdZ95*2wB$rDVH>Z8XSa3XGR`RuL>3 zf}Ed7DjL--A=jOuYzz|^lIo0y$idCpdmeq8sdSCjBDuxqhp;gJfgxcEZR|t1S8 zdA+NVY(9NYXZ{Y|&T9GE3{;!3^c!s&jLBnpo;igTWys)S|HX2SN{%z8 zAjKKzG|a;7#r|8CG>aAkWr$UK=Wj;`Y)tjFP!)>|Ka)`JG5=K^p$4WpmfDerRSq{N zoA2M$LG?vH(-EtIF-Rum&xd{&Zd-y)4h{|u4h{|u#8UhZsT7MmR0;cB00000NkvXX Hu0mjfY`SH5 literal 0 HcmV?d00001