QR Code Generator
This commit is contained in:
99
Homebox_QR_XXL_HB017_bis_HB032.pdf
Normal file
99
Homebox_QR_XXL_HB017_bis_HB032.pdf
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
%PDF-1.4
|
||||||
|
%<25><><EFBFBD><EFBFBD> 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 /Times-Roman /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Courier-Bold /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:20260809103818+02'00') /Creator (anonymous) /Keywords () /ModDate (D:20260809103818+02'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||||
|
/Subject (unspecified) /Title (untitled) /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 3054
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gb"/l9on'f%#46B.su.8<4-OF[]]`.JYJL>HRjDWRfWU'+M%.5=$*`4e((=$POBcgR2>\7-C]94Od&8U:T2q=j[VH4rqi1fH[44krGCo\d+uD#@LB*Hqm$%\mdTPh%DS0Xo>`$8me$,6mga9J,u"9INcUQ-269.b]4'qk*nI`WlPNMp\U4?hpWMOO+[/#'T#3SuF7/T=6^mRN*rNj`:G"U!a"PRk@eY*B_[kk\lbfp(-ChgEria5E[6kc-@r$jT[QaZ!jU#A<_fU3`IehL2hj$\g:ORTfmb3H,?ZO^N9)%0`IQDr?Tik0?3"BASED#%LKg)\-l@p.AFc'rnL,dE#1>PU:HLVEG<(q\sIZY7sm8>sGE>`B=b$g[7H/:/2jY6DIl\HU^[:36:*%+5m`u%Pn!,.5NX4/'-A^$?(9$QI9Q<5-"-)T!]=Q5][O4Fs+4HE@Im.M&N!noNW@2`&c<6H9S14]:#&eTX8k2OAW7K<k#1BSaB,e0_5QYBVG_,[lS_<#T:SKe\D&mTl;N@qu37$lg%)I7lLOQ_"(+!S39U_'fmDH.Um]U"3Y+>rhc:H<$?PXLgA8cm1QFc@o$/C^nmerYW/M25[FTHu3YBN6,U[)DS:/[^"DTKT9=<F<*5,8$TFIKX>@+-H7H+.Z@!fGhmuk*OMPW+NA3&jqN*@I+f\P/#[fq:[Wq=fkto6qa<U"%ZYs=;1d>_\1tYY8O#[JI9beE<FQ#5AD8&Nd=D#XAT\j,3?m_`:A@/$$O_ek7I\C%Jkjm?<lHneq4Y\9\iTeB&K!g>=hTk'81&P%BoB%^KnEAqm@\.oh4OPTO1><;Fl4U-t3Pld#o[jTd@7K?V@l2<QdKbWuM#^dd^3o*IqBkZlGi<gfUragH<jbfLr+`s#pse<GaBmr]FG]*:%_f5l`KbA`,M6]!9B=m0f@r!R?5rmF%)p>(GQ;kbD\$J3I^A!;n6"dEI-$R&F2ER..ScVJcI6p@,l4Qh=".'/e&,4&N]l3"aLi9m6J=P4\m`C8M=lQ],^5)^Qb%$9#'/Q1^"R!F"L&Wo\^\ka.Gp(!o>$2>Wf=:Ajl<^"r2&H>#P'"_d.&"DC@pppFX;"/P3U&(&`bir?FOO!FBtN097WcPe;/,>TfhTRo@I./o#q=cB3pE\,UbpSRiIqj1[_EW38UHemMkpb1uJluRt3DS_pad\U[FM*2Gt,5+FkM:`KH-Z<r9HQr/Om)bWM'71qs7-r#X&rAa`HeL:LUl^KR]ob7Y+pHWt>VBA.>h@"lcSj*-!/tQgFHK6qIeZAan!9s\=3E$a8BQtF*Ub1`T,j_;!(r*dPA/;9'0HDhN*[e!7,[<>^_>WWM8[l.&Pn4Mn8"/XZGtMAkc(#o';)icHj]BC;2A"rIXDJV)#^,U`@t)DTI6YE"&:;a3TPNhW9'80B5gI@SuJNf+f/c':nB,t5-.BqaXLAREQBSk;^/,-:5PJR3@/]<jHN>`3&r:*9&u5\,E\K/3Mel[8o8i#7sUL,<!!INQ;lQNVuS#4Q66/m[8Z9\/WZql"Q62rM/Fa_M06.5Ssa.0?7UmZ-iAFBWb&I%d&5eDI^hp=%(WOec?1;ck_>\MFkP=REa@b;*fie<Eqkc%QSBi4_0#d9Rh=s1ejZ[`iC.3]`4BgjlY=UPfi*b!EaAAJ#I,o9?p&N+WKcDAOHa-Yl^%*?cc<Vmr"QCglYr(C"Q6k/!lh7>(I1W1&'uNRAW$j[]C]*]^Kop*N$5GZ*_XiE!C2s((BDO>pV_`s#^:\6Vpth9A=RJfV6XD"]dH-=fGe:/`5M/4=:8[8CRkIX/e*.l6riCfIh.[Njg?D5r:>nG@a,55k*KA(E`Oqc+>+J34ZWs<"YdWZ&jt)L$M1csV+r;h[@QXcb^a`=TQs4(rpJpn/dB>te7Xq'cfVW8:ORaVo[?77UAE7Vm@h-pkG<D'n_aXj=s1nYe;snjnj%`E'qhCAqV@M4h#\'3Q^IT<eKR-T_$F`*9i*dYX6:8_W`o+_o9(G_]%Q(3D4c=,M'-B*$BL\jqn9L`:r\Wm$Hq@G(N4&pLAe%3>?n"Z)CB%Z\!.dLb-5.6S2QTM)N)d4QPM>*eg[&aL-@WR_GWau*+rnL$;1h2Jr=<cVE'7)L.J(iBbZjO,*)4.HU*==$jiLK@AtF!_=QMV%G=#i\[BT+O@X3`S$gj76Oh]M80P.G3fo`P%t="k[EYW7]=M9B?[hm_%plDNakV-Og89LO(?)OW4+R7`NrlSXO3rs"Vi:[P',+@R:gXT-KLaZ*GF]o.i3?j"Id.,>JOf9:K]-hL#&6g#!/co/T`P`Ijh7W#4Fl&7J-nEU[eQ?"=%8#mG`8EfbU%MV!a_1j@S=P.ig(3>cc;TP":oK"i_IF_LcZ2mH5mO8SVT?>GOe-<E@9a@`18GC,jn(UWNk&Gh!%^V-Y3%DQ;I^"Is)#F27K7[U'mWj(LR9$k3Ne,H<`;I?_H]nKl-lho<hIg]$d)LGk1=Dr2h14A6U[2lPP1#!`'<T?Sh2i$d<Dl;ZrZt4RF)4,,Sm,rE1g#^^L\!3\0g_+4ruQ4ur2`>WN)A(&OK>qo`eCn[@@)W>3t#;o=o);-GgAfsRPPM1jnZ#Yu>!K*Y6bSg$9cG`(u)i@2WBKVqLh38l=';hV'm,E_I0iMeuX;oj=4oHGX_La?#X)gG8baPX('@(HIm!\dol]Me-e6l1HOo>4qOX35ZYFNI/as4q6W%]d:U%$3cZN7I*h\c=D[M..(9,)QOiZ.aES`2>4"T)p![!jmbm)8g5s-l-So=e*!KW,&$5VoW:0bDC["-1h%<5c3jV3%Vk:OW`3r5V0$HeVCZ#,XXl!ED%%IkCZl7`JPcR5qIUi"L/5A4cTf"=9Pl7@X4]++;R6oJlid1'#YuMe_"X_LiosFQ<]1,-]=Y,p,*tY5N<rD[1*E4F%Yh:JlbHOmIE"uAIi^V\<bb3k*o88X(l,^.YlJ!M?78@CMbr$nTJ$81L%bm[)'9%g$0#B_U5O75nM&s2f'JfL)"Fh[cgr>lrspB%jhoU?ABhQQ0jXiqVFA6<egu6bRWXC8!!pNCf`~>endstream
|
||||||
|
endobj
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3111
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gb"/l991&M'SZ;[.r#BQ0]dVjWj\%7#dFDBLKFRCMNgZRL;/eIH[HjA-_YtWWPmV@'L5#4F4tbbrN%[8qQ>mor:.OO^?N4q&)F_Pqp#`._lM'YDX&9lm_4$-r'#5?+7[\TF`=$9rU]=cLUZ+)k'l+*V$l>G[_\$\YkB[XgXc1;FAnPnp\sXL\&5h1J,6*TESET,TaQd&di=\K_&n(%e<31Kr$$TEn,A=Ho2GS]p#5XD'2IG3s3KZVg7e-:Z*hJJ>G(rOp^(gJ_gM<Jr8huAr[rXfnYpGfhq`UfoP4a.MthO8&&0*6k,DM0ridL"m/9%hbO#)0%9#31[r/P0]$^=^=kEIHlICe#[&+]"a7bFU.+Cln\+t/KZ;tq^4>0@@e/[8ra'M7u@?-XtgZ6E.n;*i`V]PnP8`Z)bk/MNPZU--sbMFe,3'^,'+',lIEEXnsX'<FrqQ-NSQZOIF?/sr,E=,(a;J3ZO+M3kK"Q0SRm)@"7!!8d*#!bLGEm65<o=RDQ.qp/ibMKBY7j+TQ\a3K[]Bi^a?1uA&liL^NACjcW&BXSjKubieX/=8r>MO/uUupP,;t'f2-(/>1P/K+G4m/(n(K+G]S"#.Lon^iu5YJ["Tp>HcTI$9:B][mE#3n.4ZKd>`?mGf\E^'W4U`Y`hMEe[G^#<cM$^k9MB1*)rIZbOWV@I+NAhEhLqT,Q^b;63m&S7^`;Lecn>p-m\+0O/i\_fa)![K6\9B)629BPT(!=i6,7E`EE"@u*^!OU;7$BXgus#4iE+HNPK;jk.Y']>4IU^YFU3h+m#,Za^`X%i@Oi?]qgk!l]dJX<@^hQFMog9kHQBpZuoGC\%u`8mdZSm282[7D/ZT,'kKQL#sc>5>C:%Ti'eHaE:-QUVTqpQe=GICG]lZKb(8abV2G39(#\;*lq**5F[mcq<+"d#sMC>))i5NCJG!IUQW6`nZWo:0rDV,[,`C+J<"#-gY"lZpi/%ZiT-K$/47;S6^Z(OR+IZAOCVe/OXd8gK!)MkX1uN]SLO'cqE-oTpID4Ta.qt"u\_>"u\_>2WFe>["6L]m,ikYa9]m?3Ek+&ItX+u7+).,AOXdk6Nq.(%fOEqfD9G4/\h\"]SJ7phQA.,#TtGLB\1D%nc-#FY9U%\K+a3CcK5b@,G,\M5[ng4&GsAKEAa2u$U1HC_jg(p+('KG&+eE/_s?aL`MZ8'Yn,,U^4oT*j!2fQ:JsbK*b>`\:o1e^Mpe=/d)rTuBG":njTM5^q5(j>>ssX9.FAo?Pct#dN00nPJ2*3gTB)9Y.t*e_W<:Xo9>m*u*EPk:4V:SDPE:/9q1L,f9#aF%IQbBm!8pI0mHn.TRV1t_-qfVl^6)Kq!%:D/'EC>=E#(%@9FlA;a`%60;pn9gX"sm],Qs-D<6Z6!#[BqdZ%W"D#op9L*^43(8Wm"cXPtkEqGj-_q0'`K%'bt3qY5Ejl8N>K7kBcF"H?uJ>k0,.fpdD8)#us6k>FoY`kLRKQ`3@tlrn[5C=eVA1=<B<TGsb>d]rsg<_9gR#:#mEpHYQG0*7pPK1fDEPJKCY.C'*[8BG#YrePSC/)t7*`n'Yj7-p,'54)#B")qrYd+Xg4!Gj%n/.%J4OYQKR@1j"L1ASnC7gc!o5f*[)Lfi3G#BnS'Xqatp;s<&G:*TcNmFjk,Ra7"Wd&KRCq.blfTN-su\]Bn4bn7=_+o24/5A4%ap>`\"r<,"aCuBjR>1KRSYoC$L&I/k'8:kr`.A7IQ[^e-A)^0J"^dnG]f+#@K8Ed0pKK'+&h.7Mt]THDe48^8fN#f2(>2GJ`#pA&<T;,n-%'\Y\cPtEEVWUZRkR$e/^$MZ[br&E^-!L\CTkRJI;b3#K>\9>Fq-X`a4hsL_jUK)3@gAJA^e#Q>Fe>6aJ?t0io1%$2G,\Ls-!K.R#NO*q2q-h`ju#If/N&hQQP3/(GsgSJ`"RtT&l0dEc81'j'8\(L:R:>knO2An`07&/8N`,[.cN=KGe.)<W@6&gf?.DRD;"D(/;<Rm7EP]pGj_56fXV.r,4KO^*rWGso\6J\?.VunbWbodkkaj<(Z;+8MJ/g'8;H"6*EH9)!DF\/LG_>P+``/Ld0Q0Q1t-Ul5r4+)"O/JB)dq1G.V[J8+Vq&b&%,(p>pZnef(a=rETYr?0NImi%5AUW,H[cme74;gg?RfR(2>)(G+K?ue4/6[Cs0a`D.M8D1:8EONJ6)BXqfPo/C[,rmX.tm7_u?+RjM5;IkBVjG(@gK<NGIif2M:cJ48<\SMi3fZe%T,#I=!p-@du$p9_dor%1H2FM$,,2:2D>,&<oQ,m8"X>qn%N3bHNPCn+/'%j9FXe$10K__pbI<J@#ebc[DAJCZG*:^b(0dLFe_]@YbHikuL3\2]>`rJrWA>E'<Bj\1:dnW7IX'@54V&Tm#0D3u4D)X,,78M6_L<HA;6GXsW@Ba-Wg&8-7Uh)-&Q1'i+/JPJ>-X67KmG`(3bHEGVP#I"A%&.OU;kXaq)VDl'RgW0>C;>oh[qf0t3Y:f,q*kKm,4J.)^>.cmhBe`Pol!i&E\ecX!L&(;($[lG9l:4ka,;W9Z6sE[/keL(V*j<J4"gCimFQ+=F4JeO*rGSe)@HIWY,&"bi2m<;e/4,OG.>5*,>9j^g=Hk7S70Y:HX>KW."t\Gaj^J=X\5&ZFKWpV[LI51#YS(@j_FfKH#V-Kf,-7ToLD*]4X@-/^4VA&O&QWWb<nartQsh0iXBZ0P>8i3\,kM*5#$<lZet<t:Q-Pq*&4pe!Kh5k,DA@M][h!gbecM6/OF-ipg_8U&bgK[*W5qf'B%>HL.b<2!XgH>/<;%O]TNT4<Zme9\M`B:Yi`L^?1i]Th^8NWj$YfC#-4,%*>,B/.Ft"eq]ks]okI6i"RI'K%2H6$,?"-/iZAW60aY&`^,eM>XJn,\>/s9M+llt+OZAW7[V@Q7AOmFRW23R=;>-^e_+M6H.BcR?o5QEC!?+R,pKbDk\&W(kG+5RE794m=knu09&i!`]6XQ7XMl#'QHCo5C"4$5s_9\G>7c,c?%%b=<\pP=3a[NG8%_Z8kY4_ic7&%aA=m-Q"IV<c.`W@l!-#&"S\;l7JSL`#'@\t,J))AER07?YT(JAfSO>6Tj@HpD.`L]7A>JuFS~>endstream
|
||||||
|
endobj
|
||||||
|
xref
|
||||||
|
0 12
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000061 00000 n
|
||||||
|
0000000112 00000 n
|
||||||
|
0000000219 00000 n
|
||||||
|
0000000328 00000 n
|
||||||
|
0000000438 00000 n
|
||||||
|
0000000642 00000 n
|
||||||
|
0000000846 00000 n
|
||||||
|
0000000914 00000 n
|
||||||
|
0000001175 00000 n
|
||||||
|
0000001240 00000 n
|
||||||
|
0000004386 00000 n
|
||||||
|
trailer
|
||||||
|
<<
|
||||||
|
/ID
|
||||||
|
[<e2e81b2a92592cdca7ce1cd41302784d><e2e81b2a92592cdca7ce1cd41302784d>]
|
||||||
|
% ReportLab generated PDF document -- digest (opensource)
|
||||||
|
|
||||||
|
/Info 8 0 R
|
||||||
|
/Root 7 0 R
|
||||||
|
/Size 12
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
7589
|
||||||
|
%%EOF
|
||||||
86
generate_qr.py
Normal file
86
generate_qr.py
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import sys
|
||||||
|
from reportlab.lib.pagesizes import A4
|
||||||
|
from reportlab.lib.units import mm
|
||||||
|
from reportlab.pdfgen import canvas
|
||||||
|
from reportlab.graphics.barcode import qr
|
||||||
|
from reportlab.graphics.shapes import Drawing
|
||||||
|
|
||||||
|
def generate_xxl_qr_pdf(start_num, count):
|
||||||
|
end_num = start_num + count - 1
|
||||||
|
filename = f"Homebox_QR_XXL_HB{start_num:03d}_bis_HB{end_num:03d}.pdf"
|
||||||
|
|
||||||
|
c = canvas.Canvas(filename, pagesize=A4)
|
||||||
|
page_width, page_height = A4
|
||||||
|
|
||||||
|
# Layout: 2 Spalten x 4 Zeilen = 8 Labels pro A4-Seite
|
||||||
|
cols, rows = 2, 4
|
||||||
|
col_width = page_width / cols
|
||||||
|
row_height = page_height / rows
|
||||||
|
|
||||||
|
current_num = start_num
|
||||||
|
|
||||||
|
for i in range(count):
|
||||||
|
page_idx = i % 8
|
||||||
|
if i > 0 and page_idx == 0:
|
||||||
|
c.showPage()
|
||||||
|
|
||||||
|
col = page_idx % cols
|
||||||
|
row = rows - 1 - (page_idx // cols)
|
||||||
|
|
||||||
|
x_center = col * col_width + (col_width / 2)
|
||||||
|
y_center = row * row_height + (row_height / 2)
|
||||||
|
|
||||||
|
code_str = f"HB-{current_num:03d}"
|
||||||
|
|
||||||
|
# Gestrichelte Schnittlinie
|
||||||
|
c.setDash(2, 2)
|
||||||
|
c.setStrokeColorRGB(0.6, 0.6, 0.6)
|
||||||
|
c.rect(col * col_width + 3*mm, row * row_height + 3*mm, col_width - 6*mm, row_height - 6*mm)
|
||||||
|
|
||||||
|
# QR-Code (50mm x 50mm XXL)
|
||||||
|
qr_size = 50 * mm
|
||||||
|
qr_widget = qr.QrCodeWidget(code_str)
|
||||||
|
bounds = qr_widget.getBounds()
|
||||||
|
w = bounds[2] - bounds[0]
|
||||||
|
h = bounds[3] - bounds[1]
|
||||||
|
|
||||||
|
d = Drawing(qr_size, qr_size, transform=[qr_size/w, 0, 0, qr_size/h, 0, 0])
|
||||||
|
d.add(qr_widget)
|
||||||
|
|
||||||
|
render_x = x_center - (qr_size / 2)
|
||||||
|
render_y = y_center - (qr_size / 2) + 2*mm
|
||||||
|
d.drawOn(c, render_x, render_y)
|
||||||
|
|
||||||
|
# Große Beschriftung darunter (Courier-Bold 16pt)
|
||||||
|
c.setFont("Courier-Bold", 16)
|
||||||
|
c.setFillColorRGB(0, 0, 0)
|
||||||
|
c.drawCentredString(x_center, render_y - 7*mm, code_str)
|
||||||
|
|
||||||
|
current_num += 1
|
||||||
|
|
||||||
|
c.save()
|
||||||
|
print(f"\n✅ PDF wurde erfolgreich erstellt: {filename}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Fall 1: Parameter wurden direkt im Befehl übergeben (z.B. python generate_qr.py 17 16)
|
||||||
|
if len(sys.argv) >= 3:
|
||||||
|
try:
|
||||||
|
start = int(sys.argv[1])
|
||||||
|
anzahl = int(sys.argv[2])
|
||||||
|
except ValueError:
|
||||||
|
print("❌ Fehler: Bitte gültige Zahlen angeben.")
|
||||||
|
sys.exit(1)
|
||||||
|
# Fall 2: Keine Parameter -> Interaktive Eingabe auffordern
|
||||||
|
else:
|
||||||
|
print("--- Homebox XXL Label Generierung ---")
|
||||||
|
try:
|
||||||
|
start_input = input("Startnummer eingeben (z. B. 17): ").strip()
|
||||||
|
start = int(start_input) if start_input else 1
|
||||||
|
|
||||||
|
anzahl_input = input("Anzahl Etiketten eingeben (z. B. 16): ").strip()
|
||||||
|
anzahl = int(anzahl_input) if anzahl_input else 16
|
||||||
|
except ValueError:
|
||||||
|
print("❌ Fehler: Bitte gültige Zahlen eingeben.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
generate_xxl_qr_pdf(start, anzahl)
|
||||||
Reference in New Issue
Block a user