From 132abcfd2d750fda447fbdf0bbf863dbd683ae2e Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Wed, 11 Mar 2026 19:11:16 +0100 Subject: [PATCH] Add IPng logo and address --- GENERATED_ipng.go | 9 +++++++ cmd/qrbill-api/api.go | 22 ++++++++--------- logo.svg | 57 +++++++++++++++++++++++++++++++++++++++++++ qrbill.go | 4 +-- qrcodegenerator.go | 2 +- 5 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 GENERATED_ipng.go create mode 100644 logo.svg diff --git a/GENERATED_ipng.go b/GENERATED_ipng.go new file mode 100644 index 0000000..91efe3b --- /dev/null +++ b/GENERATED_ipng.go @@ -0,0 +1,9 @@ +package qrbill + +// Table of contents +var ipng = map[string][]byte{ + "logo-inverted.png": ipng_0, + "logo.svg": ipng_1, +} +var ipng_0 = []byte("\x89PNG \n\n\x00\x00\x00 IHDR\x00\x00\x00\xa6\x00\x00\x00\xa6\x00\x00\x00\x00u㫫\x00\x00$iCCPICC profile\x00\x00(\x91\x9d\x90\xb1J\xc3P\x86\xbfT\xb1R*\x8a\x838dpq(\xb8\x98ɥ*A!\xc6\nV\xa74I\xb1\x98Đ\xa4\xdf\xc07ч\xe9 >\x82\xa0\xe0\xec\xa3\x83\x83Y\xbcp\xf8?\xe7\xfc\xff\xbdZv\xa6\xe5\xe2.\xa4YU\xb8~x9\xbc\xb2\xdbo\xb4Y\xa5K\x87\x9d ,\xf3\xbe\xe7\x9d\xd0x>_\xb1\x8c\xbe\xf4\x8cW\xf3ܟg)\x8a\xcbP:Wea^T`틝Y\x95V\xb1~;\xf0\xc5b;J\xb3H\xfc$ގ\xd2Ȱ\xd9\xf5\xd3d\xfex\x9a\xdbt\xe3\xec\xe2\xdc\xf4U[\xb8s\x8a\x87͈)*z\xd2L\x9d#\xf6\xa4.\xf7\x94\x84҄X\xbd\x99f*nD\xa5\x9c\\D\x91nӐ\xb7Y\xe7yJ\xc9c\"/\x93pG*O\x93\x87\xf9\xdf﵏\xb3z\xd3ژ\xe7AԭUk<\x86\xf7GX\xc2\xda3t\xae\xb2\x96\xbf\xadaƩg\xfe\xf9\xc6/֭P\\\x90\xdf\xe5\x00\x00\x00 pHYs\x00\x00.#\x00\x00.#x\xa5?v\x00\x00\x00tIME\xe6 \xa5P\x00\x00\x00tEXtComment\x00Created with GIMPW\x81\x00\x00 \xf2IDATx\xda\xed\x9byPTG\xc7o.\x98\xe1.\xe5\x90\xe10\"@YE\x91\xc0nD\xa3\xf1X\xb2[k\xc52\xacQ\x93T\xb9ƬU\x9b\xdaҤ\xacd\xb3\x89k\xb6j\xa3fS\xdebt=6\xab\xa8\xb8\\^A\xae\xa0\x81Q\xees9df\xe6x\xbd\x80\xc2\\og\x86\xa9\xad\xfe\xfe\xaf\xa7\xfb\xf5\xe7\xf5\xf5\xfb\xf5\xaf\xdf\xc0\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2\xc2¢;\xa4\x96\xc0\xed\xd9\xd2ngo\x8a\xb4\xaf\xdb\x95\x9fN \xc9\xfa\xb0B\x89\"\xab\xf3\x9c\x992\xe9\xfc B!D\xfe݉)n(Ѥ*\x9c\x97\xf2\xea J\xd4\xf9\x81\xb3R.(A\x89\xfb\x9d\x94\x92\xf6ߩ\xb6D\x88\xbc\xc0tN\xccχ\xd1t5\xfa9%\xe5;\"-JԻ\xda\xfa~\xb1er\xaeP;\xc1=\xde\xea{1\xecF\xb9\xe8\x93\xc5:m\xc0&\x9d\xaf\xc7?C\xba*\x9a\xfa\x99޳\xd7{\xc6!]߾\xa7ԣD\x85/\x9d\xd0O\x9bz\xa5\x95\xdbg2|\xd3?#j\n\x9e\xcc0\xa7\xa0!\x84\x9e\xac\x9c1İ\xb4\xbf\x9c\xae{J\xa2Dm\xefO\xe4\xf18уBHu5|F\xa6PtV|X\xac\x9b\x87\xb1\x9f\x83\xc2&\xfe\xbe\xbb,p\xa2\xf2\xa4M\xcf@_]-\xd6 *=\\\x00\xb0\xbbg*!\xd1\xe1\x94kKF\x91 \xc9\xfe\n\xfd\xe5%z\xba\xd3\xc1\x9d9\xd2䎅\xb3v\xb4s\xed\x82i6\x937˱M\xe9q\xbc\x99#Ř\xf6\xec\xba\xe6\xd8u\xf2\xe03d\x95j\xcc\x9c\xb6\xb1\xe9.\x9f\xfd\xce\xc3ʝ-\xd3qc\x93sp\x9d\xa7\xc1\x80\x89\xfd\xa4\x97\xdca\x98\xee\x87r\xdd 1\xf4<\xa8M]G\xcd\xc9V:\n\xd3\xe5`\x9aJeG\xb9\xe8\\;03\xf83\xe6Ij\xeb=\xf6\xbb\xeb\xe6\xee9\x00\x00\xdfB=\x85\xc4\xef;\xa85\xb7\xbe\xa1\x9b4\xd2p\xf9K\xd5Ŀ\xe2'\x82\xa9tR-F\x84\xaf\x8b\xd60v \xe6:)\xcf^\xfaJ\xf3\xfc\xa2\xf7Q\x00\x00T\x92\xc1'\xf2[\xb5\x89\xc4~ړ\xcc\x98onҡ\xd4t\x9d-\x9ev]\x94\xa0n\xaf\xa9o\xbc\x00\xe0\x99\xa7\xb5t\xa1QG\x8c\xcb%7\xd5:V\xbb\xec\x9d,;K\xda/\xdb6{\xe2b\xd6\xc7\"m\xe7D\xb5\xd7\x94\x99eڔ\xea\xd6}\x9eT\xf9_\xffװ\xee*\xb0?eF\xb96\xa5\xe6\xdefꧺ\xa7\xef\xe75ͳ7en\xb16\xa5\xf4D&e\xfe\x9c\xdb\xbcQ\xf9>;S\xee\xea֮U^@\xd5\xaa4\xe83_\xf7\xb1'${K\x9b\xceF\xe7d u\x89/\xa4x\xc9Gv\xa4\xf4<Ѫ3ſ\xf3\xa5.\x91\xd3l\xd8\x91e\xd9v\xa3\\zNǿ\x94]4a\xbbY\x97\xd5F\xec\xa5\xe6v\x96} \xddv\xde\xd7].ϛhK\xc82j\xd75>r\xb5e\xcc?$\xba[\xb1S\x94\xf0\xad\x9a\xc2\xe9*\xf0\xb75$\xb1\xf5\xban\xc3HO\xf1M\xfb\x81z\xcby\xccƜ\xbf89\xa0W\xc7i3\xe2\xab\x9eRrJ\x8f\xd82F;O\x8dJ\xb7\x86޳fQ\xe8\xa3\xe2\xfd\x86o+Ȁ\xdd\xf7\xfb\xf5C\xfbg\x9bW:\xfbp\xad\x82\x8a\xd3V\xed\x99_$џ\xa5\x9d\xbb̿A\xe2(&\x92\xf4\xa8 8\x85;\n%\xfaq6i\xf9*\x8b\xee\xb2\xec6\xa7\xec\xfc\xcb\xce#\xe1g r}H\xb2㘥\xe1\xf4-2\x8a~\xfa\xc3\xcbx\xef\xc4\xda\xf99\xd1l\xfd n{I\xd1K\x9fW! \xa1شol\xbelmCzm?\xd5j\xa0 \xc8\xce\xefV[q\xf4\xccl\xa0\\>Xy\x9a\xb2\xf9Z\xaf\xbe\xff\xa5\xac/\xd8`\xdd͔˧h\x8d5\x9d\x9e\xb0~Y\xb8\xfer\xa6\xe9\xbd_u\xbd\x99\x8f\xc6Hf\xf9\xf3\x00\x80\xf5\xa1\x8bp\xcd\x8b1s\xdeHptIi_I\xdd7f3\xb22\xd2#\xb9^\xbet\x82\x80K\xd4!1Z\xaa\xf0\x91\x85۱\xc3\xd5zCr\xac\xa5\xec\xe4VK\xec\xff\x96\xa3\xed\xd3\xd6Zr\xa0]l*\x9el\xd9Ns\xd5\xf1V]\xab\xa8\xe8\xbc\xf9\xd9\xef9\x96\xdcdޑ~K\xe3\x9ddy\x9c\xf9\x9d\x9e\xb11k\xd6\xf4\xc0\xa3J&V\xfd\xf4\xf8\xf1I\xcb\xfac\xc1\xbe\xe5,\x8b\xfd\xaf\xb9o=0s\xf1\xb6\xd4Y\xd3ҟI;k\xdaھ\xb7|R\xafKaY^\xc8;\xe7l\x8d9\x98q\xb9\xb9\xf1\xcfo?\xa6\xebnn\xad\xbe#\xb6f\xe9I\xfe\x955\x87\x92D\xe4\x9b\xe6`n{=ɇ\x00\x00y&nh\xedm\xb9a\xb5\x81\xe5\xd7v\x84ҙޤ\xab\xbbE\xc5\\s[\xbeՇ׾|-/\x9bO\x00H]\xcd\xcd\xf5\x8d5/믤\xb0eI\x82qf \xc8\xf6\xf6RҹfR_\xfbs5%&\xb1#o\x9e|p\xac\xb5\xaeIZl\xbc\xf2w_\xa9J\xe4\xf9\xb8\xb9s9\xd4&q\xecػ\x883\xf8\x8f\xa1\xb5\x92\xbb\xec\x86\x88a\xadd\xc4}~\x84q\xd6\xfe\xe3R`n\xac)rD\xb8\x829yD\x8a\xbb\x80\xf47\xe2\xfc|\xf0\xe5\xd84\xb9͈V\xabT)QR(H\xbfD\x8eF\xad\xd1hH\x92D\x00\x82F\xa3\xd1\xe9t\xbd\xaeo\x94\xcd&Q%\x8b)\xab68\xe1\xe5D\xbe\" d:$\xa8ɯ\xb2\x93\xc8T\x8dfy\x8ezE\xc9C\x99>\xea@\x8dF\xc3q3]J:Fg(\x87Ճ\xed\x9cF\xfb\ne\xfd\xba\xb7 \xb1L\xddt\xd5\xe9\xfcq31\x97yJ]V\xcb\xe3\xc6B\xf9j6ѭ5c\x88TIh\x8d\xa4\xc8O\xd4ȸ\xa2\xbf\xa0\xe7\xf1\xd3f\xeb\xacZ\xc3_\xed5\x81\xb9N\xe9K\xcc\xf6粂hJO\xdb\xdbH\xe9IoS_˕1\x9d~\x9b\x98\xe1\xabզ\x8f\xf3\x8b\x8d`\xbae&\xab\x84\\\xd7P\xba\xaf\x86c\xc7\xf7\xc4*\xf1i\xfd]\xc6\xb4\x93\xdfH\x8a\x8e\xe1M\xed\xd9T\x87v\xc1\xe4\xecq\x8d\x8b\xf2\xd5x8b\xae\x8f\xd2%C\xa2\x86\xaaB\xad\xc4\xc9\xf3\xe7\x85<\x8fz5\xee=c\xb4\xd3y\xcb]\xd2\xe8^,\xb9_\xa0JE\x82\xb7]_=F\xb2\xce\xe6\xfam\xb7+kEB$\xd7 \x00@}t\x8b\xe9)\x94\xee6JϕxΏ\xee.,\xbb509*i\xd5QOO[\x92\xb1(2\x98P\xbf\xbc\xdf\xfcI&\xcb清\xf8\xc8y4\xb0\xc7k\xccꡎ\xab\x8f\xbe\x9f~쟗\xbc \xd8U\xb6\xffS˗\xf7$\\\xda\xeb)\xf4`\xfb\x9b_H4\xa6\xe6\xbb\xcd\xcfT=㏛jK;\xfe9 \xe7\xfa\x9b\xb5V\x88\x9d\xca\x8a\xe2{p\xccZ\xa9z\xbakD\xff\xae\x80=Nj\xe9G\xa3\xa8 )\x87\xee\xde9.\x99^U\xc2\xc8k1'\x9eI\xa6\xba\xfa\xb2\x83\xe8&\x8b\x93}m?\xf6]\xad\x87`z\xa4\xbb\x84\xb2\x8cA\x9dMO\xd4޳Z?ؼ\\#\xf0\xf23\x89\xaa\xab4\x97\xca\xdcY\x81\xf3Ã\\\x8cf\x96\x95\xd7t\xd9\x00\x80\xee\xbf\xde7.\xcaݗ0e d#\xaf߮\x00`l\xa6\xc4x\xbaCE\x83u\xb7.\xd6\xd9sB|#R\xfc\xd9&r=\xedn\xa9.\xbb5\xb9}&\xc5x{\xb4\xc1\xb6\x8a\xe2\xf3v\xc0\x00\xc6\xdb!\xa9w\xf3J\xdeW\xf5SA\xebd\xf0-9^hlj\xfa\xefV~fL\x00\x80\xcc\xd9\xe9\x81|/\xca;\xa2\xbe\xb6\x92\x8aOF\xd1~\x99. 0\x9c]\xd3R\xb1\xab\xcf>\x98\x00\x00k\xe2E\xfbQT\xd9h\xc7͢\xd2\xc9\xc8VN\xdaB\x81\x94\xf1G\xf7\xae_\x00\xfba\xc0\xea\xd7\xe2\xb8<\xca,\xc3=\xa5%\xcfG߲\xdc\xe4p\x9e\xf6\x83 \xb6\x97\x9e\xac\xb1\xcb\xd8\xd4֒\xa5\x8b\xa3x\x94\xbe\xb2\xab\xef\xca\xed\xf2ɋ\xad1\xe9©&\xa9\n\n\n\n \n \n \n \n \n \n \n \n\n") diff --git a/cmd/qrbill-api/api.go b/cmd/qrbill-api/api.go index 8179fce..b667df0 100644 --- a/cmd/qrbill-api/api.go +++ b/cmd/qrbill-api/api.go @@ -46,11 +46,11 @@ func qrchFromRequest(r *http.Request) *qrbill.QRCH { IBAN: ifEmpty(r.Form, "criban", "CH0209000000870913543"), Cdtr: qrbill.Address{ AdrTp: qrbill.AddressType(ifEmpty(r.Form, "craddrtype", string(qrbill.AddressTypeStructured))), - Name: ifEmpty(r.Form, "crname", "Legalize it"), - StrtNmOrAdrLine1: ifEmpty(r.Form, "craddr1", "Quellenstrasse"), - BldgNbOrAdrLine2: ifEmpty(r.Form, "craddr2", "25"), - PstCd: ifEmpty(r.Form, "crpost", "8005"), - TwnNm: ifEmpty(r.Form, "crcity", "Zürich"), + Name: ifEmpty(r.Form, "crname", "IPng Networks GmbH"), + StrtNmOrAdrLine1: ifEmpty(r.Form, "craddr1", "Im Bungert"), + BldgNbOrAdrLine2: ifEmpty(r.Form, "craddr2", "14"), + PstCd: ifEmpty(r.Form, "crpost", "8306"), + TwnNm: ifEmpty(r.Form, "crcity", "Brüttisellen"), Ctry: ifEmpty(r.Form, "crcountry", "CH"), }, }, @@ -60,18 +60,18 @@ func qrchFromRequest(r *http.Request) *qrbill.QRCH { }, UltmtDbtr: qrbill.Address{ AdrTp: qrbill.AddressType(ifEmpty(r.Form, "udaddrtype", string(qrbill.AddressTypeStructured))), - Name: ifEmpty(r.Form, "udname", "Michael Stapelberg"), - StrtNmOrAdrLine1: ifEmpty(r.Form, "udaddr1", "Stauffacherstr"), - BldgNbOrAdrLine2: ifEmpty(r.Form, "udaddr2", "42"), - PstCd: ifEmpty(r.Form, "udpost", "8004"), - TwnNm: ifEmpty(r.Form, "udcity", "Zürich"), + Name: ifEmpty(r.Form, "udname", "IPng Networks GmbH"), + StrtNmOrAdrLine1: ifEmpty(r.Form, "udaddr1", "Im Bungert"), + BldgNbOrAdrLine2: ifEmpty(r.Form, "udaddr2", "14"), + PstCd: ifEmpty(r.Form, "udpost", "8306"), + TwnNm: ifEmpty(r.Form, "udcity", "Brüttisellen"), Ctry: ifEmpty(r.Form, "udcountry", "CH"), }, RmtInf: qrbill.QRCHRmtInf{ Tp: "NON", // Reference type Ref: "", // Reference AddInf: qrbill.QRCHRmtInfAddInf{ - Ustrd: ifEmpty(r.Form, "message", "Spende 420"), + Ustrd: ifEmpty(r.Form, "message", "IPng Networks GmbH invoice"), }, }, } diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..62f7495 --- /dev/null +++ b/logo.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + diff --git a/qrbill.go b/qrbill.go index 957bc8f..07bc6a8 100644 --- a/qrbill.go +++ b/qrbill.go @@ -318,8 +318,8 @@ func (b *Bill) EncodeToSVG() ([]byte, error) { return nil, err } - // overlay the swiss cross - cross := swisscross["swisscross.svg"] + // overlay the IPng Logo + cross := ipng["logo.svg"] // Remove XML document header, we embed the element: cross = bytes.ReplaceAll(cross, []byte(``), nil) // Overwrite position and size of the embedded element: diff --git a/qrcodegenerator.go b/qrcodegenerator.go index a2b2de8..9d3b51f 100644 --- a/qrcodegenerator.go +++ b/qrcodegenerator.go @@ -78,7 +78,7 @@ func generateQrCodeImage(payload string) (image.Image, error) { } func overlayWithSwissCross(qrCodeImage image.Image) (image.Image, error) { - b := swisscross["third_party/swiss-cross/CH-Kreuz_7mm/CH-Kreuz_7mm.png"] + b := ipng["logo-inverted.png"] swissCrossImage, _, err := image.Decode(bytes.NewReader(b)) if err != nil { return nil, err