diff --git a/Homebox_QR_XXL_HB017_bis_HB032.pdf b/Homebox_QR_XXL_HB017_bis_HB032.pdf new file mode 100644 index 0000000..2d1e1d0 --- /dev/null +++ b/Homebox_QR_XXL_HB017_bis_HB032.pdf @@ -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 /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]:#&eTX8k2OAW7Krhc:H<$?PXLgA8cm1QFc@o$/C^nmerYW/M25[FTHu3YBN6,U[)DS:/[^"DTKT9=@+-H7H+.Z@!fGhmuk*OMPW+NA3&jqN*@I+f\P/#[fq:[Wq=fkto6qa_\1tYY8O#[JI9beE=hTk'81&P%BoB%^KnEAqm@\.oh4OPTO1><;Fl4U-t3Pld#o[jTd@7K?V@l2(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-ZVBA.>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@/]`3&r:*9&u5\,E\K/3Mel[8o8i#7sUL,\MFkP=REa@b;*fie(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?n"Z)CB%Z\!.dLb-5.6S2QTM)N)d4QPM>*eg[&aL-@WR_GWau*+rnL$;1h2Jr=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-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,*tY5NlrspB%jhoU?ABhQQ0jXiqVFA6endstream +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_gM0@@e/[8ra'M7u@?-XtgZ6E.n;*i`V]PnP8`Z)bk/MNPZU--sbMFe,3'^,'+',lIEEXnsX'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^#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=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&\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.)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,&qn%N3bHNPCn+/'%j9FXe$10K__pbI`rJrWA>E'-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*j5*,>9j^g=Hk7S70Y:HX>KW."t\Gaj^J=X\5&ZFKWpV[LI51#YS(@j_FfKH#V-Kf,-7ToLD*]4X@-/^4VA&O&QWWb8i3\,kM*5#$HL.b<2!XgH>/<;%O]TNT4,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"IV6Tj@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 +[] +% ReportLab generated PDF document -- digest (opensource) + +/Info 8 0 R +/Root 7 0 R +/Size 12 +>> +startxref +7589 +%%EOF diff --git a/generate_qr.py b/generate_qr.py new file mode 100644 index 0000000..6a36228 --- /dev/null +++ b/generate_qr.py @@ -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)